{"$schema":"https://raw.githubusercontent.com/microsoft/vscode-html-languageservice/main/docs/customData.schema.json","version":1.1,"tags":[{"name":"ids-about","attributes":[{"name":"aria-label-content","description":"Used for ARIA Labels and other content","values":[]},{"name":"app-name","description":"Set the app name property","values":[]},{"name":"product-name","description":"Set the product name property","values":[]},{"name":"product-version","description":"Set the product version property","values":[]},{"name":"device-specs","description":"Sets whether or not to display device information.","values":[]},{"name":"copyright-year","description":"Set the copyright year property","values":[]},{"name":"use-default-copyright","description":"Sets whether or not to display Legal Approved Infor Copyright Text","values":[]}],"description":{"kind":"markdown","value":"# ids-about\n\nProvides information about a product with copyright and browser information.\n\nids-about builds on top of the [ids-modal](../ids-modal/README.md)\n\n## Settings (Attributes)\n\n- `product-name` {string} product name information to display\n- `product-version` {string} semantic product version number\n- `copyright-year` {string} the year displayed in the copyright, defaults to current year\n- `use-default-copyright` {boolean} whether or not to display legal approved Infor copyright text\n- `device-specs` {boolean} whether or not to display device / browser information\n\n## Slots\n\n- `slot=\"icon\"` - appears at the top of the modal, centered\n- `slot=\"appName\"` - appears at the top of the modal, below icon, centered\n- `slot=\"content\"` - additional content appears below product name/version, about copyright\n\n## Features (With Code Examples)\n\nExample with application name, product name, product version and logo:\n\n```html\n<ids-about id=\"about-example\" product-name=\"Product\" product-version=\"4.0.0\">\n  <ids-icon slot=\"icon\" icon=\"logo\" viewbox=\"0 0 35 34\" size=\"xxl\" /></ids-icon>\n  <ids-text id=\"about-example-name\" slot=\"appName\" type=\"h1\" font-size=\"24\" font-weight=\"semi-bold\">Application Name</ids-text>\n  <ids-text id=\"about-example-content\" slot=\"content\" type=\"p\">Additional content</ids-text>\n</ids-about>\n```\n\nExample with only copyright text and browser/device information:\n\n```html\n<ids-about id=\"about-example\">\n</ids-about>\n```\n\nExample with custom copyright year, no application name or product information:\n\n```html\n<ids-about id=\"about-example\" copyright-year=\"2020\">\n</ids-about>\n```\n\nExample with no copyright info and no device information, but with product name/version:\n\n```html\n<ids-about\n  id=\"about-example\"\n  device-specs=\"false\"\n  use-default-copyright=\"false\"\n  product-name=\"Product\"\n  product-version=\"4.0.0\"\n>\n  <ids-text id=\"about-example-name\" slot=\"appName\" type=\"h1\" font-size=\"24\" font-weight=\"semi-bold\">Application Name</ids-text>\n</ids-about>\n```\n\nThe component can be controlled with JavaScript:\n\n```js\nconst about = document.querySelector('#about-example');\n\nabout.productVersion = 'Changed version';\nabout.productName = 'Changed product';\nabout.copyrightYear = '2020';\nabout.deviceSpecs = false;\nabout.useDefaultCopyright = false;\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Replace `.inforAboutDialog()` with `.about()` and notice that many of the names of the settings (e.g. productName to appName) to have changed so must be updated to the new settings.\n\n**4.x to 5.x**\n- About now uses all new markup and classes for web components (see above)\n- Cookies and full OS information (like version) has been removed to adhere to more modern browser standards and lack of availability of these features in modern browsers.\n- The `version` has been renamed to `productVersion`\n- The `close` method has been removed use `$('ids-about').visible = false` instead\n- The `destroy` method has been removed since everything is now cleaned up when removing the DOM element\n- The `close/open` events have been named to `show/hide`\n"}},{"name":"ids-action-sheet","attributes":[{"name":"overlay","values":[]},{"name":"cancel-btn","values":[]},{"name":"visible","description":"Set the visible attribute","values":[]},{"name":"cancel-btn-text","description":"Set the btn text attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-action-sheet\n\n## Description\n\nThe IDS Action Sheet `ids-action-sheet` component displays a mobile-friendly view of a menu, which appears to roll out from the bottom of the viewport and can easily be selected by touch.\n\n## Use Cases\n\nThe main use case for the IDS Action Sheet component is to display a mobile-friendly menu. By default the action sheet only show on screens at the `sm` (600px) breakpoint. This could be expanded in the future or possibly disabled to allow for the action sheet to show on desktop screens.\n\n## Terminology\n\n- **ids-action-sheet**: The action sheet container. Consists of an `ids-overlay` and an unnamed `slot` which will contain the menu.\n- **cancel-button**: The cancel button will close the action sheet. The default text of the button is \"Cancel\", but can be override with the `cancelBtnText` attribute.\n\n## Features (With Code Examples)\n\n```html\n<ids-action-sheet id=\"icon-menu\">\n    <ids-menu>\n        <ids-menu-group>\n            <ids-menu-item text-align=\"center\">Option One</ids-menu-item>\n            <ids-menu-item text-align=\"center\">Option Two</ids-menu-item>\n            <ids-menu-item text-align=\"center\">Option Three</ids-menu-item>\n        </ids-menu-group>\n    </ids-menu>\n</ids-action-sheet>\n```\n\n## States and Variations\n\n- **visible**: The state where the action sheet is visible. Can be set by the `visible` attribute.\n\n## Keyboard Guidelines\n\n- **Enter or Space**: The menu items as well as the cancel btn are actionable via the `Enter` and `Space` keys\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n- Action Sheet now uses all new markup and classes for web components (see above)\n- Now called IdsActionSheet with a namespace\n- The tray feature has not been added it is now replaced by a floating action button.\n"}},{"name":"ids-accordion-common","description":{"kind":"markdown","value":"# ids-accordion\n\n## Description\n\nThe IDS Accordion component is a UI pattern that is comprised of a stacked list of elements. A basic accordion will consist of a `ids-accordion-header` which shows a title or summary of the `ids-accordion-panel` and acts as a control for expanding and collapsing. Note: Standalone Css is not available for this component.\n\n## Use Cases\n\n- Can be used to conserve space, by hiding information until needed. Accordions can be commonly seen on mobile sites and applications. It can help tell the user what the page is about and allows the user to select and see what is needed.\n- Can be used for navigation.  The accordion is the main interactive element inside of the [App Menu](../ids-app-menu/README.md)\n\n## Terminology\n\n- **ids-accordion** Parent container for all accordions\n- **ids-accordion-panel** First child of and accordion. Contains the header and content area. Contains 2 slots, the `header` and the `pane`.\n- **ids-accordion-header** Typically used in the header slot, contains the title and acts as the control for expanding and collapsing.\n\n## Features (With Code Examples)\n\nStandard accordion, most commonly used:\n\n```html\n<ids-accordion>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Warehouse Location</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain, deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Sort By</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Brand Name</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Material</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n### Nested Accordions\n\nIt's possible to nest accordion structures.  This is common in accordions used for navigation purposes, such as the ones applied to the [App Menu](../ids-app-menu/README.md).\n\nIn the example below, the \"My Benefits\", \"Dependents and Beneficiaries\", \"Life Events\", and \"Benefits Information\" panels are nested beneath the \"Benefits\" panel, which is nested beneath the \"Employee\" panel.\n\n```html\n<ids-accordion id=\"app-menu-style\">\n    <ids-accordion-panel id=\"employee\">\n        <ids-accordion-header slot=\"header\">\n            <ids-icon icon=\"user\" size=\"medium\"></ids-icon>\n            <ids-text font-size=\"20\">Employee</ids-text>\n        </ids-accordion-header>\n        <ids-accordion-panel slot=\"content\" id=\"benefits\">\n            <ids-accordion-header slot=\"header\" expander-type=\"plus-minus\">\n                <ids-text font-size=\"20\">Benefits</ids-text>\n            </ids-accordion-header>\n            <ids-accordion-panel slot=\"content\" id=\"my-benefits\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">My Benefits</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"dependents-beneficiaries\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Dependents and Beneficiaries</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"life-events\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Life Events</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"benefits-information\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Benefits Information</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n        </ids-accordion-panel>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n## Class Hierarchy\n\n- IdsAccordion\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n- IdsAccordionHeader\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n- IdsAccordionPanel\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n  IdsEventsMixin\n\n## Settings (Attributes)\n\nWhen used as an attribute the settings are kebab case, when used in the JS they are camel case.\n\n### IdsAccordion\n\n- `headers` {Array<IdsAccordionHeader>} Reference to all inner Accordion Headers.\n- `panels` {Array<IdsAccordionPanel>} Reference to all inner Accordion Panels.\n- `focused` {HTMLElement} Reference to the currently-focused element within the accordion, if applicable.\n- `allowOnePane` {boolean} Sets Accordion to allow only one inner Accordion Panel to be expanded at a time.\n- `keepExpanderPlacement` {boolean} Sets the Accordion to display sub-level expander icons as carets.\n- `closeChildren` {boolean} When true, Children will be collapsed when their parent has been collapsed.\n- `borderless` {boolean} When set to `true`, removes borders from headers when expanded (root level) or always (nested levels). Can also be set on individual headers.\n- `hidden` {boolean} Hides the element from display.\n- `toggleOnIcon` {boolean} When set to `true`, restricts toggle behavior to only occur when clicking the expander icon, not the entire header area. This is useful when you need custom selection logic on the header without conflicting with the toggle behavior.\n\n### IdsAccordionHeader\n\n- `borderless` {boolean} When set to `true`, removes the bottom border from the header when expanded (root level) or always (nested). Default is `false` (border is shown).\n- `disabled` {boolean} When set to `true`, disables the header interaction.\n- `expanded` {boolean} Reflects whether the associated panel is expanded.\n- `expanderType` {string} Type of expander icon to use (`'caret'` or `'plus-minus'`).\n- `headerFill` {boolean} When set to `true`, adds a background fill to the header.\n- `hidden` {boolean} Hides the element from display.\n- `icon` {string} Icon to display in the header.\n- `selected` {boolean} When set to `true`, marks the header as selected.\n\n### IdsAccordionPanel\n\n- `hidden` {boolean} Hides the element from display.\n- `iconAlign` {string} Position of the caret icon (`'start'` or `'end'`). Default is `'end'`.\n\n### IdsAccordionSection\n\n- `hidden` {boolean} Hides the element from display.\n\n## Events\n\n- `selected` Fire at the time the ids-accordion-panel element is selected, used for App-Menu. Detail contains the element `elem`\n- `beforeexpanded` Fires on the ids-accordion-header before the panel begins to expand. Useful for performing actions before the animation starts.\n- `expanded` Fires on the ids-accordion-header immediately when the panel state changes to expanded. Detail contains the element `elem`\n- `afterexpanded` Fires on the ids-accordion-header after the expand animation completes. Useful for performing actions after the animation finishes.\n- `beforecollapsed` Fires on the ids-accordion-header before the panel begins to collapse. Useful for performing actions before the animation starts.\n- `collapsed` Fires on the ids-accordion-header immediately when the panel state changes to collapsed. Detail contains the element `elem`\n- `aftercollapsed` Fires on the ids-accordion-header after the collapse animation completes. Useful for performing actions after the animation finishes.\n\n### Event Examples\n\nListen for expand/collapse events on the accordion:\n\n```javascript\nconst accordion = document.querySelector('ids-accordion');\n\n// Fires before animation starts\naccordion.addEventListener('beforeexpanded', (e) => {\n  console.log('Panel expanding:', e.target.id);\n});\n\n// Fires immediately when state changes\naccordion.addEventListener('expanded', (e) => {\n  console.log('Panel expanded:', e.target.id);\n});\n\n// Fires after animation completes\naccordion.addEventListener('afterexpanded', (e) => {\n  console.log('Expand animation complete:', e.target.id);\n});\n\n// Similar events for collapse\naccordion.addEventListener('beforecollapsed', (e) => {\n  console.log('Panel collapsing:', e.target.id);\n});\n\naccordion.addEventListener('collapsed', (e) => {\n  console.log('Panel collapsed:', e.target.id);\n});\n\naccordion.addEventListener('aftercollapsed', (e) => {\n  console.log('Collapse animation complete:', e.target.id);\n});\n```\n\n## Methods\n\n- IdsAccordion\n  - `navigate` Navigate to the next/prev panel\n- IdsAccordionPanel\n  - `collapsePane` Collapse pane\n  - `expandPane` Expand pane\n  - `select` Select header and focus it\n  - `focus` Set focus on header\n\n## Themeable Parts\n\n- `accordion` Accordion root element\n\n## States and Variations\n\nThe Accordion's headers support the following states:\n\n- Normal/Default: This is the default of an accordion.\n- Hover: Roll over an interactive element inside the accordion\n- Disabled: Disabled elements can be inside an accordion. These cards cannot be clicked, hovered or focused.\n- Focus: For accessibility. To give a user guidance when using a screen reader.\n- Active/Selected: After the pressed/clicked state, users are taken to the active state. This includes expanding or closing an accordion.\n\n## Keyboard Guidelines\n\n- **Shift+Tab**: Works the same as Tab, but in the opposite direction. When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion Header or Tab page. When focus reaches the last header/tab page, further key presses will have optionally wrap to the first header\n- **Up Arrow or Left Arrow**: When focus is on the tab or accordion header, a press of up/left will move focus to the previous logical accordion header or tab page. When focus reaches the first header/tab page, further key presses will optionally wrap to the last header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Down Arrow or Right Arrow**: When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion header or tab page. When focus reaches the last header/tab page, further key presses will optionally wrap to the first header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Enter or Space**: When focus is on an accordion header, this keystroke toggles the expansion of the corresponding panel. If collapsed, the panel is expanded, and its aria-expanded state is set to true. If expanded, the panel is collapsed and its aria-expanded state is set to false.\n\n## Accessibility\n\nThe IDS Accordion component has a `role=\"region\"` and a unique `title` is generated for each instance.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Replace `.inforAboutDialog()` with `.about()` and notice that many of the names of the settings (e.g. productName to appName) to have changed so must be updated to the new settings.\n- The initial markup is changed considerably from the previous version. Sync the markup using the markup above\n- Initialize the accordion plugin with .accordion() as opposed to `.inforAccordion()` or by using the page initializer\nonExpanded and onCollapsed option are done with events (expanded and collapsed)\n\n**4.x to 5.x**\n- Accordion now uses all new markup and classes for web components (see above)\n- Now called IdsAccordion with a namespace\n- The \"Panels\" examples are removed and deprecated as they should rarely be used.\n- The deprecated `displayChevron` setting is removed.\n- The `enableTooltips` removed and deprecated as not added as it seems no longer relevant.\n- The `expanderDisplay` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed.\n- The `rerouteOnLinkClick` option was removed and deprecated as is no longer needed as there are no links in the markup now.\n- The `source` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed in accordion but will be added to IdsAppMenu.\n- The `destroy` method has been removed since everything is now cleaned up when removing the DOM element\n"}},{"name":"ids-accordion-header","attributes":[{"name":"depth","values":[]},{"name":"color-variants","values":[]},{"name":"parent-has-icon","values":[]},{"name":"siblings-can-expand","values":[]},{"name":"text-node","values":[]},{"name":"panel","values":[]},{"name":"expanded","values":[]},{"name":"expander-type","values":[]},{"name":"icon","values":[]},{"name":"selected","values":[]},{"name":"accordion","values":[]},{"name":"hidden-by-filter","values":[]},{"name":"child-filter-match","values":[]},{"name":"disabled","description":"Sets disabled property","values":[]},{"name":"header-fill","description":"Gets header fill property","values":[]},{"name":"borderless","description":"Gets borderless property","values":[]}],"description":{"kind":"markdown","value":"# ids-accordion\n\n## Description\n\nThe IDS Accordion component is a UI pattern that is comprised of a stacked list of elements. A basic accordion will consist of a `ids-accordion-header` which shows a title or summary of the `ids-accordion-panel` and acts as a control for expanding and collapsing. Note: Standalone Css is not available for this component.\n\n## Use Cases\n\n- Can be used to conserve space, by hiding information until needed. Accordions can be commonly seen on mobile sites and applications. It can help tell the user what the page is about and allows the user to select and see what is needed.\n- Can be used for navigation.  The accordion is the main interactive element inside of the [App Menu](../ids-app-menu/README.md)\n\n## Terminology\n\n- **ids-accordion** Parent container for all accordions\n- **ids-accordion-panel** First child of and accordion. Contains the header and content area. Contains 2 slots, the `header` and the `pane`.\n- **ids-accordion-header** Typically used in the header slot, contains the title and acts as the control for expanding and collapsing.\n\n## Features (With Code Examples)\n\nStandard accordion, most commonly used:\n\n```html\n<ids-accordion>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Warehouse Location</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain, deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Sort By</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Brand Name</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Material</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n### Nested Accordions\n\nIt's possible to nest accordion structures.  This is common in accordions used for navigation purposes, such as the ones applied to the [App Menu](../ids-app-menu/README.md).\n\nIn the example below, the \"My Benefits\", \"Dependents and Beneficiaries\", \"Life Events\", and \"Benefits Information\" panels are nested beneath the \"Benefits\" panel, which is nested beneath the \"Employee\" panel.\n\n```html\n<ids-accordion id=\"app-menu-style\">\n    <ids-accordion-panel id=\"employee\">\n        <ids-accordion-header slot=\"header\">\n            <ids-icon icon=\"user\" size=\"medium\"></ids-icon>\n            <ids-text font-size=\"20\">Employee</ids-text>\n        </ids-accordion-header>\n        <ids-accordion-panel slot=\"content\" id=\"benefits\">\n            <ids-accordion-header slot=\"header\" expander-type=\"plus-minus\">\n                <ids-text font-size=\"20\">Benefits</ids-text>\n            </ids-accordion-header>\n            <ids-accordion-panel slot=\"content\" id=\"my-benefits\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">My Benefits</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"dependents-beneficiaries\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Dependents and Beneficiaries</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"life-events\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Life Events</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"benefits-information\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Benefits Information</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n        </ids-accordion-panel>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n## Class Hierarchy\n\n- IdsAccordion\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n- IdsAccordionHeader\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n- IdsAccordionPanel\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n  IdsEventsMixin\n\n## Settings (Attributes)\n\nWhen used as an attribute the settings are kebab case, when used in the JS they are camel case.\n\n### IdsAccordion\n\n- `headers` {Array<IdsAccordionHeader>} Reference to all inner Accordion Headers.\n- `panels` {Array<IdsAccordionPanel>} Reference to all inner Accordion Panels.\n- `focused` {HTMLElement} Reference to the currently-focused element within the accordion, if applicable.\n- `allowOnePane` {boolean} Sets Accordion to allow only one inner Accordion Panel to be expanded at a time.\n- `keepExpanderPlacement` {boolean} Sets the Accordion to display sub-level expander icons as carets.\n- `closeChildren` {boolean} When true, Children will be collapsed when their parent has been collapsed.\n- `borderless` {boolean} When set to `true`, removes borders from headers when expanded (root level) or always (nested levels). Can also be set on individual headers.\n- `hidden` {boolean} Hides the element from display.\n- `toggleOnIcon` {boolean} When set to `true`, restricts toggle behavior to only occur when clicking the expander icon, not the entire header area. This is useful when you need custom selection logic on the header without conflicting with the toggle behavior.\n\n### IdsAccordionHeader\n\n- `borderless` {boolean} When set to `true`, removes the bottom border from the header when expanded (root level) or always (nested). Default is `false` (border is shown).\n- `disabled` {boolean} When set to `true`, disables the header interaction.\n- `expanded` {boolean} Reflects whether the associated panel is expanded.\n- `expanderType` {string} Type of expander icon to use (`'caret'` or `'plus-minus'`).\n- `headerFill` {boolean} When set to `true`, adds a background fill to the header.\n- `hidden` {boolean} Hides the element from display.\n- `icon` {string} Icon to display in the header.\n- `selected` {boolean} When set to `true`, marks the header as selected.\n\n### IdsAccordionPanel\n\n- `hidden` {boolean} Hides the element from display.\n- `iconAlign` {string} Position of the caret icon (`'start'` or `'end'`). Default is `'end'`.\n\n### IdsAccordionSection\n\n- `hidden` {boolean} Hides the element from display.\n\n## Events\n\n- `selected` Fire at the time the ids-accordion-panel element is selected, used for App-Menu. Detail contains the element `elem`\n- `beforeexpanded` Fires on the ids-accordion-header before the panel begins to expand. Useful for performing actions before the animation starts.\n- `expanded` Fires on the ids-accordion-header immediately when the panel state changes to expanded. Detail contains the element `elem`\n- `afterexpanded` Fires on the ids-accordion-header after the expand animation completes. Useful for performing actions after the animation finishes.\n- `beforecollapsed` Fires on the ids-accordion-header before the panel begins to collapse. Useful for performing actions before the animation starts.\n- `collapsed` Fires on the ids-accordion-header immediately when the panel state changes to collapsed. Detail contains the element `elem`\n- `aftercollapsed` Fires on the ids-accordion-header after the collapse animation completes. Useful for performing actions after the animation finishes.\n\n### Event Examples\n\nListen for expand/collapse events on the accordion:\n\n```javascript\nconst accordion = document.querySelector('ids-accordion');\n\n// Fires before animation starts\naccordion.addEventListener('beforeexpanded', (e) => {\n  console.log('Panel expanding:', e.target.id);\n});\n\n// Fires immediately when state changes\naccordion.addEventListener('expanded', (e) => {\n  console.log('Panel expanded:', e.target.id);\n});\n\n// Fires after animation completes\naccordion.addEventListener('afterexpanded', (e) => {\n  console.log('Expand animation complete:', e.target.id);\n});\n\n// Similar events for collapse\naccordion.addEventListener('beforecollapsed', (e) => {\n  console.log('Panel collapsing:', e.target.id);\n});\n\naccordion.addEventListener('collapsed', (e) => {\n  console.log('Panel collapsed:', e.target.id);\n});\n\naccordion.addEventListener('aftercollapsed', (e) => {\n  console.log('Collapse animation complete:', e.target.id);\n});\n```\n\n## Methods\n\n- IdsAccordion\n  - `navigate` Navigate to the next/prev panel\n- IdsAccordionPanel\n  - `collapsePane` Collapse pane\n  - `expandPane` Expand pane\n  - `select` Select header and focus it\n  - `focus` Set focus on header\n\n## Themeable Parts\n\n- `accordion` Accordion root element\n\n## States and Variations\n\nThe Accordion's headers support the following states:\n\n- Normal/Default: This is the default of an accordion.\n- Hover: Roll over an interactive element inside the accordion\n- Disabled: Disabled elements can be inside an accordion. These cards cannot be clicked, hovered or focused.\n- Focus: For accessibility. To give a user guidance when using a screen reader.\n- Active/Selected: After the pressed/clicked state, users are taken to the active state. This includes expanding or closing an accordion.\n\n## Keyboard Guidelines\n\n- **Shift+Tab**: Works the same as Tab, but in the opposite direction. When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion Header or Tab page. When focus reaches the last header/tab page, further key presses will have optionally wrap to the first header\n- **Up Arrow or Left Arrow**: When focus is on the tab or accordion header, a press of up/left will move focus to the previous logical accordion header or tab page. When focus reaches the first header/tab page, further key presses will optionally wrap to the last header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Down Arrow or Right Arrow**: When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion header or tab page. When focus reaches the last header/tab page, further key presses will optionally wrap to the first header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Enter or Space**: When focus is on an accordion header, this keystroke toggles the expansion of the corresponding panel. If collapsed, the panel is expanded, and its aria-expanded state is set to true. If expanded, the panel is collapsed and its aria-expanded state is set to false.\n\n## Accessibility\n\nThe IDS Accordion component has a `role=\"region\"` and a unique `title` is generated for each instance.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Replace `.inforAboutDialog()` with `.about()` and notice that many of the names of the settings (e.g. productName to appName) to have changed so must be updated to the new settings.\n- The initial markup is changed considerably from the previous version. Sync the markup using the markup above\n- Initialize the accordion plugin with .accordion() as opposed to `.inforAccordion()` or by using the page initializer\nonExpanded and onCollapsed option are done with events (expanded and collapsed)\n\n**4.x to 5.x**\n- Accordion now uses all new markup and classes for web components (see above)\n- Now called IdsAccordion with a namespace\n- The \"Panels\" examples are removed and deprecated as they should rarely be used.\n- The deprecated `displayChevron` setting is removed.\n- The `enableTooltips` removed and deprecated as not added as it seems no longer relevant.\n- The `expanderDisplay` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed.\n- The `rerouteOnLinkClick` option was removed and deprecated as is no longer needed as there are no links in the markup now.\n- The `source` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed in accordion but will be added to IdsAppMenu.\n- The `destroy` method has been removed since everything is now cleaned up when removing the DOM element\n"}},{"name":"ids-accordion-panel","attributes":[{"name":"pane-open-listener","values":[]},{"name":"pane-close-listener","values":[]},{"name":"#cascaded-disabled-elements","description":"Tracks elements disabled by this cascade to preserve pre-existing disabled state.","values":[]},{"name":"color-variants","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"content-alignment","description":"Sets a CSS class containing alignment rules for text/icons/images on this accordion panel","values":[]},{"name":"accordion","values":[]},{"name":"header","values":[]},{"name":"expander","values":[]},{"name":"pane","values":[]},{"name":"child-panels","values":[]},{"name":"has-parent-panel","values":[]},{"name":"parent-expanded","values":[]},{"name":"is-expandable","values":[]},{"name":"#expanded","values":[]},{"name":"expanded","description":"Get the expanded property","values":[]},{"name":"nested","values":[]},{"name":"disabled","description":"Sets disabled property","values":[]},{"name":"toggle-on-icon","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-accordion\n\n## Description\n\nThe IDS Accordion component is a UI pattern that is comprised of a stacked list of elements. A basic accordion will consist of a `ids-accordion-header` which shows a title or summary of the `ids-accordion-panel` and acts as a control for expanding and collapsing. Note: Standalone Css is not available for this component.\n\n## Use Cases\n\n- Can be used to conserve space, by hiding information until needed. Accordions can be commonly seen on mobile sites and applications. It can help tell the user what the page is about and allows the user to select and see what is needed.\n- Can be used for navigation.  The accordion is the main interactive element inside of the [App Menu](../ids-app-menu/README.md)\n\n## Terminology\n\n- **ids-accordion** Parent container for all accordions\n- **ids-accordion-panel** First child of and accordion. Contains the header and content area. Contains 2 slots, the `header` and the `pane`.\n- **ids-accordion-header** Typically used in the header slot, contains the title and acts as the control for expanding and collapsing.\n\n## Features (With Code Examples)\n\nStandard accordion, most commonly used:\n\n```html\n<ids-accordion>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Warehouse Location</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain, deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Sort By</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Brand Name</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Material</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n### Nested Accordions\n\nIt's possible to nest accordion structures.  This is common in accordions used for navigation purposes, such as the ones applied to the [App Menu](../ids-app-menu/README.md).\n\nIn the example below, the \"My Benefits\", \"Dependents and Beneficiaries\", \"Life Events\", and \"Benefits Information\" panels are nested beneath the \"Benefits\" panel, which is nested beneath the \"Employee\" panel.\n\n```html\n<ids-accordion id=\"app-menu-style\">\n    <ids-accordion-panel id=\"employee\">\n        <ids-accordion-header slot=\"header\">\n            <ids-icon icon=\"user\" size=\"medium\"></ids-icon>\n            <ids-text font-size=\"20\">Employee</ids-text>\n        </ids-accordion-header>\n        <ids-accordion-panel slot=\"content\" id=\"benefits\">\n            <ids-accordion-header slot=\"header\" expander-type=\"plus-minus\">\n                <ids-text font-size=\"20\">Benefits</ids-text>\n            </ids-accordion-header>\n            <ids-accordion-panel slot=\"content\" id=\"my-benefits\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">My Benefits</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"dependents-beneficiaries\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Dependents and Beneficiaries</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"life-events\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Life Events</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"benefits-information\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Benefits Information</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n        </ids-accordion-panel>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n## Class Hierarchy\n\n- IdsAccordion\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n- IdsAccordionHeader\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n- IdsAccordionPanel\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n  IdsEventsMixin\n\n## Settings (Attributes)\n\nWhen used as an attribute the settings are kebab case, when used in the JS they are camel case.\n\n### IdsAccordion\n\n- `headers` {Array<IdsAccordionHeader>} Reference to all inner Accordion Headers.\n- `panels` {Array<IdsAccordionPanel>} Reference to all inner Accordion Panels.\n- `focused` {HTMLElement} Reference to the currently-focused element within the accordion, if applicable.\n- `allowOnePane` {boolean} Sets Accordion to allow only one inner Accordion Panel to be expanded at a time.\n- `keepExpanderPlacement` {boolean} Sets the Accordion to display sub-level expander icons as carets.\n- `closeChildren` {boolean} When true, Children will be collapsed when their parent has been collapsed.\n- `borderless` {boolean} When set to `true`, removes borders from headers when expanded (root level) or always (nested levels). Can also be set on individual headers.\n- `hidden` {boolean} Hides the element from display.\n- `toggleOnIcon` {boolean} When set to `true`, restricts toggle behavior to only occur when clicking the expander icon, not the entire header area. This is useful when you need custom selection logic on the header without conflicting with the toggle behavior.\n\n### IdsAccordionHeader\n\n- `borderless` {boolean} When set to `true`, removes the bottom border from the header when expanded (root level) or always (nested). Default is `false` (border is shown).\n- `disabled` {boolean} When set to `true`, disables the header interaction.\n- `expanded` {boolean} Reflects whether the associated panel is expanded.\n- `expanderType` {string} Type of expander icon to use (`'caret'` or `'plus-minus'`).\n- `headerFill` {boolean} When set to `true`, adds a background fill to the header.\n- `hidden` {boolean} Hides the element from display.\n- `icon` {string} Icon to display in the header.\n- `selected` {boolean} When set to `true`, marks the header as selected.\n\n### IdsAccordionPanel\n\n- `hidden` {boolean} Hides the element from display.\n- `iconAlign` {string} Position of the caret icon (`'start'` or `'end'`). Default is `'end'`.\n\n### IdsAccordionSection\n\n- `hidden` {boolean} Hides the element from display.\n\n## Events\n\n- `selected` Fire at the time the ids-accordion-panel element is selected, used for App-Menu. Detail contains the element `elem`\n- `beforeexpanded` Fires on the ids-accordion-header before the panel begins to expand. Useful for performing actions before the animation starts.\n- `expanded` Fires on the ids-accordion-header immediately when the panel state changes to expanded. Detail contains the element `elem`\n- `afterexpanded` Fires on the ids-accordion-header after the expand animation completes. Useful for performing actions after the animation finishes.\n- `beforecollapsed` Fires on the ids-accordion-header before the panel begins to collapse. Useful for performing actions before the animation starts.\n- `collapsed` Fires on the ids-accordion-header immediately when the panel state changes to collapsed. Detail contains the element `elem`\n- `aftercollapsed` Fires on the ids-accordion-header after the collapse animation completes. Useful for performing actions after the animation finishes.\n\n### Event Examples\n\nListen for expand/collapse events on the accordion:\n\n```javascript\nconst accordion = document.querySelector('ids-accordion');\n\n// Fires before animation starts\naccordion.addEventListener('beforeexpanded', (e) => {\n  console.log('Panel expanding:', e.target.id);\n});\n\n// Fires immediately when state changes\naccordion.addEventListener('expanded', (e) => {\n  console.log('Panel expanded:', e.target.id);\n});\n\n// Fires after animation completes\naccordion.addEventListener('afterexpanded', (e) => {\n  console.log('Expand animation complete:', e.target.id);\n});\n\n// Similar events for collapse\naccordion.addEventListener('beforecollapsed', (e) => {\n  console.log('Panel collapsing:', e.target.id);\n});\n\naccordion.addEventListener('collapsed', (e) => {\n  console.log('Panel collapsed:', e.target.id);\n});\n\naccordion.addEventListener('aftercollapsed', (e) => {\n  console.log('Collapse animation complete:', e.target.id);\n});\n```\n\n## Methods\n\n- IdsAccordion\n  - `navigate` Navigate to the next/prev panel\n- IdsAccordionPanel\n  - `collapsePane` Collapse pane\n  - `expandPane` Expand pane\n  - `select` Select header and focus it\n  - `focus` Set focus on header\n\n## Themeable Parts\n\n- `accordion` Accordion root element\n\n## States and Variations\n\nThe Accordion's headers support the following states:\n\n- Normal/Default: This is the default of an accordion.\n- Hover: Roll over an interactive element inside the accordion\n- Disabled: Disabled elements can be inside an accordion. These cards cannot be clicked, hovered or focused.\n- Focus: For accessibility. To give a user guidance when using a screen reader.\n- Active/Selected: After the pressed/clicked state, users are taken to the active state. This includes expanding or closing an accordion.\n\n## Keyboard Guidelines\n\n- **Shift+Tab**: Works the same as Tab, but in the opposite direction. When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion Header or Tab page. When focus reaches the last header/tab page, further key presses will have optionally wrap to the first header\n- **Up Arrow or Left Arrow**: When focus is on the tab or accordion header, a press of up/left will move focus to the previous logical accordion header or tab page. When focus reaches the first header/tab page, further key presses will optionally wrap to the last header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Down Arrow or Right Arrow**: When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion header or tab page. When focus reaches the last header/tab page, further key presses will optionally wrap to the first header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Enter or Space**: When focus is on an accordion header, this keystroke toggles the expansion of the corresponding panel. If collapsed, the panel is expanded, and its aria-expanded state is set to true. If expanded, the panel is collapsed and its aria-expanded state is set to false.\n\n## Accessibility\n\nThe IDS Accordion component has a `role=\"region\"` and a unique `title` is generated for each instance.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Replace `.inforAboutDialog()` with `.about()` and notice that many of the names of the settings (e.g. productName to appName) to have changed so must be updated to the new settings.\n- The initial markup is changed considerably from the previous version. Sync the markup using the markup above\n- Initialize the accordion plugin with .accordion() as opposed to `.inforAccordion()` or by using the page initializer\nonExpanded and onCollapsed option are done with events (expanded and collapsed)\n\n**4.x to 5.x**\n- Accordion now uses all new markup and classes for web components (see above)\n- Now called IdsAccordion with a namespace\n- The \"Panels\" examples are removed and deprecated as they should rarely be used.\n- The deprecated `displayChevron` setting is removed.\n- The `enableTooltips` removed and deprecated as not added as it seems no longer relevant.\n- The `expanderDisplay` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed.\n- The `rerouteOnLinkClick` option was removed and deprecated as is no longer needed as there are no links in the markup now.\n- The `source` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed in accordion but will be added to IdsAppMenu.\n- The `destroy` method has been removed since everything is now cleaned up when removing the DOM element\n"}},{"name":"ids-accordion-section","attributes":[{"name":"color-variants","values":[]},{"name":"disabled","description":"Sets disabled property","values":[]},{"name":"grow","description":"Sets grow property","values":[]},{"name":"pinned","description":"Sets pinned property","values":[]},{"name":"shrink","description":"Sets shrink property","values":[]}],"description":{"kind":"markdown","value":"# ids-accordion\n\n## Description\n\nThe IDS Accordion component is a UI pattern that is comprised of a stacked list of elements. A basic accordion will consist of a `ids-accordion-header` which shows a title or summary of the `ids-accordion-panel` and acts as a control for expanding and collapsing. Note: Standalone Css is not available for this component.\n\n## Use Cases\n\n- Can be used to conserve space, by hiding information until needed. Accordions can be commonly seen on mobile sites and applications. It can help tell the user what the page is about and allows the user to select and see what is needed.\n- Can be used for navigation.  The accordion is the main interactive element inside of the [App Menu](../ids-app-menu/README.md)\n\n## Terminology\n\n- **ids-accordion** Parent container for all accordions\n- **ids-accordion-panel** First child of and accordion. Contains the header and content area. Contains 2 slots, the `header` and the `pane`.\n- **ids-accordion-header** Typically used in the header slot, contains the title and acts as the control for expanding and collapsing.\n\n## Features (With Code Examples)\n\nStandard accordion, most commonly used:\n\n```html\n<ids-accordion>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Warehouse Location</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain, deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Sort By</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Brand Name</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Material</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n### Nested Accordions\n\nIt's possible to nest accordion structures.  This is common in accordions used for navigation purposes, such as the ones applied to the [App Menu](../ids-app-menu/README.md).\n\nIn the example below, the \"My Benefits\", \"Dependents and Beneficiaries\", \"Life Events\", and \"Benefits Information\" panels are nested beneath the \"Benefits\" panel, which is nested beneath the \"Employee\" panel.\n\n```html\n<ids-accordion id=\"app-menu-style\">\n    <ids-accordion-panel id=\"employee\">\n        <ids-accordion-header slot=\"header\">\n            <ids-icon icon=\"user\" size=\"medium\"></ids-icon>\n            <ids-text font-size=\"20\">Employee</ids-text>\n        </ids-accordion-header>\n        <ids-accordion-panel slot=\"content\" id=\"benefits\">\n            <ids-accordion-header slot=\"header\" expander-type=\"plus-minus\">\n                <ids-text font-size=\"20\">Benefits</ids-text>\n            </ids-accordion-header>\n            <ids-accordion-panel slot=\"content\" id=\"my-benefits\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">My Benefits</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"dependents-beneficiaries\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Dependents and Beneficiaries</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"life-events\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Life Events</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"benefits-information\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Benefits Information</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n        </ids-accordion-panel>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n## Class Hierarchy\n\n- IdsAccordion\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n- IdsAccordionHeader\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n- IdsAccordionPanel\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n  IdsEventsMixin\n\n## Settings (Attributes)\n\nWhen used as an attribute the settings are kebab case, when used in the JS they are camel case.\n\n### IdsAccordion\n\n- `headers` {Array<IdsAccordionHeader>} Reference to all inner Accordion Headers.\n- `panels` {Array<IdsAccordionPanel>} Reference to all inner Accordion Panels.\n- `focused` {HTMLElement} Reference to the currently-focused element within the accordion, if applicable.\n- `allowOnePane` {boolean} Sets Accordion to allow only one inner Accordion Panel to be expanded at a time.\n- `keepExpanderPlacement` {boolean} Sets the Accordion to display sub-level expander icons as carets.\n- `closeChildren` {boolean} When true, Children will be collapsed when their parent has been collapsed.\n- `borderless` {boolean} When set to `true`, removes borders from headers when expanded (root level) or always (nested levels). Can also be set on individual headers.\n- `hidden` {boolean} Hides the element from display.\n- `toggleOnIcon` {boolean} When set to `true`, restricts toggle behavior to only occur when clicking the expander icon, not the entire header area. This is useful when you need custom selection logic on the header without conflicting with the toggle behavior.\n\n### IdsAccordionHeader\n\n- `borderless` {boolean} When set to `true`, removes the bottom border from the header when expanded (root level) or always (nested). Default is `false` (border is shown).\n- `disabled` {boolean} When set to `true`, disables the header interaction.\n- `expanded` {boolean} Reflects whether the associated panel is expanded.\n- `expanderType` {string} Type of expander icon to use (`'caret'` or `'plus-minus'`).\n- `headerFill` {boolean} When set to `true`, adds a background fill to the header.\n- `hidden` {boolean} Hides the element from display.\n- `icon` {string} Icon to display in the header.\n- `selected` {boolean} When set to `true`, marks the header as selected.\n\n### IdsAccordionPanel\n\n- `hidden` {boolean} Hides the element from display.\n- `iconAlign` {string} Position of the caret icon (`'start'` or `'end'`). Default is `'end'`.\n\n### IdsAccordionSection\n\n- `hidden` {boolean} Hides the element from display.\n\n## Events\n\n- `selected` Fire at the time the ids-accordion-panel element is selected, used for App-Menu. Detail contains the element `elem`\n- `beforeexpanded` Fires on the ids-accordion-header before the panel begins to expand. Useful for performing actions before the animation starts.\n- `expanded` Fires on the ids-accordion-header immediately when the panel state changes to expanded. Detail contains the element `elem`\n- `afterexpanded` Fires on the ids-accordion-header after the expand animation completes. Useful for performing actions after the animation finishes.\n- `beforecollapsed` Fires on the ids-accordion-header before the panel begins to collapse. Useful for performing actions before the animation starts.\n- `collapsed` Fires on the ids-accordion-header immediately when the panel state changes to collapsed. Detail contains the element `elem`\n- `aftercollapsed` Fires on the ids-accordion-header after the collapse animation completes. Useful for performing actions after the animation finishes.\n\n### Event Examples\n\nListen for expand/collapse events on the accordion:\n\n```javascript\nconst accordion = document.querySelector('ids-accordion');\n\n// Fires before animation starts\naccordion.addEventListener('beforeexpanded', (e) => {\n  console.log('Panel expanding:', e.target.id);\n});\n\n// Fires immediately when state changes\naccordion.addEventListener('expanded', (e) => {\n  console.log('Panel expanded:', e.target.id);\n});\n\n// Fires after animation completes\naccordion.addEventListener('afterexpanded', (e) => {\n  console.log('Expand animation complete:', e.target.id);\n});\n\n// Similar events for collapse\naccordion.addEventListener('beforecollapsed', (e) => {\n  console.log('Panel collapsing:', e.target.id);\n});\n\naccordion.addEventListener('collapsed', (e) => {\n  console.log('Panel collapsed:', e.target.id);\n});\n\naccordion.addEventListener('aftercollapsed', (e) => {\n  console.log('Collapse animation complete:', e.target.id);\n});\n```\n\n## Methods\n\n- IdsAccordion\n  - `navigate` Navigate to the next/prev panel\n- IdsAccordionPanel\n  - `collapsePane` Collapse pane\n  - `expandPane` Expand pane\n  - `select` Select header and focus it\n  - `focus` Set focus on header\n\n## Themeable Parts\n\n- `accordion` Accordion root element\n\n## States and Variations\n\nThe Accordion's headers support the following states:\n\n- Normal/Default: This is the default of an accordion.\n- Hover: Roll over an interactive element inside the accordion\n- Disabled: Disabled elements can be inside an accordion. These cards cannot be clicked, hovered or focused.\n- Focus: For accessibility. To give a user guidance when using a screen reader.\n- Active/Selected: After the pressed/clicked state, users are taken to the active state. This includes expanding or closing an accordion.\n\n## Keyboard Guidelines\n\n- **Shift+Tab**: Works the same as Tab, but in the opposite direction. When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion Header or Tab page. When focus reaches the last header/tab page, further key presses will have optionally wrap to the first header\n- **Up Arrow or Left Arrow**: When focus is on the tab or accordion header, a press of up/left will move focus to the previous logical accordion header or tab page. When focus reaches the first header/tab page, further key presses will optionally wrap to the last header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Down Arrow or Right Arrow**: When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion header or tab page. When focus reaches the last header/tab page, further key presses will optionally wrap to the first header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Enter or Space**: When focus is on an accordion header, this keystroke toggles the expansion of the corresponding panel. If collapsed, the panel is expanded, and its aria-expanded state is set to true. If expanded, the panel is collapsed and its aria-expanded state is set to false.\n\n## Accessibility\n\nThe IDS Accordion component has a `role=\"region\"` and a unique `title` is generated for each instance.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Replace `.inforAboutDialog()` with `.about()` and notice that many of the names of the settings (e.g. productName to appName) to have changed so must be updated to the new settings.\n- The initial markup is changed considerably from the previous version. Sync the markup using the markup above\n- Initialize the accordion plugin with .accordion() as opposed to `.inforAccordion()` or by using the page initializer\nonExpanded and onCollapsed option are done with events (expanded and collapsed)\n\n**4.x to 5.x**\n- Accordion now uses all new markup and classes for web components (see above)\n- Now called IdsAccordion with a namespace\n- The \"Panels\" examples are removed and deprecated as they should rarely be used.\n- The deprecated `displayChevron` setting is removed.\n- The `enableTooltips` removed and deprecated as not added as it seems no longer relevant.\n- The `expanderDisplay` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed.\n- The `rerouteOnLinkClick` option was removed and deprecated as is no longer needed as there are no links in the markup now.\n- The `source` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed in accordion but will be added to IdsAppMenu.\n- The `destroy` method has been removed since everything is now cleaned up when removing the DOM element\n"}},{"name":"ids-accordion","attributes":[{"name":"header","values":[]},{"name":"previously-selected","values":[]},{"name":"color-variants","values":[]},{"name":"#content-observer","description":"Observes changes in the accordion tree","values":[]},{"name":"sections","values":[]},{"name":"headers","values":[]},{"name":"panels","values":[]},{"name":"focused","values":[]},{"name":"allow-one-pane","description":"Sets allowOnePane property","values":[]},{"name":"disabled","description":"Sets disabled property","values":[]},{"name":"keep-expander-placement","description":"Gets keepExpanderPlacement","values":[]},{"name":"close-children","description":"Gets collapse-children attribute value","values":[]},{"name":"borderless","description":"Gets borderless property","values":[]},{"name":"toggle-on-icon","description":"Gets toggle-on-icon property","values":[]},{"name":"on-language-change","description":"Respond to language changes","values":[]}],"description":{"kind":"markdown","value":"# ids-accordion\n\n## Description\n\nThe IDS Accordion component is a UI pattern that is comprised of a stacked list of elements. A basic accordion will consist of a `ids-accordion-header` which shows a title or summary of the `ids-accordion-panel` and acts as a control for expanding and collapsing. Note: Standalone Css is not available for this component.\n\n## Use Cases\n\n- Can be used to conserve space, by hiding information until needed. Accordions can be commonly seen on mobile sites and applications. It can help tell the user what the page is about and allows the user to select and see what is needed.\n- Can be used for navigation.  The accordion is the main interactive element inside of the [App Menu](../ids-app-menu/README.md)\n\n## Terminology\n\n- **ids-accordion** Parent container for all accordions\n- **ids-accordion-panel** First child of and accordion. Contains the header and content area. Contains 2 slots, the `header` and the `pane`.\n- **ids-accordion-header** Typically used in the header slot, contains the title and acts as the control for expanding and collapsing.\n\n## Features (With Code Examples)\n\nStandard accordion, most commonly used:\n\n```html\n<ids-accordion>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Warehouse Location</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain, deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Sort By</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Brand Name</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n    <ids-accordion-panel>\n        <ids-accordion-header slot=\"header\">\n            <ids-text font-size=\"20\">Material</ids-text>\n        </ids-accordion-header>\n        <ids-text slot=\"content\">\n            Remix, optimize, \"B2B, iterate?\" Best-of-breed efficient beta-test; social cutting-edge: rich magnetic tagclouds\n            front-end infomediaries viral authentic incentivize sexy extensible functionalities incentivize. Generate killer\n            authentic grow vertical blogospheres, functionalities ecologies harness, \"tag solutions synergies exploit\n            data-driven B2C open-source e-markets optimize create, enhance convergence create.\" Out-of-the-box strategize\n            best-of-breed back-end, deploy design markets metrics. Content web services enhance leading-edge Cluetrain,\n            deliverables dot-com scalable. User-centric morph, back-end, synthesize mesh, frictionless, exploit next-generation\n            tag portals, e-commerce channels; integrate; recontextualize distributed revolutionize innovative eyeballs.\n        </ids-text>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n### Nested Accordions\n\nIt's possible to nest accordion structures.  This is common in accordions used for navigation purposes, such as the ones applied to the [App Menu](../ids-app-menu/README.md).\n\nIn the example below, the \"My Benefits\", \"Dependents and Beneficiaries\", \"Life Events\", and \"Benefits Information\" panels are nested beneath the \"Benefits\" panel, which is nested beneath the \"Employee\" panel.\n\n```html\n<ids-accordion id=\"app-menu-style\">\n    <ids-accordion-panel id=\"employee\">\n        <ids-accordion-header slot=\"header\">\n            <ids-icon icon=\"user\" size=\"medium\"></ids-icon>\n            <ids-text font-size=\"20\">Employee</ids-text>\n        </ids-accordion-header>\n        <ids-accordion-panel slot=\"content\" id=\"benefits\">\n            <ids-accordion-header slot=\"header\" expander-type=\"plus-minus\">\n                <ids-text font-size=\"20\">Benefits</ids-text>\n            </ids-accordion-header>\n            <ids-accordion-panel slot=\"content\" id=\"my-benefits\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">My Benefits</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"dependents-beneficiaries\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Dependents and Beneficiaries</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"life-events\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Life Events</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n            <ids-accordion-panel slot=\"content\" id=\"benefits-information\">\n                <ids-accordion-header slot=\"header\">\n                    <ids-text font-size=\"20\">Benefits Information</ids-text>\n                </ids-accordion-header>\n            </ids-accordion-panel>\n        </ids-accordion-panel>\n    </ids-accordion-panel>\n</ids-accordion>\n```\n\n## Class Hierarchy\n\n- IdsAccordion\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n- IdsAccordionHeader\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsEventsMixin\n- IdsAccordionPanel\n  - IdsElement\n- Mixins\n  IdsColorVariantMixin\n  IdsKeyboardMixin\n  IdsLocaleMixin\n  IdsEventsMixin\n\n## Settings (Attributes)\n\nWhen used as an attribute the settings are kebab case, when used in the JS they are camel case.\n\n### IdsAccordion\n\n- `headers` {Array<IdsAccordionHeader>} Reference to all inner Accordion Headers.\n- `panels` {Array<IdsAccordionPanel>} Reference to all inner Accordion Panels.\n- `focused` {HTMLElement} Reference to the currently-focused element within the accordion, if applicable.\n- `allowOnePane` {boolean} Sets Accordion to allow only one inner Accordion Panel to be expanded at a time.\n- `keepExpanderPlacement` {boolean} Sets the Accordion to display sub-level expander icons as carets.\n- `closeChildren` {boolean} When true, Children will be collapsed when their parent has been collapsed.\n- `borderless` {boolean} When set to `true`, removes borders from headers when expanded (root level) or always (nested levels). Can also be set on individual headers.\n- `hidden` {boolean} Hides the element from display.\n- `toggleOnIcon` {boolean} When set to `true`, restricts toggle behavior to only occur when clicking the expander icon, not the entire header area. This is useful when you need custom selection logic on the header without conflicting with the toggle behavior.\n\n### IdsAccordionHeader\n\n- `borderless` {boolean} When set to `true`, removes the bottom border from the header when expanded (root level) or always (nested). Default is `false` (border is shown).\n- `disabled` {boolean} When set to `true`, disables the header interaction.\n- `expanded` {boolean} Reflects whether the associated panel is expanded.\n- `expanderType` {string} Type of expander icon to use (`'caret'` or `'plus-minus'`).\n- `headerFill` {boolean} When set to `true`, adds a background fill to the header.\n- `hidden` {boolean} Hides the element from display.\n- `icon` {string} Icon to display in the header.\n- `selected` {boolean} When set to `true`, marks the header as selected.\n\n### IdsAccordionPanel\n\n- `hidden` {boolean} Hides the element from display.\n- `iconAlign` {string} Position of the caret icon (`'start'` or `'end'`). Default is `'end'`.\n\n### IdsAccordionSection\n\n- `hidden` {boolean} Hides the element from display.\n\n## Events\n\n- `selected` Fire at the time the ids-accordion-panel element is selected, used for App-Menu. Detail contains the element `elem`\n- `beforeexpanded` Fires on the ids-accordion-header before the panel begins to expand. Useful for performing actions before the animation starts.\n- `expanded` Fires on the ids-accordion-header immediately when the panel state changes to expanded. Detail contains the element `elem`\n- `afterexpanded` Fires on the ids-accordion-header after the expand animation completes. Useful for performing actions after the animation finishes.\n- `beforecollapsed` Fires on the ids-accordion-header before the panel begins to collapse. Useful for performing actions before the animation starts.\n- `collapsed` Fires on the ids-accordion-header immediately when the panel state changes to collapsed. Detail contains the element `elem`\n- `aftercollapsed` Fires on the ids-accordion-header after the collapse animation completes. Useful for performing actions after the animation finishes.\n\n### Event Examples\n\nListen for expand/collapse events on the accordion:\n\n```javascript\nconst accordion = document.querySelector('ids-accordion');\n\n// Fires before animation starts\naccordion.addEventListener('beforeexpanded', (e) => {\n  console.log('Panel expanding:', e.target.id);\n});\n\n// Fires immediately when state changes\naccordion.addEventListener('expanded', (e) => {\n  console.log('Panel expanded:', e.target.id);\n});\n\n// Fires after animation completes\naccordion.addEventListener('afterexpanded', (e) => {\n  console.log('Expand animation complete:', e.target.id);\n});\n\n// Similar events for collapse\naccordion.addEventListener('beforecollapsed', (e) => {\n  console.log('Panel collapsing:', e.target.id);\n});\n\naccordion.addEventListener('collapsed', (e) => {\n  console.log('Panel collapsed:', e.target.id);\n});\n\naccordion.addEventListener('aftercollapsed', (e) => {\n  console.log('Collapse animation complete:', e.target.id);\n});\n```\n\n## Methods\n\n- IdsAccordion\n  - `navigate` Navigate to the next/prev panel\n- IdsAccordionPanel\n  - `collapsePane` Collapse pane\n  - `expandPane` Expand pane\n  - `select` Select header and focus it\n  - `focus` Set focus on header\n\n## Themeable Parts\n\n- `accordion` Accordion root element\n\n## States and Variations\n\nThe Accordion's headers support the following states:\n\n- Normal/Default: This is the default of an accordion.\n- Hover: Roll over an interactive element inside the accordion\n- Disabled: Disabled elements can be inside an accordion. These cards cannot be clicked, hovered or focused.\n- Focus: For accessibility. To give a user guidance when using a screen reader.\n- Active/Selected: After the pressed/clicked state, users are taken to the active state. This includes expanding or closing an accordion.\n\n## Keyboard Guidelines\n\n- **Shift+Tab**: Works the same as Tab, but in the opposite direction. When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion Header or Tab page. When focus reaches the last header/tab page, further key presses will have optionally wrap to the first header\n- **Up Arrow or Left Arrow**: When focus is on the tab or accordion header, a press of up/left will move focus to the previous logical accordion header or tab page. When focus reaches the first header/tab page, further key presses will optionally wrap to the last header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Down Arrow or Right Arrow**: When focus is on the tab or accordion header, a press of down/right will move focus to the next logical accordion header or tab page. When focus reaches the last header/tab page, further key presses will optionally wrap to the first header.  This keystroke is also aware of how to traverse different levels of nested accordion panels.\n- **Enter or Space**: When focus is on an accordion header, this keystroke toggles the expansion of the corresponding panel. If collapsed, the panel is expanded, and its aria-expanded state is set to true. If expanded, the panel is collapsed and its aria-expanded state is set to false.\n\n## Accessibility\n\nThe IDS Accordion component has a `role=\"region\"` and a unique `title` is generated for each instance.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Replace `.inforAboutDialog()` with `.about()` and notice that many of the names of the settings (e.g. productName to appName) to have changed so must be updated to the new settings.\n- The initial markup is changed considerably from the previous version. Sync the markup using the markup above\n- Initialize the accordion plugin with .accordion() as opposed to `.inforAccordion()` or by using the page initializer\nonExpanded and onCollapsed option are done with events (expanded and collapsed)\n\n**4.x to 5.x**\n- Accordion now uses all new markup and classes for web components (see above)\n- Now called IdsAccordion with a namespace\n- The \"Panels\" examples are removed and deprecated as they should rarely be used.\n- The deprecated `displayChevron` setting is removed.\n- The `enableTooltips` removed and deprecated as not added as it seems no longer relevant.\n- The `expanderDisplay` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed.\n- The `rerouteOnLinkClick` option was removed and deprecated as is no longer needed as there are no links in the markup now.\n- The `source` option was removed and deprecated as it was used only by IdsAppMenu and is no longer needed in accordion but will be added to IdsAppMenu.\n- The `destroy` method has been removed since everything is now cleaned up when removing the DOM element\n"}},{"name":"ids-alert","attributes":[{"name":"color","description":"Set the alert color","values":[]},{"name":"disabled","description":"Sets the disabled state","values":[]},{"name":"icon","description":"Set the icon","values":[]},{"name":"size","description":"Set the size. May be large, normal/medium or small","values":[]},{"name":"#updating-label","values":[]},{"name":"label","description":"Set the label text","values":[]},{"name":"label-color","description":"Set the label color","values":[]},{"name":"aria-label","description":"Get the aria-label","values":[]}],"description":{"kind":"markdown","value":"# ids-alert\n\n## Description\n\nIDS Alert icons are special icons that indicate a status/error situation. They can are often used as one part of an error/alert/info message with accompanying text. Alerts help get users attention of something affecting an application, feature or a page. This component consists of different types such as `error`, `warning`, `success`, and `info` that represents the icon color for each status.\n\n## Use Cases\n\nTypically, these alerts are use to get attention of the status of your application. Use text along with the alert so that users that cant understand the color difference get the important alert information.\n\nAlerts should be used for error messages and warnings not as embellishments. For a softer status, something like an embellishment see icons component status colors. Note that the badges should not be used in place of alerts or status icons and do not support icons.\n\n## Terminology\n\n- **Type**: Type is basically the status of an alert.\n- **Icon**: Icon is the symbol of the alert.\n- **Color**: The type of alert color.\n\n## Feature (With the Code Examples)\n\nAn alert is created by using the `ids-alert` html custom element. It has a `icon` property to set the desire alert icon to use.\n\n```html\n<ids-alert icon=\"info\"></ids-alert>\n<ids-alert icon=\"success\"></ids-alert>\n<ids-alert icon=\"warning\"></ids-alert>\n```\n\nAn alert can be used in a disabled situation so comes with a disabled style\n\n```html\n<ids-alert icon=\"info\" disabled=\"true\"></ids-alert>\n```\n\nAn alert can have a tooltip\n\n```html\n<ids-alert icon=\"error\" tooltip=\"Info about the error\"></ids-alert>\n```\n\nAn alert can use any icon, use the color setting with it to control the icon color\n\n```html\n<ids-alert icon=\"calendar\" color=\"info\" tooltip=\"Calendar Alert\"></ids-alert\n```\n\nAn alert can use any icon size\n\n```html\n<ids-alert icon=\"error\" tooltip=\"Info about the error\"  size=\"small\"></ids-alert>\n```\n\nAn alert can have a label displayed next to the icon\n\n```html\n<ids-alert icon=\"error\" label=\"Error\"></ids-alert>\n<ids-alert icon=\"success\" label=\"Success\"></ids-alert>\n```\n\nAn alert label can have a custom color independent of the icon color, be aware that some colors may not have good color contrast for accessibility so we use normal label color by default.\n\n```html\n<ids-alert icon=\"error\" label=\"Error\" label-color=\"error\"></ids-alert>\n<ids-alert icon=\"info\" label=\"Info\" label-color=\"info\"></ids-alert>\n```\n\n## Class Hierarchy\n\n- IdsAlert\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n\n## Settings (Attributes)\n\n- `icon` {boolean} Set the type of icon / alert to show options include  'alert' | 'success' | 'dirty' | 'error' | 'info' |'pending' | 'new' | 'in-progress' or any other icon in the icon set. For these other icons set the color property as well\n- `disabled` {boolean} Set alert to disabled\n- `tooltip` {string} Sets the string content for a tooltip, for error, success, info, alert the color of the tooltip will change\n- `color` {string} Sets the icon color between error, success, info, warning, caution, orange, purple\n- `label` {string} Sets the label text displayed next to the icon\n- `label-color` {string} Sets the label text color independently from the icon color\n- `aria-label` {string} Sets an accessible name for the alert. Use this when the icon and tooltip alone do not convey enough meaning to assistive technologies.\n\n## Themeable Parts\n\n- `icon` allows you to further style the icon element\n- `label` allows you to further style the label text element\n\n## States and Variations\n\n- Color\n- Size\n- Alert\n\n## Keyboard Guidelines\n\nAlert icons do not have tab stops or keyboard interaction on their own. However, they may be placed in a grid cell or other object that has tab focus.\n\n## Responsive Guidelines\n\n- Flows within its parent/placement and is usually centered vertically.\n\n## Accessibility\n\nThe traffic light colors are accessibility violations for contrast, however, the high contrast theme provides an alternative that passes. In addition, in context text should be used as color alone cannot provide the meaning. i.e. Do not use color alone to indicate a state.\n\nWhen an alert icon is used without a visible label or tooltip, use the `aria-label` attribute to provide an accessible name for screen readers.\n\n```html\n<ids-alert icon=\"error\" aria-label=\"Error: invalid input\"></ids-alert>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n- Alert now uses all new markup and classes for web components (see above)\n- The yellow alert is no longer available due to having poor contrast with the background.\n- The names of some alerts (icon setting) have changed\n"}},{"name":"ids-app-menu-container","attributes":[],"description":{"kind":"markdown","value":"# Ids App Menu\n\nThe Ids App Menu serves as primary navigation for an Infor Application, combining top level functions of the application with user authentication and access to changing roles.\n\nThe App Menu is built on top of [IdsDrawer](../ids-drawer/README.md) and generally utilizes an [IdsAccordion](../ids-accordion/README.md) and/or [IdsToolbar](../ids-toolbar/README.md) for its navigation features.\n\n## Use Cases\n\n- Top-level navigation for your application\n- Access to application-wide features\n- Access to different user roles\n\n## Terminology\n\n- **App Menu Branding** - A slotted area that can be used for application branding info, such as a logo. Its recommended to use the customer logo, not the infor logo.\n- **App Menu Content** - The primary slotted area that usually houses an [IdsAccordion](../ids-accordion/README.md) or some other navigation structure.\n- **App Menu Header** - A slotted area that can be used for extra navigation or text content that sits above the main App Menu content area.\n- **App Menu Footer** - A slotted area that can be used for extra navigation or text content that sits below the main App Menu content area.\n- **App Menu Search** - A slotted area that can be used for adding a search feature for App Menu functionality.\n- **App Menu User Info** - A slotted area that can contain information specific to the \"User\" accessing the application.\n\n## Features (with code samples)\n\nA barebones App Menu can consist of only an accordion for navigation:\n\n```html\n<ids-app-menu id=\"app-menu\" keep-open>\n    <ids-accordion>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\">Employee</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"distribution\">\n                <ids-text font-size=\"16\">Manager</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"roles\">\n                <ids-text font-size=\"16\" class=\"ignore-keep-open\">Recruiter</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n    </ids-accordion>\n</ids-app-menu>\n```\n\nThe `keep-open` attribute forces menu to stay open, and the `ignore-keep-open` class will cause menu-items to bypass `keep-open` attribute.\n\nFor more examples of Accordion customization, please see [the Accordion documentation](../ids-accordion/README.md)\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n\n### Toolbars\n\nApp Menus can contain small [Toolbars](../ids-toolbar/README.md) that sit above and below the main navigation area.  These toolbars will ideally contain supporting functions that are application-specific, but not necessarily the most important top-level features of the application.\n\nTo include these Toolbars, simply add them to the App Menu's markup with `[slot=\"header\"]` or `[slot=\"footer\"]`:\n\n```html\n<ids-app-menu id=\"app-menu\">\n  <ids-toolbar slot=\"header\">\n    <ids-toolbar-section align=\"center-even\" type=\"fluid\">\n      <ids-button id=\"header-btn-download\" icon=\"download\">\n        <ids-text audible>Download</ids-text>\n      </ids-button>\n      <ids-button id=\"header-btn-print\" icon=\"print\">\n        <ids-text audible>Print</ids-text>\n      </ids-button>\n      <ids-button id=\"header-btn-purchasing\" icon=\"purchasing\">\n        <ids-text audible>Purchasing</ids-text>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n\n  <!-- ... -->\n  <ids-toolbar slot=\"footer\">\n    <ids-toolbar-section align=\"center-even\" type=\"fluid\">\n      <ids-button id=\"footer-btn-settings\">\n        <ids-icon icon=\"settings\"></ids-icon>\n        <span>Settings</span>\n      </ids-button>\n      <ids-button id=\"footer-btn-proxy\" icon=\"employee-directory\">\n        <ids-text audible>Proxy as User</ids-text>\n      </ids-button>\n      <ids-button id=\"footer-btn-about\" icon=\"info-linear\">\n        <ids-text audible>About This Application</ids-text>\n      </ids-button>\n      <ids-button id=\"footer-btn-logout\" icon=\"logout\">\n        <ids-text audible>Logout</ids-text>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n</ids-app-menu>\n```\n\n### User Information and Roles\n\nApp Menus reserve two slots for specific user information:\n\n- Avatars (User photos)\n- Name\n\n```html\n<ids-app-menu id=\"app-menu\">\n  <!-- Avatar/Username Area -->\n  <img slot=\"avatar\" src=\"../assets/images/avatar-placeholder.jpg\" alt=\"Picture of Richard Fairbanks\" />\n  <ids-text slot=\"username\" font-size=\"24\" font-weight=\"semi-bold\">Richard Fairbanks</ids-text>\n</ids-app-menu>\n```\n\n### Search Field\n\nApp Menus can apply filtering capability to their navigation accordion elements by adding an [IdsSearchField](../ids-search-field/README.md) component with `slot=\"search\"` applied:\n\n```html\n<ids-app-menu id=\"app-menu\">\n    <!-- Search Area -->\n    <ids-search-field id=\"search\" slot=\"search\" label=\"\"></ids-search-field>\n\n    <!-- Accordion Nav -->\n    <ids-accordion>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\">Employee</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"distribution\">\n                <ids-text font-size=\"16\">Manager</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"roles\">\n                <ids-text font-size=\"16\">Recruiter</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n    </ids-accordion>\n</ids-app-menu>\n```\n\nIn the previous example, when typing \"Re\" into the search field, the \"Employee\" and \"Manager\" accordion headers will be visually hidden.  Removing the search field's value causes the filter to be reset, and all headers will be visible again.\n\nWhile a filter is applied, accordion headers that do not match the filter are tagged with a `hidden-by-filter` attribute.\n\nThis feature is also applied to nested accordion navigation.  While filtered, headers that don't match the filter will be completely hidden if they have no matching children, but will appear \"faded out\" if they do contain at least one matching child.  These headers are also tagged with a `child-filter-match` attribute.\n\n## States and Variations\n\nThe App Menu doesn't contain any states or variants of its own, but applies the following to its extensions and sub-components:\n\n- App Menu uses the `app-menu` style of [IdsDrawer]('../ids-drawer/README.md').\n- Any \"Top-Level\" [IdsAccordion](../ids-accordion/README.md) panels added to the App Menu receive the `app-menu` color variant\n- Any \"nested\" IdsAccordion panels added to the App Menu receive the `sub-app-menu` color variant.\n- Any [IdsButton](../ids-button/README.md) components inside the App Menu in any slot will be converted to the `alternate` color variant.\n\n## Keyboard Guidelines\n\n- **Escape**: When focus is on an element inside an open App Menu, the App Menu will close.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-app-menu></ids-app-menu`>\nSections are now slotted for easier use.  Accordion is the main slot, and other areas (toolbars, user info, etc) are named slots.\n- Can now be imported as a single JS file and used with encapsulated styles\n- The names of some alerts (icon setting) have changed\n"}},{"name":"ids-app-menu","attributes":[{"name":"global-keydown-listener","values":[]},{"name":"#container","values":[]},{"name":"accordion","values":[]},{"name":"keep-open","description":"Gets whether the app menu should remain open when clicking outside.","values":[]},{"name":"is-filtered","values":[]},{"name":"filter-accordion","description":"Performs a filter operation on accordion panels","values":[]}],"description":{"kind":"markdown","value":"# Ids App Menu\n\nThe Ids App Menu serves as primary navigation for an Infor Application, combining top level functions of the application with user authentication and access to changing roles.\n\nThe App Menu is built on top of [IdsDrawer](../ids-drawer/README.md) and generally utilizes an [IdsAccordion](../ids-accordion/README.md) and/or [IdsToolbar](../ids-toolbar/README.md) for its navigation features.\n\n## Use Cases\n\n- Top-level navigation for your application\n- Access to application-wide features\n- Access to different user roles\n\n## Terminology\n\n- **App Menu Branding** - A slotted area that can be used for application branding info, such as a logo. Its recommended to use the customer logo, not the infor logo.\n- **App Menu Content** - The primary slotted area that usually houses an [IdsAccordion](../ids-accordion/README.md) or some other navigation structure.\n- **App Menu Header** - A slotted area that can be used for extra navigation or text content that sits above the main App Menu content area.\n- **App Menu Footer** - A slotted area that can be used for extra navigation or text content that sits below the main App Menu content area.\n- **App Menu Search** - A slotted area that can be used for adding a search feature for App Menu functionality.\n- **App Menu User Info** - A slotted area that can contain information specific to the \"User\" accessing the application.\n\n## Features (with code samples)\n\nA barebones App Menu can consist of only an accordion for navigation:\n\n```html\n<ids-app-menu id=\"app-menu\" keep-open>\n    <ids-accordion>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\">Employee</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"distribution\">\n                <ids-text font-size=\"16\">Manager</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"roles\">\n                <ids-text font-size=\"16\" class=\"ignore-keep-open\">Recruiter</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n    </ids-accordion>\n</ids-app-menu>\n```\n\nThe `keep-open` attribute forces menu to stay open, and the `ignore-keep-open` class will cause menu-items to bypass `keep-open` attribute.\n\nFor more examples of Accordion customization, please see [the Accordion documentation](../ids-accordion/README.md)\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n\n### Toolbars\n\nApp Menus can contain small [Toolbars](../ids-toolbar/README.md) that sit above and below the main navigation area.  These toolbars will ideally contain supporting functions that are application-specific, but not necessarily the most important top-level features of the application.\n\nTo include these Toolbars, simply add them to the App Menu's markup with `[slot=\"header\"]` or `[slot=\"footer\"]`:\n\n```html\n<ids-app-menu id=\"app-menu\">\n  <ids-toolbar slot=\"header\">\n    <ids-toolbar-section align=\"center-even\" type=\"fluid\">\n      <ids-button id=\"header-btn-download\" icon=\"download\">\n        <ids-text audible>Download</ids-text>\n      </ids-button>\n      <ids-button id=\"header-btn-print\" icon=\"print\">\n        <ids-text audible>Print</ids-text>\n      </ids-button>\n      <ids-button id=\"header-btn-purchasing\" icon=\"purchasing\">\n        <ids-text audible>Purchasing</ids-text>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n\n  <!-- ... -->\n  <ids-toolbar slot=\"footer\">\n    <ids-toolbar-section align=\"center-even\" type=\"fluid\">\n      <ids-button id=\"footer-btn-settings\">\n        <ids-icon icon=\"settings\"></ids-icon>\n        <span>Settings</span>\n      </ids-button>\n      <ids-button id=\"footer-btn-proxy\" icon=\"employee-directory\">\n        <ids-text audible>Proxy as User</ids-text>\n      </ids-button>\n      <ids-button id=\"footer-btn-about\" icon=\"info-linear\">\n        <ids-text audible>About This Application</ids-text>\n      </ids-button>\n      <ids-button id=\"footer-btn-logout\" icon=\"logout\">\n        <ids-text audible>Logout</ids-text>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n</ids-app-menu>\n```\n\n### User Information and Roles\n\nApp Menus reserve two slots for specific user information:\n\n- Avatars (User photos)\n- Name\n\n```html\n<ids-app-menu id=\"app-menu\">\n  <!-- Avatar/Username Area -->\n  <img slot=\"avatar\" src=\"../assets/images/avatar-placeholder.jpg\" alt=\"Picture of Richard Fairbanks\" />\n  <ids-text slot=\"username\" font-size=\"24\" font-weight=\"semi-bold\">Richard Fairbanks</ids-text>\n</ids-app-menu>\n```\n\n### Search Field\n\nApp Menus can apply filtering capability to their navigation accordion elements by adding an [IdsSearchField](../ids-search-field/README.md) component with `slot=\"search\"` applied:\n\n```html\n<ids-app-menu id=\"app-menu\">\n    <!-- Search Area -->\n    <ids-search-field id=\"search\" slot=\"search\" label=\"\"></ids-search-field>\n\n    <!-- Accordion Nav -->\n    <ids-accordion>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\">Employee</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"distribution\">\n                <ids-text font-size=\"16\">Manager</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n        <ids-accordion-panel>\n            <ids-accordion-header slot=\"header\" icon=\"roles\">\n                <ids-text font-size=\"16\">Recruiter</ids-text>\n            </ids-accordion-header>\n        </ids-accordion-panel>\n    </ids-accordion>\n</ids-app-menu>\n```\n\nIn the previous example, when typing \"Re\" into the search field, the \"Employee\" and \"Manager\" accordion headers will be visually hidden.  Removing the search field's value causes the filter to be reset, and all headers will be visible again.\n\nWhile a filter is applied, accordion headers that do not match the filter are tagged with a `hidden-by-filter` attribute.\n\nThis feature is also applied to nested accordion navigation.  While filtered, headers that don't match the filter will be completely hidden if they have no matching children, but will appear \"faded out\" if they do contain at least one matching child.  These headers are also tagged with a `child-filter-match` attribute.\n\n## States and Variations\n\nThe App Menu doesn't contain any states or variants of its own, but applies the following to its extensions and sub-components:\n\n- App Menu uses the `app-menu` style of [IdsDrawer]('../ids-drawer/README.md').\n- Any \"Top-Level\" [IdsAccordion](../ids-accordion/README.md) panels added to the App Menu receive the `app-menu` color variant\n- Any \"nested\" IdsAccordion panels added to the App Menu receive the `sub-app-menu` color variant.\n- Any [IdsButton](../ids-button/README.md) components inside the App Menu in any slot will be converted to the `alternate` color variant.\n\n## Keyboard Guidelines\n\n- **Escape**: When focus is on an element inside an open App Menu, the App Menu will close.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-app-menu></ids-app-menu`>\nSections are now slotted for easier use.  Accordion is the main slot, and other areas (toolbars, user info, etc) are named slots.\n- Can now be imported as a single JS file and used with encapsulated styles\n- The names of some alerts (icon setting) have changed\n"}},{"name":"ids-area-chart","attributes":[{"name":"selection-elements","description":"Return chart elements that get selection","values":[]},{"name":"default-selectable","values":[]},{"name":"marker-size","description":"Set the size of the markers (aka dots/ticks) in the chart","values":[]},{"name":"initialized","values":[]},{"name":"data-loaded","values":[]},{"name":"svg","values":[]},{"name":"canvas","values":[]},{"name":"empty-message","values":[]},{"name":"legend","values":[]},{"name":"section-widths","values":[]},{"name":"section-width","values":[]},{"name":"section-heights","values":[]},{"name":"section-height","values":[]},{"name":"resize-to-parent-height","values":[]},{"name":"resize-to-parent-width","values":[]},{"name":"datasource","description":"Reference to datasource API","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"is-grouped","values":[]},{"name":"#x-max-text-width","description":"Max width for x-labels text","values":[]},{"name":"#y-max-text-width","description":"Max width for y-labels text","values":[]},{"name":"#resize-observer","description":"Holds the resize observer object","values":[]},{"name":"marker-data","description":"The marker data to use to draw the chart","values":[]},{"name":"#axis-labels-text","description":"Holds the axis labels text object","values":[]},{"name":"title","description":"Get the chart title","values":[]},{"name":"height","description":"Get the chart height","values":[]},{"name":"horizontal","description":"Get the horizontal orientation state","values":[]},{"name":"width","description":"Get the chart width","values":[]},{"name":"chart-container","description":"Get the chart container element","values":[]},{"name":"margins","description":"Get the chart margins","values":[]},{"name":"left-rotate-margin","description":"Get left rotate margin for rotated labels","values":[]},{"name":"right-rotate-margin","description":"Get right rotate margin for rotated labels","values":[]},{"name":"bottom-rotate-margin","description":"Get bottom rotate margin for rotated labels","values":[]},{"name":"axis-labels-margin","description":"Get axis labels margin values","values":[]},{"name":"text-widths","description":"Get text widths for chart dimensions","values":[]},{"name":"data","description":"Get the chart data","values":[]},{"name":"y-axis-min","description":"Get the minimum value on the y axis","values":[]},{"name":"ticks","description":"Get the number of ticks to show","values":[]},{"name":"show-tooltip","description":"Get the show tooltip state","values":[]},{"name":"show-vertical-grid-lines","description":"Get the show vertical grid lines state","values":[]},{"name":"show-horizontal-grid-lines","description":"Get the show horizontal grid lines state","values":[]},{"name":"colors","description":"Get the colors series being used in this chart","values":[]},{"name":"x-axis-formatter","description":"Get the x axis formatter","values":[]},{"name":"y-axis-formatter","description":"Get the y axis formatter","values":[]},{"name":"cubic-bezier","description":"Get a reusable snippet to ease the animation","values":[]},{"name":"animated","description":"Get the animation state","values":[]},{"name":"animation-speed","description":"Get the animation speed","values":[]},{"name":"align-xlabels","description":"Get the x axis label alignment","values":[]},{"name":"stacked","description":"Get the stacked state","values":[]},{"name":"axis-label-bottom","description":"Get the bottom axis label text","values":[]},{"name":"axis-label-end","description":"Get the end axis label text","values":[]},{"name":"axis-label-margin","description":"Get the margin for axis label text","values":[]},{"name":"axis-label-start","description":"Get the start axis label text","values":[]},{"name":"axis-label-top","description":"Get the top axis label text","values":[]},{"name":"rotate-name-labels","description":"Get the rotation for the axis name label text","values":[]},{"name":"use-log-scale","description":"Get the log scale state","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-area-chart\n\n## Description\n\nAn area chart like a line chart is used to displays information as a series of data points connected by straight line segments. Often area charts are used to show trends. Area charts should generally have more than one series to make a comparison. Users can interact by clicking or tapping on areas to drill in on a certain series of data. Users can also interact by hovering data points to reveal additional information in a tooltip.\n\nIt may be easier to see and understand the data with the more colorful area chart instead of a line chart if the differences between your data values are large enough to be displayed visually.\n\n## Use Cases\n\n- Display large differences between your data points\n- Show multiple values over time\n- Plot data over a longer period of time\n- Explain how multiple data points relate to the total value\n\n## Usage Considerations\n\n- Do not show too many areas at once as it may be difficult to interpret.\n- Hover tooltips should only be used to reveal additional non-critical information.\n- Area (and line) charts should not be used not show different groups of data.\n\n## Terminology\n\n- **Marker**: A UI embellishments that shows the data points (i.e. the dots on a line chart).\n- **Area**: The filled / colored area of the lines below the marker\n- **Domain**: The domain is all x-values (the values of the graph from left to right)\n- **Range**: The domain is all y-values (the values of the graph from down to up)\n- **Scale**: The range of values in the graph (the values of the graph from down to up) and the amount of steps between each value.\n\n## Features (With Code Examples)\n\nAn area chart is defined with the custom element and width and height.\n\n```html\n<ids-area-chart title=\"An area chart showing component usage\" width=\"800\" height=\"500\"></ids-area-chart>\n```\n\nDatasets can be added to the area chart by passing in an array of objects. Each object must have a `data` and object with `name` and `values` to form the data points. Also a name should be given for each data object which will be used as the legend text. The `shortName` is used to show the short name of the legend text and the `abbrName` is used to show an even shorter name of the legend text in responsive situations.\n\n```js\nconst lineData2 = [{\n  data: [{\n    name: 'Jan',\n    value: 1\n  }, {\n    name: 'Feb',\n    value: 2\n  }, {\n    name: 'Mar',\n    value: 3\n  }, {\n    name: 'Apr',\n    value: 5\n  }, {\n    name: 'May',\n    value: 7\n  }, {\n    name: 'Jun',\n    value: 10\n  }],\n  name: 'Component A',\n  shortName: 'Comp A',\n  abbrName: 'A',\n}, {\n  data: [{\n    name: 'Jan',\n    value: 0\n  }, {\n    name: 'Feb',\n    value: 4\n  }, {\n    name: 'Mar',\n    value: 2\n  }, {\n    name: 'Apr',\n    value: 6\n  }, {\n    name: 'May',\n    value: 8\n  }, {\n    name: 'Jun',\n    value: 20\n  }],\n  name: 'Component B',\n  shortName: 'Comp B',\n  abbrName: 'B',\n}];\n\ndocument.querySelector('ids-line-chart').data = lineData;\n```\n\nAnother type of chart you can use is a sequential color chart. A sequence of colors is used to represent various concepts of range in low-high density, quantity, and concentration situations. I.E. The data is highly related and should be represented with a single color.\n\nTo achieve this it is recommended to use the `color` setting and pick one of the Ids Colors in the color palette and use variables in its range. For example:\n\n```js\n[{\n   \"data\": [],\n   \"name\": \"Component A\",\n   \"color\": \"var(--ids-color-blue-60)\n }, {\n   \"data\": [],\n   \"name\": \"Component B\",\n   \"shortName\": \"Comp B\",\n   \"abbreviatedName\": \"B\",\n   \"color\": \"var(--ids-color-blue-40)\"\n }, {\n   \"data\": [{\n   ],\n   \"name\": \"Component C\",\n   \"color\": \"var(--ids-color-blue-20)\"\n }]\n```\n\n## Class Hierarchy\n\n- IdsAreaChart\n  - IdsLineChart\n    - IdsAxisChart\n      - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Data Settings\n\n(See Line Chart and Axis Chart Settings for more information)\n\n## Settings\n\n(See Line Chart and Axis Chart Settings for more information)\n\n## Events\n\n(See Line Chart and Axis Chart Settings for more information)\n\n## Methods\n\n(See Line Chart and Axis Chart Settings for more information)\n\n## Themeable Parts\n\n- `svg` the outside svg element\n- `marker` each dots/marker element in the chart\n- `lines` each line element in the chart\n\n## Animation\n\nThe line rise along the y-axis from 0 to the appropriate values. The area below the line fills up as the line rises.\n\n## States and Variations\n\n(See Line Chart and Axis Chart Settings for more information)\n\n## Keyboard Guidelines\n\n(See Line Chart and Axis Chart Settings for more information)\n\n## Responsive Guidelines\n\n- The area chart will fill the size of its parent container and readjust when the window is resized.\n\n## Converting from Previous Versions (Breaking Changes)\n\n- 4.x: The area chart was added after version 3.6 so new in 4.x\n- 5.x: Area Chart have all new markup and classes for web components but the data is still the same except for a few changes.\n  - `shortName` is now `shortName`\n  - `abbreviatedName` is now `abbrName`\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information.\n\n## Regional Considerations\n\nChart labels should be localized in the current language. The chart will flip in RTL mode. For some color blind users the svg patterns can be used.\n"}},{"name":"ids-action-panel","attributes":[{"name":"toolbar","values":[]},{"name":"z-count","values":[]},{"name":"should-update","values":[]},{"name":"on-button-click","values":[]},{"name":"ro","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"#visible","values":[]},{"name":"global-keydown-listener","values":[]},{"name":"auto-focus","description":"Get whether to focus the first input element instead of the close button","values":[]},{"name":"focus-target","description":"Get whether to focus the target element for modal","values":[]},{"name":"aria-label-content","description":"Get the content for ARIA labels","values":[]},{"name":"buttons","description":"Get the currently slotted buttons","values":[]},{"name":"button-set","description":"Get the current button group","values":[]},{"name":"title-slot","description":"Get the slotted title element or the default title slot","values":[]},{"name":"modal-content-el","description":"Get the Modal's content wrapper element","values":[]},{"name":"fullsize","description":"Get the breakpoint at which the Modal will change from normal mode to fullsize mode","values":[]},{"name":"show-close-button","description":"Get whether the close button is shown","values":[]},{"name":"suppress-enter-key","description":"Get whether the Enter key is suppressed from dismissing the modal","values":[]},{"name":"close-button","description":"Get the close button element","values":[]},{"name":"overlay","description":"Sets the overlay element for the modal","values":[]},{"name":"message-title","description":"Sets the content of the message's title","values":[]},{"name":"scrollable","description":"Get the modal scrollable setting","values":[]},{"name":"visible","description":"Sets whether the Modal is visible","values":[]},{"name":"is-service-message","values":[]},{"name":"click-outside-to-close","description":"Set whether or not to allow the modal to close by clicking outside","values":[]},{"name":"height","description":"Get the modal height","values":[]},{"name":"width","description":"Get the modal width","values":[]},{"name":"overflow","description":"Get the overflow behavior for the modal content","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-action-panel\n\nThe ids-action-panel displays complex forms inside of a [ids-modal](../ids-modal/README.md) area.\n\n## Features (With Code Examples)\n\nAction Panels with no content look similar to a modal, presenting a floating content area over top of the page:\n\n```html\n<ids-action-panel id=\"my-cap\"></ids-action-panel>\n```\n\nOne main difference between the Modal and Action Panel is the `toolbar` slot. It's placed where the modal title normally appears, and is styled similar to that of the [ids-header]('../ids-header/README.md). The contents of this slot should be [ids-toolbar]('../ids-toolbar/README.md) marked for the `toolbar` slot:\n\n```html\n<ids-action-panel id=\"my-cap\">\n    <ids-toolbar id=\"cap-toolbar\" slot=\"toolbar\">\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\" type=\"h2\">Company Information</ids-text>\n        </ids-toolbar-section>\n\n        <ids-toolbar-section type=\"buttonset\" align=\"end\">\n            <ids-button id=\"btn-save\" icon=\"save\" no-padding>\n                <ids-text font-weight=\"semi-bold\">Save</ids-text>\n            </ids-button>\n            <ids-separator vertical=\"true\"></ids-separator>\n            <ids-button id=\"btn-close\" icon=\"close\" no-padding>\n                <ids-text font-weight=\"semi-bold\">Close</ids-text>\n            </ids-button>\n        </ids-toolbar-section>\n    </ids-toolbar>\n</ids-action-panel>\n```\n\nSimilar to the modal, any content not marked for a slot will be present inside the main content area of the action panel:\n\n```html\n<ids-action-panel id=\"my-cap\">\n    <form>\n        <ids-dropdown id=\"cap-dd-template\" label=\"Template\" value=\"1\">\n            <ids-list-box>\n                <ids-list-box-option value=\"\">None</ids-list-box-option>\n                <ids-list-box-option value=\"1\" selected>Template #1</ids-list-box-option>\n                <ids-list-box-option value=\"2\">3568</ids-list-box-option>\n            </ids-list-box>\n        </ids-dropdown>\n\n        <ids-textarea id=\"cap-textarea-notes\" label=\"Notes\"></ids-textarea>\n    </form>\n</ids-action-panel>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Did not exist in 3.X, but any complex modals should be changed to use this.\n\n**4.x to 5.x**\n\n- 5.x: CAP is now a web component, and is functionally similar to [IdsModal](../ids-modal/README.md), using the same API and events.  The construction of the Modal is declarative and done mostly through HTML markup.\n- Markup has changed to a custom element `<ids-action-panel></ids-action-panel>`\n- Component is now fully defined in HTML Markup and using slots\n- To hide and show the CAP, use the `visible` property `$('ids-action-panel').visible = false`\n"}},{"name":"ids-avatar","attributes":[{"name":"type","description":"Set the type","values":[]},{"name":"value","description":"Set the value","values":[]},{"name":"user-status","description":"Set the user status","values":[]},{"name":"src","description":"Set the src","values":[]},{"name":"alt","description":"Set the alt","values":[]},{"name":"color","description":"Set the color","values":[]}],"description":{"kind":"markdown","value":"# ids-avatar\n\n## Description\n\nThe ids-avatar is similar to a `<img>` HTML element, with advanced options for initials, modules and images. See more [usage details](https://design.infor.com/components/avatar).\n\n## Use Cases\n\n- Use avatars to help users easily recognize their own profiles or those of team members.\n- They’re typically placed in top bars or side panels, allowing quick access to profile settings or account menus.\n\n## Terminology\n\n- **Avatar**: The UX element that is the container for a module, initials or an image\n\n## Methods\n\n- `generateStatusIcon(SVGDefsElement | string)` Generates an HTML string containing the status icon based on the user's status.\n\n## Features (With Code Examples)\n\nFor an image type avatar\n\n```html\n<ids-avatar type=\"image\" src=\"/src/assets/images/10.jpg\" alt=\"Avatar Photo\"></ids-avatar>\n```\n\nFor a module type avatar\n\n```html\n<ids-avatar type=\"module\" color=\"blue\">NS</ids-avatar>\n```\n\nFor a initials type avatar\n\n```html\n<ids-avatar type=\"initials\" color=\"blue\">NS</ids-avatar>\n```\n\n## Types of Colors\n\n- Blue\n- Green\n- Orange\n- Red\n- Gray\n- Teal\n- Purple\n\nTo change color follow the template below\n\n```html\n<ids-avatar type=\"initials\" color=\"red\">NS</ids-avatar>\n```\n\n## Types of Statuses\n\n- Available\n- Away\n- Busy\n- Do Not Disturb\n- Unknown\n- Meeting\n\nTo change or add status follow the template below\n\n```html\n<ids-avatar type=\"initials\" color=\"blue\" user-status=\"available\">NS</ids-avatar>\n```\n\n## Settings\n\n- `type` {string} Sets whether avatar will be a module, initials or image, use `value='' | undefined | null`.\n- `value` {string} Sets value of the avatar, use `value='' | undefined | null`.\n- `src` {string} Sets src for the image of avatar, use `value='' | undefined | null`.\n- `alt` {string} Sets alt text in case the image is not available, use `value='' | undefined | null`.\n- `userStatus` {string} Sets the status of the avatar, use `value='' | undefined | null`.\n\n## Designs\n\n[Design Specs](https://www.figma.com/design/jtITSyWj4WgExjO6abjTpE/%5BIDS%5D-5.0-Library?m=auto&node-id=2-6&t=9araFmCahH9uWexX-1)"}},{"name":"ids-axis-chart","attributes":[{"name":"initialized","values":[]},{"name":"data-loaded","values":[]},{"name":"svg","values":[]},{"name":"canvas","values":[]},{"name":"empty-message","values":[]},{"name":"legend","values":[]},{"name":"section-widths","values":[]},{"name":"section-width","values":[]},{"name":"section-heights","values":[]},{"name":"section-height","values":[]},{"name":"resize-to-parent-height","values":[]},{"name":"resize-to-parent-width","values":[]},{"name":"datasource","description":"Reference to datasource API","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"is-grouped","values":[]},{"name":"#x-max-text-width","description":"Max width for x-labels text","values":[]},{"name":"#y-max-text-width","description":"Max width for y-labels text","values":[]},{"name":"#resize-observer","description":"Holds the resize observer object","values":[]},{"name":"marker-data","description":"The marker data to use to draw the chart","values":[]},{"name":"#axis-labels-text","description":"Holds the axis labels text object","values":[]},{"name":"title","description":"Get the chart title","values":[]},{"name":"height","description":"Get the chart height","values":[]},{"name":"horizontal","description":"Get the horizontal orientation state","values":[]},{"name":"width","description":"Get the chart width","values":[]},{"name":"chart-container","description":"Get the chart container element","values":[]},{"name":"margins","description":"Get the chart margins","values":[]},{"name":"left-rotate-margin","description":"Get left rotate margin for rotated labels","values":[]},{"name":"right-rotate-margin","description":"Get right rotate margin for rotated labels","values":[]},{"name":"bottom-rotate-margin","description":"Get bottom rotate margin for rotated labels","values":[]},{"name":"axis-labels-margin","description":"Get axis labels margin values","values":[]},{"name":"text-widths","description":"Get text widths for chart dimensions","values":[]},{"name":"data","description":"Get the chart data","values":[]},{"name":"y-axis-min","description":"Get the minimum value on the y axis","values":[]},{"name":"ticks","description":"Get the number of ticks to show","values":[]},{"name":"show-tooltip","description":"Get the show tooltip state","values":[]},{"name":"show-vertical-grid-lines","description":"Get the show vertical grid lines state","values":[]},{"name":"show-horizontal-grid-lines","description":"Get the show horizontal grid lines state","values":[]},{"name":"colors","description":"Get the colors series being used in this chart","values":[]},{"name":"x-axis-formatter","description":"Get the x axis formatter","values":[]},{"name":"y-axis-formatter","description":"Get the y axis formatter","values":[]},{"name":"cubic-bezier","description":"Get a reusable snippet to ease the animation","values":[]},{"name":"animated","description":"Get the animation state","values":[]},{"name":"animation-speed","description":"Get the animation speed","values":[]},{"name":"align-xlabels","description":"Get the x axis label alignment","values":[]},{"name":"stacked","description":"Get the stacked state","values":[]},{"name":"axis-label-bottom","description":"Get the bottom axis label text","values":[]},{"name":"axis-label-end","description":"Get the end axis label text","values":[]},{"name":"axis-label-margin","description":"Get the margin for axis label text","values":[]},{"name":"axis-label-start","description":"Get the start axis label text","values":[]},{"name":"axis-label-top","description":"Get the top axis label text","values":[]},{"name":"rotate-name-labels","description":"Get the rotation for the axis name label text","values":[]},{"name":"use-log-scale","description":"Get the log scale state","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-axis-chart\n\n## Description\n\nThe axis chart is a chart with an x-axis and y-axis. This is the base chart object used to make line, area, column and other charts. Generally it should not be used on its own but if you have a case of making some other chart it could be used.\n\n## Use Cases\n\n- When you want a chart with x and y axis and control over whats rendered in it.\n\n## Usage Considerations\n\n- Do not show too many lines at once as it may be difficult to interpret.\n- Hover tooltips should only be used to reveal additional non-critical information.\n\n## Terminology\n\n- **Marker**: A UI embellishments that shows the data points (i.e. the dots on a line chart).\n- **Domain**: The domain is all x-values (the values of the graph from left to right)\n- **Range**: The domain is all y-values (the values of the graph from down to up)\n- **Scale**: The range of values in the graph (the values of the graph from down to up) and the amount of steps between each value.\n- **Axis**: Charts typically have two axes that are used to measure and categorize data: a vertical axis (also known as value axis or y axis), and a horizontal axis (also known as category axis or x axis).\n\n## Features (With Code Examples)\n\nA axis chart is defined with a custom element with a width and height.\n\n```html\n<ids-axis-chart title=\"A line chart showing component usage\" width=\"800\" height=\"500\"></ids-axis-chart>\n```\n\nDatasets can be added to the line chart by passing in an array of objects. Each object must have a `data` and object with `name` and `values` from the data points. Also a name should be given for each data object which will be used as the legend text. The `shortName` is used to show the short name of the legend text and the `abbrName` is used to show an even shorter name of the legend text in responsive situations.\n\n```html\nconst dataset = [{\n  data: [{\n    name: 'Jan',\n    value: 1\n  }, {\n    name: 'Feb',\n    value: 2\n  }, {\n    name: 'Mar',\n    value: 3\n  }, {\n    name: 'Apr',\n    value: 5\n  }, {\n    name: 'May',\n    value: 7\n  }, {\n    name: 'Jun',\n    value: 10\n  }],\n  name: 'Component A',\n  shortName: 'Comp A',\n  abbrName: 'A',\n}];\n\ndocument.querySelector('ids-axis-chart').data = dataset;\n```\n\nInside the chart you should provide a chartTemplate that returns the inside (markers) of the chart as svg. The `lineMarkers` element will contain the correct points and position of the markers to use based on the data/height/width/margins of the chart.\n\n```js\nchartTemplate() {\n  return `<g class=\"markers\">\n    ${this.lineMarkers().markers}\n  </g>\n  <g class=\"marker-lines\">\n    ${this.lineMarkers().lines}\n  </g>\n  <g class=\"areas\">\n    ${this.#areas()}\n  </g>`;\n}\n```\n\nYou can also customize the empty message contents but adding an `ids-empty-element` to the slot.\n\n```html\n<ids-axis-chart title=\"A line chart showing component usage\" width=\"800\" height=\"500\">\n    <ids-empty-message slot=\"empty-message\"icon=\"empty-no-data\" hidden>\n        <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data Right Now</ids-text>\n    </ids-empty-message>\n</ids-axis-chart>\n```\n\nAnother type of chart you can use is a sequential color chart. A sequence of colors is used to represent various concepts of range in low-high density, quantity, and concentration situations. I.E. The data is highly related and should be represented with a single color.\n\nTo achieve this it is recommended to use the `color` setting and pick one of the Ids Colors in the color palette and use variables in its range. For example:\n\n```js\n[{\n   \"data\": [],\n   \"name\": \"Component A\",\n   \"color\": \"var(--ids-color-blue-60)\n }, {\n   \"data\": [],\n   \"name\": \"Component B\",\n   \"shortName\": \"Comp B\",\n   \"abbreviatedName\": \"B\",\n   \"color\": \"var(--ids-color-blue-40)\"\n }, {\n   \"data\": [{\n   ],\n   \"name\": \"Component C\",\n   \"color\": \"var(--ids-color-blue-20)\"\n }]\n```\n\nYou can add axis labels all around (bottom, end, start, top).\n\n```html\n<ids-axis-chart\n  axis-label-bottom=\"Bottom axis label\"\n  axis-label-end=\"End axis label\"\n  axis-label-start=\"Start axis label\"\n  axis-label-top=\"Top axis label\"\n  width=\"700\"\n  height=\"400\"\n  id=\"axis-label-example\"\n  title=\"A axis chart showing component usage with axis-label\"\n></ids-axis-chart>\n```\n\nShowing component as horizontal orientation.\n\n```html\n<ids-axis-chart\n  horizontal\n  width=\"700\"\n  height=\"400\"\n  id=\"axis-horizontal-example\"\n  title=\"Horizontal example\"\n></ids-axis-chart>\n```\n\n## Class Hierarchy\n\n- IdsAxisChart\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n  IdsChartLegendMixin\n  IdsChartSelectionMixin\n\n## Data Settings\n\nThe following data attributes can be used on the data passed to a chart.\n\n- `data` {object} A data group with one or more `name` and `value` pairs.\n- `name` {string} The name for the legend text and tooltip representing the slice. If the name is left null or undefined the legend item will not be shown.\n- `shortName` {string} The short name of the legend text.\n- `abbrName` {string} A very short name of the legend text (one or two characters).\n- `color` {string} The color of this axis group. This can be either a hex value for example `#FF0000` or a color name like `red` or an ids variable like `var(--ids-color-blue-20)`.\n- `tooltip` {string} The custom tooltip string (as static text). See the tooltip section for more information.\n\n## Settings\n\n- `title` {string} Sets the internal title of the chart (for accessibility). It is recommended to mention the chart type for accessibility readout. For example: `Line chart showing invoice history`.\n- `height` {number|string} Generally this is calculated automatically but can be used to set a specific height. Can also be set to `'fluid'` to make the chart resize with its container, or `'inherit'` for similar behavior.\n- `width` {number|string} Generally this is calculated automatically but can be used to set a specific width. Can also be set to `'fluid'` to make the chart resize with its container, or `'inherit'` for similar behavior.\n- `textWidths` {object} Generally this is calculated automatically but can be overridden by setting the amount of space to allocate for margins on the `{ left, right, top, bottom }` sides.\n- `xAxisMin` {number}  Set the minimum value on the x axis  (default: 0)\n- `yAxisMin` {number}  Set the minimum value on the y axis  (default: 0)\n- `showVerticalGridLines` {boolean}  Show the vertical axis grid lines (default: false)\n- `showHorizontalGridLines` {boolean}  Show the horizontal axis grid lines (default: true)\n- `yAxisFormatter` {object | Function} Sets the format on the y axis items. This can either be settings that are passed to `Intl.NumberFormat` or a formatter function. The formatter function will get three parameters (value, data, api) and should return a string based on the axis value. The y axis is not always a number so it does not default to `Intl.NumberFormat`. The default is `{ notation: 'compact', compactDisplay: 'short' }`.\n- `xAxisFormatter` {Function} Sets the format on the x axis items. The formatter function will get three parameters (value, data, api) and should return a string based on the axis value. The x axis is not always a number so it does not default to `Intl.NumberFormat`. See the [Intl.NumberFormat api](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat) for more details and examples on formatting options.\n- `horizontal` {boolean} Flips the orientation to horizontal, supported `Axis` and `Bar` type charts.\n- `selectable` {boolean} Sets the selection mode.\n- `axisLabelBottom` {string} Option to add bottom axis label.\n- `axisLabelEnd` {string} Option to add horizontally end side axis label.\n- `axisLabelStart` {string} Option to add horizontally start side axis label.\n- `axisLabelTop` {string} Option to add top axis label.\n- `axisLabelMargin` {number} Axis label margin value.\n- `rotateNameLabels` {string|number} Sets the rotation of the labels on the name axis (style guide recommends -60 but you may want to tweak it based on labels. The `shortName` and `abbreviatedName` labels do not work with this setting.\n- `ticks` {number} Sets the number of ticks to show, to either reduce or show more ticks on the axis. This is an approximation based on the shape of the data and height of the chart the exact number of ticks specified might be altered to fit the algorithm.\n\n## Events\n\n- `rendered` Fires each time the chart is rendered or rerendered (on resize).\n- `beforeselected` Fires before selected, you can return false in the response to veto.\n- `selected` Fires after selected.\n- `beforedeselected` Fires before deselected, you can return false in the response to veto.\n- `deselected` Fires after deselected.\n\n## Themeable Parts\n\n- `container` the outer container div element\n- `chart` the svg outer element\n\n## States and Variations\n\n- Theme\n- Legends\n- Selectable\n\n## Responsive Guidelines\n\n- Sizes to the given width/height defaulting to that of the immediate parent.\n\n## Tooltip Customizations\n\nYou can customize the tooltip by changing some of the API settings. For just a static tooltip you can use the `tooltip` setting in the data at the same place as the `name` property.\n\nIf you need to change which items get tooltips you can override `tooltipElements` getter.\n\n```js\ntooltipElements() {\n  return this.container.querySelectorAll('rect.bar');\n}\n\nIf you need to change the tooltip contents you can override the `tooltipTemplate` function.\n\n```js\ntooltipTemplate() {\n  return '<b>${label}</b> ${value}';\n}\n```\n\nOr you can modify the tooltip in the slot.\n\n## Why Not Canvas?\n\nWe decided to use SVG over Canvas because of the following reasons:\n\n- Canvas is not part of the DOM thus not accessible by screen readers.\n- Canvas is more difficult to make interactive and responsive.\n- Would be generally more maintainable.\n- SVG output is easier to debug.\n"}},{"name":"ids-chart-colors","description":{"kind":"markdown","value":"# ids-axis-chart\n\n## Description\n\nThe axis chart is a chart with an x-axis and y-axis. This is the base chart object used to make line, area, column and other charts. Generally it should not be used on its own but if you have a case of making some other chart it could be used.\n\n## Use Cases\n\n- When you want a chart with x and y axis and control over whats rendered in it.\n\n## Usage Considerations\n\n- Do not show too many lines at once as it may be difficult to interpret.\n- Hover tooltips should only be used to reveal additional non-critical information.\n\n## Terminology\n\n- **Marker**: A UI embellishments that shows the data points (i.e. the dots on a line chart).\n- **Domain**: The domain is all x-values (the values of the graph from left to right)\n- **Range**: The domain is all y-values (the values of the graph from down to up)\n- **Scale**: The range of values in the graph (the values of the graph from down to up) and the amount of steps between each value.\n- **Axis**: Charts typically have two axes that are used to measure and categorize data: a vertical axis (also known as value axis or y axis), and a horizontal axis (also known as category axis or x axis).\n\n## Features (With Code Examples)\n\nA axis chart is defined with a custom element with a width and height.\n\n```html\n<ids-axis-chart title=\"A line chart showing component usage\" width=\"800\" height=\"500\"></ids-axis-chart>\n```\n\nDatasets can be added to the line chart by passing in an array of objects. Each object must have a `data` and object with `name` and `values` from the data points. Also a name should be given for each data object which will be used as the legend text. The `shortName` is used to show the short name of the legend text and the `abbrName` is used to show an even shorter name of the legend text in responsive situations.\n\n```html\nconst dataset = [{\n  data: [{\n    name: 'Jan',\n    value: 1\n  }, {\n    name: 'Feb',\n    value: 2\n  }, {\n    name: 'Mar',\n    value: 3\n  }, {\n    name: 'Apr',\n    value: 5\n  }, {\n    name: 'May',\n    value: 7\n  }, {\n    name: 'Jun',\n    value: 10\n  }],\n  name: 'Component A',\n  shortName: 'Comp A',\n  abbrName: 'A',\n}];\n\ndocument.querySelector('ids-axis-chart').data = dataset;\n```\n\nInside the chart you should provide a chartTemplate that returns the inside (markers) of the chart as svg. The `lineMarkers` element will contain the correct points and position of the markers to use based on the data/height/width/margins of the chart.\n\n```js\nchartTemplate() {\n  return `<g class=\"markers\">\n    ${this.lineMarkers().markers}\n  </g>\n  <g class=\"marker-lines\">\n    ${this.lineMarkers().lines}\n  </g>\n  <g class=\"areas\">\n    ${this.#areas()}\n  </g>`;\n}\n```\n\nYou can also customize the empty message contents but adding an `ids-empty-element` to the slot.\n\n```html\n<ids-axis-chart title=\"A line chart showing component usage\" width=\"800\" height=\"500\">\n    <ids-empty-message slot=\"empty-message\"icon=\"empty-no-data\" hidden>\n        <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data Right Now</ids-text>\n    </ids-empty-message>\n</ids-axis-chart>\n```\n\nAnother type of chart you can use is a sequential color chart. A sequence of colors is used to represent various concepts of range in low-high density, quantity, and concentration situations. I.E. The data is highly related and should be represented with a single color.\n\nTo achieve this it is recommended to use the `color` setting and pick one of the Ids Colors in the color palette and use variables in its range. For example:\n\n```js\n[{\n   \"data\": [],\n   \"name\": \"Component A\",\n   \"color\": \"var(--ids-color-blue-60)\n }, {\n   \"data\": [],\n   \"name\": \"Component B\",\n   \"shortName\": \"Comp B\",\n   \"abbreviatedName\": \"B\",\n   \"color\": \"var(--ids-color-blue-40)\"\n }, {\n   \"data\": [{\n   ],\n   \"name\": \"Component C\",\n   \"color\": \"var(--ids-color-blue-20)\"\n }]\n```\n\nYou can add axis labels all around (bottom, end, start, top).\n\n```html\n<ids-axis-chart\n  axis-label-bottom=\"Bottom axis label\"\n  axis-label-end=\"End axis label\"\n  axis-label-start=\"Start axis label\"\n  axis-label-top=\"Top axis label\"\n  width=\"700\"\n  height=\"400\"\n  id=\"axis-label-example\"\n  title=\"A axis chart showing component usage with axis-label\"\n></ids-axis-chart>\n```\n\nShowing component as horizontal orientation.\n\n```html\n<ids-axis-chart\n  horizontal\n  width=\"700\"\n  height=\"400\"\n  id=\"axis-horizontal-example\"\n  title=\"Horizontal example\"\n></ids-axis-chart>\n```\n\n## Class Hierarchy\n\n- IdsAxisChart\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n  IdsChartLegendMixin\n  IdsChartSelectionMixin\n\n## Data Settings\n\nThe following data attributes can be used on the data passed to a chart.\n\n- `data` {object} A data group with one or more `name` and `value` pairs.\n- `name` {string} The name for the legend text and tooltip representing the slice. If the name is left null or undefined the legend item will not be shown.\n- `shortName` {string} The short name of the legend text.\n- `abbrName` {string} A very short name of the legend text (one or two characters).\n- `color` {string} The color of this axis group. This can be either a hex value for example `#FF0000` or a color name like `red` or an ids variable like `var(--ids-color-blue-20)`.\n- `tooltip` {string} The custom tooltip string (as static text). See the tooltip section for more information.\n\n## Settings\n\n- `title` {string} Sets the internal title of the chart (for accessibility). It is recommended to mention the chart type for accessibility readout. For example: `Line chart showing invoice history`.\n- `height` {number|string} Generally this is calculated automatically but can be used to set a specific height. Can also be set to `'fluid'` to make the chart resize with its container, or `'inherit'` for similar behavior.\n- `width` {number|string} Generally this is calculated automatically but can be used to set a specific width. Can also be set to `'fluid'` to make the chart resize with its container, or `'inherit'` for similar behavior.\n- `textWidths` {object} Generally this is calculated automatically but can be overridden by setting the amount of space to allocate for margins on the `{ left, right, top, bottom }` sides.\n- `xAxisMin` {number}  Set the minimum value on the x axis  (default: 0)\n- `yAxisMin` {number}  Set the minimum value on the y axis  (default: 0)\n- `showVerticalGridLines` {boolean}  Show the vertical axis grid lines (default: false)\n- `showHorizontalGridLines` {boolean}  Show the horizontal axis grid lines (default: true)\n- `yAxisFormatter` {object | Function} Sets the format on the y axis items. This can either be settings that are passed to `Intl.NumberFormat` or a formatter function. The formatter function will get three parameters (value, data, api) and should return a string based on the axis value. The y axis is not always a number so it does not default to `Intl.NumberFormat`. The default is `{ notation: 'compact', compactDisplay: 'short' }`.\n- `xAxisFormatter` {Function} Sets the format on the x axis items. The formatter function will get three parameters (value, data, api) and should return a string based on the axis value. The x axis is not always a number so it does not default to `Intl.NumberFormat`. See the [Intl.NumberFormat api](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat) for more details and examples on formatting options.\n- `horizontal` {boolean} Flips the orientation to horizontal, supported `Axis` and `Bar` type charts.\n- `selectable` {boolean} Sets the selection mode.\n- `axisLabelBottom` {string} Option to add bottom axis label.\n- `axisLabelEnd` {string} Option to add horizontally end side axis label.\n- `axisLabelStart` {string} Option to add horizontally start side axis label.\n- `axisLabelTop` {string} Option to add top axis label.\n- `axisLabelMargin` {number} Axis label margin value.\n- `rotateNameLabels` {string|number} Sets the rotation of the labels on the name axis (style guide recommends -60 but you may want to tweak it based on labels. The `shortName` and `abbreviatedName` labels do not work with this setting.\n- `ticks` {number} Sets the number of ticks to show, to either reduce or show more ticks on the axis. This is an approximation based on the shape of the data and height of the chart the exact number of ticks specified might be altered to fit the algorithm.\n\n## Events\n\n- `rendered` Fires each time the chart is rendered or rerendered (on resize).\n- `beforeselected` Fires before selected, you can return false in the response to veto.\n- `selected` Fires after selected.\n- `beforedeselected` Fires before deselected, you can return false in the response to veto.\n- `deselected` Fires after deselected.\n\n## Themeable Parts\n\n- `container` the outer container div element\n- `chart` the svg outer element\n\n## States and Variations\n\n- Theme\n- Legends\n- Selectable\n\n## Responsive Guidelines\n\n- Sizes to the given width/height defaulting to that of the immediate parent.\n\n## Tooltip Customizations\n\nYou can customize the tooltip by changing some of the API settings. For just a static tooltip you can use the `tooltip` setting in the data at the same place as the `name` property.\n\nIf you need to change which items get tooltips you can override `tooltipElements` getter.\n\n```js\ntooltipElements() {\n  return this.container.querySelectorAll('rect.bar');\n}\n\nIf you need to change the tooltip contents you can override the `tooltipTemplate` function.\n\n```js\ntooltipTemplate() {\n  return '<b>${label}</b> ${value}';\n}\n```\n\nOr you can modify the tooltip in the slot.\n\n## Why Not Canvas?\n\nWe decided to use SVG over Canvas because of the following reasons:\n\n- Canvas is not part of the DOM thus not accessible by screen readers.\n- Canvas is more difficult to make interactive and responsive.\n- Would be generally more maintainable.\n- SVG output is easier to debug.\n"}},{"name":"ids-nice-scale","attributes":[{"name":"#min-point","description":"The calculated or provided min value to show","values":[]},{"name":"#max-point","description":"The calculated or provided max value","values":[]},{"name":"#max-ticks","description":"The calculated or provided max ticks","values":[]},{"name":"#range","description":"The calculated tick spacing","values":[]},{"name":"tick-spacing","description":"The calculated tick spacing","values":[]},{"name":"nice-min","description":"The calculated nice min value","values":[]},{"name":"nice-max","description":"The calculated nice max value","values":[]}],"description":{"kind":"markdown","value":"# ids-axis-chart\n\n## Description\n\nThe axis chart is a chart with an x-axis and y-axis. This is the base chart object used to make line, area, column and other charts. Generally it should not be used on its own but if you have a case of making some other chart it could be used.\n\n## Use Cases\n\n- When you want a chart with x and y axis and control over whats rendered in it.\n\n## Usage Considerations\n\n- Do not show too many lines at once as it may be difficult to interpret.\n- Hover tooltips should only be used to reveal additional non-critical information.\n\n## Terminology\n\n- **Marker**: A UI embellishments that shows the data points (i.e. the dots on a line chart).\n- **Domain**: The domain is all x-values (the values of the graph from left to right)\n- **Range**: The domain is all y-values (the values of the graph from down to up)\n- **Scale**: The range of values in the graph (the values of the graph from down to up) and the amount of steps between each value.\n- **Axis**: Charts typically have two axes that are used to measure and categorize data: a vertical axis (also known as value axis or y axis), and a horizontal axis (also known as category axis or x axis).\n\n## Features (With Code Examples)\n\nA axis chart is defined with a custom element with a width and height.\n\n```html\n<ids-axis-chart title=\"A line chart showing component usage\" width=\"800\" height=\"500\"></ids-axis-chart>\n```\n\nDatasets can be added to the line chart by passing in an array of objects. Each object must have a `data` and object with `name` and `values` from the data points. Also a name should be given for each data object which will be used as the legend text. The `shortName` is used to show the short name of the legend text and the `abbrName` is used to show an even shorter name of the legend text in responsive situations.\n\n```html\nconst dataset = [{\n  data: [{\n    name: 'Jan',\n    value: 1\n  }, {\n    name: 'Feb',\n    value: 2\n  }, {\n    name: 'Mar',\n    value: 3\n  }, {\n    name: 'Apr',\n    value: 5\n  }, {\n    name: 'May',\n    value: 7\n  }, {\n    name: 'Jun',\n    value: 10\n  }],\n  name: 'Component A',\n  shortName: 'Comp A',\n  abbrName: 'A',\n}];\n\ndocument.querySelector('ids-axis-chart').data = dataset;\n```\n\nInside the chart you should provide a chartTemplate that returns the inside (markers) of the chart as svg. The `lineMarkers` element will contain the correct points and position of the markers to use based on the data/height/width/margins of the chart.\n\n```js\nchartTemplate() {\n  return `<g class=\"markers\">\n    ${this.lineMarkers().markers}\n  </g>\n  <g class=\"marker-lines\">\n    ${this.lineMarkers().lines}\n  </g>\n  <g class=\"areas\">\n    ${this.#areas()}\n  </g>`;\n}\n```\n\nYou can also customize the empty message contents but adding an `ids-empty-element` to the slot.\n\n```html\n<ids-axis-chart title=\"A line chart showing component usage\" width=\"800\" height=\"500\">\n    <ids-empty-message slot=\"empty-message\"icon=\"empty-no-data\" hidden>\n        <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data Right Now</ids-text>\n    </ids-empty-message>\n</ids-axis-chart>\n```\n\nAnother type of chart you can use is a sequential color chart. A sequence of colors is used to represent various concepts of range in low-high density, quantity, and concentration situations. I.E. The data is highly related and should be represented with a single color.\n\nTo achieve this it is recommended to use the `color` setting and pick one of the Ids Colors in the color palette and use variables in its range. For example:\n\n```js\n[{\n   \"data\": [],\n   \"name\": \"Component A\",\n   \"color\": \"var(--ids-color-blue-60)\n }, {\n   \"data\": [],\n   \"name\": \"Component B\",\n   \"shortName\": \"Comp B\",\n   \"abbreviatedName\": \"B\",\n   \"color\": \"var(--ids-color-blue-40)\"\n }, {\n   \"data\": [{\n   ],\n   \"name\": \"Component C\",\n   \"color\": \"var(--ids-color-blue-20)\"\n }]\n```\n\nYou can add axis labels all around (bottom, end, start, top).\n\n```html\n<ids-axis-chart\n  axis-label-bottom=\"Bottom axis label\"\n  axis-label-end=\"End axis label\"\n  axis-label-start=\"Start axis label\"\n  axis-label-top=\"Top axis label\"\n  width=\"700\"\n  height=\"400\"\n  id=\"axis-label-example\"\n  title=\"A axis chart showing component usage with axis-label\"\n></ids-axis-chart>\n```\n\nShowing component as horizontal orientation.\n\n```html\n<ids-axis-chart\n  horizontal\n  width=\"700\"\n  height=\"400\"\n  id=\"axis-horizontal-example\"\n  title=\"Horizontal example\"\n></ids-axis-chart>\n```\n\n## Class Hierarchy\n\n- IdsAxisChart\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n  IdsChartLegendMixin\n  IdsChartSelectionMixin\n\n## Data Settings\n\nThe following data attributes can be used on the data passed to a chart.\n\n- `data` {object} A data group with one or more `name` and `value` pairs.\n- `name` {string} The name for the legend text and tooltip representing the slice. If the name is left null or undefined the legend item will not be shown.\n- `shortName` {string} The short name of the legend text.\n- `abbrName` {string} A very short name of the legend text (one or two characters).\n- `color` {string} The color of this axis group. This can be either a hex value for example `#FF0000` or a color name like `red` or an ids variable like `var(--ids-color-blue-20)`.\n- `tooltip` {string} The custom tooltip string (as static text). See the tooltip section for more information.\n\n## Settings\n\n- `title` {string} Sets the internal title of the chart (for accessibility). It is recommended to mention the chart type for accessibility readout. For example: `Line chart showing invoice history`.\n- `height` {number|string} Generally this is calculated automatically but can be used to set a specific height. Can also be set to `'fluid'` to make the chart resize with its container, or `'inherit'` for similar behavior.\n- `width` {number|string} Generally this is calculated automatically but can be used to set a specific width. Can also be set to `'fluid'` to make the chart resize with its container, or `'inherit'` for similar behavior.\n- `textWidths` {object} Generally this is calculated automatically but can be overridden by setting the amount of space to allocate for margins on the `{ left, right, top, bottom }` sides.\n- `xAxisMin` {number}  Set the minimum value on the x axis  (default: 0)\n- `yAxisMin` {number}  Set the minimum value on the y axis  (default: 0)\n- `showVerticalGridLines` {boolean}  Show the vertical axis grid lines (default: false)\n- `showHorizontalGridLines` {boolean}  Show the horizontal axis grid lines (default: true)\n- `yAxisFormatter` {object | Function} Sets the format on the y axis items. This can either be settings that are passed to `Intl.NumberFormat` or a formatter function. The formatter function will get three parameters (value, data, api) and should return a string based on the axis value. The y axis is not always a number so it does not default to `Intl.NumberFormat`. The default is `{ notation: 'compact', compactDisplay: 'short' }`.\n- `xAxisFormatter` {Function} Sets the format on the x axis items. The formatter function will get three parameters (value, data, api) and should return a string based on the axis value. The x axis is not always a number so it does not default to `Intl.NumberFormat`. See the [Intl.NumberFormat api](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat) for more details and examples on formatting options.\n- `horizontal` {boolean} Flips the orientation to horizontal, supported `Axis` and `Bar` type charts.\n- `selectable` {boolean} Sets the selection mode.\n- `axisLabelBottom` {string} Option to add bottom axis label.\n- `axisLabelEnd` {string} Option to add horizontally end side axis label.\n- `axisLabelStart` {string} Option to add horizontally start side axis label.\n- `axisLabelTop` {string} Option to add top axis label.\n- `axisLabelMargin` {number} Axis label margin value.\n- `rotateNameLabels` {string|number} Sets the rotation of the labels on the name axis (style guide recommends -60 but you may want to tweak it based on labels. The `shortName` and `abbreviatedName` labels do not work with this setting.\n- `ticks` {number} Sets the number of ticks to show, to either reduce or show more ticks on the axis. This is an approximation based on the shape of the data and height of the chart the exact number of ticks specified might be altered to fit the algorithm.\n\n## Events\n\n- `rendered` Fires each time the chart is rendered or rerendered (on resize).\n- `beforeselected` Fires before selected, you can return false in the response to veto.\n- `selected` Fires after selected.\n- `beforedeselected` Fires before deselected, you can return false in the response to veto.\n- `deselected` Fires after deselected.\n\n## Themeable Parts\n\n- `container` the outer container div element\n- `chart` the svg outer element\n\n## States and Variations\n\n- Theme\n- Legends\n- Selectable\n\n## Responsive Guidelines\n\n- Sizes to the given width/height defaulting to that of the immediate parent.\n\n## Tooltip Customizations\n\nYou can customize the tooltip by changing some of the API settings. For just a static tooltip you can use the `tooltip` setting in the data at the same place as the `name` property.\n\nIf you need to change which items get tooltips you can override `tooltipElements` getter.\n\n```js\ntooltipElements() {\n  return this.container.querySelectorAll('rect.bar');\n}\n\nIf you need to change the tooltip contents you can override the `tooltipTemplate` function.\n\n```js\ntooltipTemplate() {\n  return '<b>${label}</b> ${value}';\n}\n```\n\nOr you can modify the tooltip in the slot.\n\n## Why Not Canvas?\n\nWe decided to use SVG over Canvas because of the following reasons:\n\n- Canvas is not part of the DOM thus not accessible by screen readers.\n- Canvas is more difficult to make interactive and responsive.\n- Would be generally more maintainable.\n- SVG output is easier to debug.\n"}},{"name":"ids-pattern-data","description":{"kind":"markdown","value":"# ids-axis-chart\n\n## Description\n\nThe axis chart is a chart with an x-axis and y-axis. This is the base chart object used to make line, area, column and other charts. Generally it should not be used on its own but if you have a case of making some other chart it could be used.\n\n## Use Cases\n\n- When you want a chart with x and y axis and control over whats rendered in it.\n\n## Usage Considerations\n\n- Do not show too many lines at once as it may be difficult to interpret.\n- Hover tooltips should only be used to reveal additional non-critical information.\n\n## Terminology\n\n- **Marker**: A UI embellishments that shows the data points (i.e. the dots on a line chart).\n- **Domain**: The domain is all x-values (the values of the graph from left to right)\n- **Range**: The domain is all y-values (the values of the graph from down to up)\n- **Scale**: The range of values in the graph (the values of the graph from down to up) and the amount of steps between each value.\n- **Axis**: Charts typically have two axes that are used to measure and categorize data: a vertical axis (also known as value axis or y axis), and a horizontal axis (also known as category axis or x axis).\n\n## Features (With Code Examples)\n\nA axis chart is defined with a custom element with a width and height.\n\n```html\n<ids-axis-chart title=\"A line chart showing component usage\" width=\"800\" height=\"500\"></ids-axis-chart>\n```\n\nDatasets can be added to the line chart by passing in an array of objects. Each object must have a `data` and object with `name` and `values` from the data points. Also a name should be given for each data object which will be used as the legend text. The `shortName` is used to show the short name of the legend text and the `abbrName` is used to show an even shorter name of the legend text in responsive situations.\n\n```html\nconst dataset = [{\n  data: [{\n    name: 'Jan',\n    value: 1\n  }, {\n    name: 'Feb',\n    value: 2\n  }, {\n    name: 'Mar',\n    value: 3\n  }, {\n    name: 'Apr',\n    value: 5\n  }, {\n    name: 'May',\n    value: 7\n  }, {\n    name: 'Jun',\n    value: 10\n  }],\n  name: 'Component A',\n  shortName: 'Comp A',\n  abbrName: 'A',\n}];\n\ndocument.querySelector('ids-axis-chart').data = dataset;\n```\n\nInside the chart you should provide a chartTemplate that returns the inside (markers) of the chart as svg. The `lineMarkers` element will contain the correct points and position of the markers to use based on the data/height/width/margins of the chart.\n\n```js\nchartTemplate() {\n  return `<g class=\"markers\">\n    ${this.lineMarkers().markers}\n  </g>\n  <g class=\"marker-lines\">\n    ${this.lineMarkers().lines}\n  </g>\n  <g class=\"areas\">\n    ${this.#areas()}\n  </g>`;\n}\n```\n\nYou can also customize the empty message contents but adding an `ids-empty-element` to the slot.\n\n```html\n<ids-axis-chart title=\"A line chart showing component usage\" width=\"800\" height=\"500\">\n    <ids-empty-message slot=\"empty-message\"icon=\"empty-no-data\" hidden>\n        <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data Right Now</ids-text>\n    </ids-empty-message>\n</ids-axis-chart>\n```\n\nAnother type of chart you can use is a sequential color chart. A sequence of colors is used to represent various concepts of range in low-high density, quantity, and concentration situations. I.E. The data is highly related and should be represented with a single color.\n\nTo achieve this it is recommended to use the `color` setting and pick one of the Ids Colors in the color palette and use variables in its range. For example:\n\n```js\n[{\n   \"data\": [],\n   \"name\": \"Component A\",\n   \"color\": \"var(--ids-color-blue-60)\n }, {\n   \"data\": [],\n   \"name\": \"Component B\",\n   \"shortName\": \"Comp B\",\n   \"abbreviatedName\": \"B\",\n   \"color\": \"var(--ids-color-blue-40)\"\n }, {\n   \"data\": [{\n   ],\n   \"name\": \"Component C\",\n   \"color\": \"var(--ids-color-blue-20)\"\n }]\n```\n\nYou can add axis labels all around (bottom, end, start, top).\n\n```html\n<ids-axis-chart\n  axis-label-bottom=\"Bottom axis label\"\n  axis-label-end=\"End axis label\"\n  axis-label-start=\"Start axis label\"\n  axis-label-top=\"Top axis label\"\n  width=\"700\"\n  height=\"400\"\n  id=\"axis-label-example\"\n  title=\"A axis chart showing component usage with axis-label\"\n></ids-axis-chart>\n```\n\nShowing component as horizontal orientation.\n\n```html\n<ids-axis-chart\n  horizontal\n  width=\"700\"\n  height=\"400\"\n  id=\"axis-horizontal-example\"\n  title=\"Horizontal example\"\n></ids-axis-chart>\n```\n\n## Class Hierarchy\n\n- IdsAxisChart\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n  IdsChartLegendMixin\n  IdsChartSelectionMixin\n\n## Data Settings\n\nThe following data attributes can be used on the data passed to a chart.\n\n- `data` {object} A data group with one or more `name` and `value` pairs.\n- `name` {string} The name for the legend text and tooltip representing the slice. If the name is left null or undefined the legend item will not be shown.\n- `shortName` {string} The short name of the legend text.\n- `abbrName` {string} A very short name of the legend text (one or two characters).\n- `color` {string} The color of this axis group. This can be either a hex value for example `#FF0000` or a color name like `red` or an ids variable like `var(--ids-color-blue-20)`.\n- `tooltip` {string} The custom tooltip string (as static text). See the tooltip section for more information.\n\n## Settings\n\n- `title` {string} Sets the internal title of the chart (for accessibility). It is recommended to mention the chart type for accessibility readout. For example: `Line chart showing invoice history`.\n- `height` {number|string} Generally this is calculated automatically but can be used to set a specific height. Can also be set to `'fluid'` to make the chart resize with its container, or `'inherit'` for similar behavior.\n- `width` {number|string} Generally this is calculated automatically but can be used to set a specific width. Can also be set to `'fluid'` to make the chart resize with its container, or `'inherit'` for similar behavior.\n- `textWidths` {object} Generally this is calculated automatically but can be overridden by setting the amount of space to allocate for margins on the `{ left, right, top, bottom }` sides.\n- `xAxisMin` {number}  Set the minimum value on the x axis  (default: 0)\n- `yAxisMin` {number}  Set the minimum value on the y axis  (default: 0)\n- `showVerticalGridLines` {boolean}  Show the vertical axis grid lines (default: false)\n- `showHorizontalGridLines` {boolean}  Show the horizontal axis grid lines (default: true)\n- `yAxisFormatter` {object | Function} Sets the format on the y axis items. This can either be settings that are passed to `Intl.NumberFormat` or a formatter function. The formatter function will get three parameters (value, data, api) and should return a string based on the axis value. The y axis is not always a number so it does not default to `Intl.NumberFormat`. The default is `{ notation: 'compact', compactDisplay: 'short' }`.\n- `xAxisFormatter` {Function} Sets the format on the x axis items. The formatter function will get three parameters (value, data, api) and should return a string based on the axis value. The x axis is not always a number so it does not default to `Intl.NumberFormat`. See the [Intl.NumberFormat api](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat) for more details and examples on formatting options.\n- `horizontal` {boolean} Flips the orientation to horizontal, supported `Axis` and `Bar` type charts.\n- `selectable` {boolean} Sets the selection mode.\n- `axisLabelBottom` {string} Option to add bottom axis label.\n- `axisLabelEnd` {string} Option to add horizontally end side axis label.\n- `axisLabelStart` {string} Option to add horizontally start side axis label.\n- `axisLabelTop` {string} Option to add top axis label.\n- `axisLabelMargin` {number} Axis label margin value.\n- `rotateNameLabels` {string|number} Sets the rotation of the labels on the name axis (style guide recommends -60 but you may want to tweak it based on labels. The `shortName` and `abbreviatedName` labels do not work with this setting.\n- `ticks` {number} Sets the number of ticks to show, to either reduce or show more ticks on the axis. This is an approximation based on the shape of the data and height of the chart the exact number of ticks specified might be altered to fit the algorithm.\n\n## Events\n\n- `rendered` Fires each time the chart is rendered or rerendered (on resize).\n- `beforeselected` Fires before selected, you can return false in the response to veto.\n- `selected` Fires after selected.\n- `beforedeselected` Fires before deselected, you can return false in the response to veto.\n- `deselected` Fires after deselected.\n\n## Themeable Parts\n\n- `container` the outer container div element\n- `chart` the svg outer element\n\n## States and Variations\n\n- Theme\n- Legends\n- Selectable\n\n## Responsive Guidelines\n\n- Sizes to the given width/height defaulting to that of the immediate parent.\n\n## Tooltip Customizations\n\nYou can customize the tooltip by changing some of the API settings. For just a static tooltip you can use the `tooltip` setting in the data at the same place as the `name` property.\n\nIf you need to change which items get tooltips you can override `tooltipElements` getter.\n\n```js\ntooltipElements() {\n  return this.container.querySelectorAll('rect.bar');\n}\n\nIf you need to change the tooltip contents you can override the `tooltipTemplate` function.\n\n```js\ntooltipTemplate() {\n  return '<b>${label}</b> ${value}';\n}\n```\n\nOr you can modify the tooltip in the slot.\n\n## Why Not Canvas?\n\nWe decided to use SVG over Canvas because of the following reasons:\n\n- Canvas is not part of the DOM thus not accessible by screen readers.\n- Canvas is more difficult to make interactive and responsive.\n- Would be generally more maintainable.\n- SVG output is easier to debug.\n"}},{"name":"ids-badge","attributes":[{"name":"shape","description":"Set the badge shape between normal (default) and round","values":[]},{"name":"color","description":"Set the color","values":[]},{"name":"disabled","description":"Sets the disabled state","values":[]},{"name":"no-margins","description":"Gets whether the badge has no margins","values":[]},{"name":"aria-label","description":"Get the aria-label","values":[]}],"description":{"kind":"markdown","value":"# ids-badge\n\n## Description\n\nThe ids-badge informs users of a status or count of an object. See more [usage details](https://design.infor.com/components/components/badge).\n\n## Terminology\n\n- **Badge**: Used to inform users of the status of an object or of an action.\n- **Color**: This is the color of the badge.\n- **Shape**: This is the shape of the badge. It can be round or rounded rectangle.\n\n## Themeable Parts\n\n- `badge` allows you to further style the badge element\n\n## Features (With Code Examples)\n\nA normal/no properties badge used as a web component.\n\n```html\n<ids-badge>5</ids-badge>\n```\n\nUse the `color` attribute to style badges as statuses:\n`alert`, `error`, `info`, `warning`, or `success`.\n\n```html\n<ids-badge color=\"caution\">10</ids-badge>\n<ids-badge color=\"error\">1500</ids-badge>\n<ids-badge color=\"info\">25k+</ids-badge>\n<ids-badge color=\"warning\">16</ids-badge>\n<ids-badge color=\"success\">5</ids-badge>\n```\n\nTo create a circular badge, use the `shape` attribute with the value `round`:\n\n```html\n<ids-badge color=\"caution\" shape=\"round\">10</ids-badge>\n```\n\nFor improved accessibility, add an audible description using <ids-text>:\n\n```html\n<ids-badge color=\"error\">404 <ids-text audible=\"true\">In Error Condition</ids-text></ids-badge>\n```\n\nFor accessibility support, the badge automatically generates an `aria-label` based on its content:\n\n```html\n<ids-badge>3</ids-badge>\n<!-- Automatically gets aria-label=\"3\" -->\n```\n\nYou can also provide a custom `aria-label` for more specific context:\n\n```html\n<ids-badge aria-label=\"3 unread notifications\">3</ids-badge>\n<ids-badge aria-label=\"12 completed tasks\">12</ids-badge>\n```\n\n## Settings and Attributes\n\n- `aria-label` {string} Sets the accessible label for screen readers. If not provided, automatically generates one based on content.\n- `color` {string} Sets the status color of the badge. Values are `alert`, `error`, `warning`, `success`, or `info`.\n- `disabled` {boolean} Sets the disabled state.\n- `shape` {string} Sets the badge shape. Values are `normal` (default) or `round`.\n\n## States and Variations\n\n- Color\n- Disabled\n- Shape\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-badge></ids-badge>\n- Can now be imported as a single JS file and used with encapsulated styles\n- The names of some badge types have changed.\n- The yellow warning is removed in favor of just the orange warning.\n- Some of the types/settings are changed.\n"}},{"name":"ids-bar-chart","attributes":[{"name":"selection-elements","description":"Return chart elements that get selection","values":[]},{"name":"group-count","description":"Number of groups count","values":[]},{"name":"align-xlabels","description":"Adjust the default for the x labels","values":[]},{"name":"bar-percentage","description":"Percent (0-1) of the available width each bar should be within the category width.\n1.0 will take the whole category width and put the bars right next to each other.\nif `isGrouped` this value, will use as whole group percentage.","values":[]},{"name":"category-percentage","description":"Percent (0-1) of the available width each category (group) section.","values":[]},{"name":"use-log-scale","description":"Get the log scale state","values":[]},{"name":"default-selectable","values":[]},{"name":"initialized","values":[]},{"name":"data-loaded","values":[]},{"name":"svg","values":[]},{"name":"canvas","values":[]},{"name":"empty-message","values":[]},{"name":"legend","values":[]},{"name":"section-widths","values":[]},{"name":"section-width","values":[]},{"name":"section-heights","values":[]},{"name":"section-height","values":[]},{"name":"resize-to-parent-height","values":[]},{"name":"resize-to-parent-width","values":[]},{"name":"datasource","description":"Reference to datasource API","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"is-grouped","values":[]},{"name":"#x-max-text-width","description":"Max width for x-labels text","values":[]},{"name":"#y-max-text-width","description":"Max width for y-labels text","values":[]},{"name":"#resize-observer","description":"Holds the resize observer object","values":[]},{"name":"marker-data","description":"The marker data to use to draw the chart","values":[]},{"name":"#axis-labels-text","description":"Holds the axis labels text object","values":[]},{"name":"title","description":"Get the chart title","values":[]},{"name":"height","description":"Get the chart height","values":[]},{"name":"horizontal","description":"Get the horizontal orientation state","values":[]},{"name":"width","description":"Get the chart width","values":[]},{"name":"chart-container","description":"Get the chart container element","values":[]},{"name":"margins","description":"Get the chart margins","values":[]},{"name":"left-rotate-margin","description":"Get left rotate margin for rotated labels","values":[]},{"name":"right-rotate-margin","description":"Get right rotate margin for rotated labels","values":[]},{"name":"bottom-rotate-margin","description":"Get bottom rotate margin for rotated labels","values":[]},{"name":"axis-labels-margin","description":"Get axis labels margin values","values":[]},{"name":"text-widths","description":"Get text widths for chart dimensions","values":[]},{"name":"data","description":"Get the chart data","values":[]},{"name":"y-axis-min","description":"Get the minimum value on the y axis","values":[]},{"name":"ticks","description":"Get the number of ticks to show","values":[]},{"name":"show-tooltip","description":"Get the show tooltip state","values":[]},{"name":"show-vertical-grid-lines","description":"Get the show vertical grid lines state","values":[]},{"name":"show-horizontal-grid-lines","description":"Get the show horizontal grid lines state","values":[]},{"name":"colors","description":"Get the colors series being used in this chart","values":[]},{"name":"x-axis-formatter","description":"Get the x axis formatter","values":[]},{"name":"y-axis-formatter","description":"Get the y axis formatter","values":[]},{"name":"cubic-bezier","description":"Get a reusable snippet to ease the animation","values":[]},{"name":"animated","description":"Get the animation state","values":[]},{"name":"animation-speed","description":"Get the animation speed","values":[]},{"name":"stacked","description":"Get the stacked state","values":[]},{"name":"axis-label-bottom","description":"Get the bottom axis label text","values":[]},{"name":"axis-label-end","description":"Get the end axis label text","values":[]},{"name":"axis-label-margin","description":"Get the margin for axis label text","values":[]},{"name":"axis-label-start","description":"Get the start axis label text","values":[]},{"name":"axis-label-top","description":"Get the top axis label text","values":[]},{"name":"rotate-name-labels","description":"Get the rotation for the axis name label text","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-bar-chart\n\n## Description\n\nAn bar chart is used to display relational information quickly for a quantity across a particular category. Users can interact by clicking or tapping on bars to drill in on a certain series of data. Users can also interact by hovering bars to reveal additional information in a tooltip. The x-axis could be any variable, such as time, or the category that is being measured.\n\nGrouped bar graphs, also called clustered bar graphs, represent discrete values for more than one item that share the same category. For example a grouped bar graph could display several categories within each main category such as male and female, within certain traits on the x-axis. To make a grouped bar chart provide the appropriately formatted data.\n\nStacked bar graphs or composite bar graphs divide an aggregate total into parts. Each segment adds to the total of the bar and are separated by different colors. To make a stacked bar chart use `stacked=\"true\"` and provide the appropriately formatted data.\n\n## Use Cases\n\n- Display an earnings per share (EPS)\n- Compare revenue or cash flow over time\n- Compares series through a visual representation of data in columns.\n- Quickly compares trends in a variety of ways\n\n## Usage Considerations\n\n- Do not show too many bars or too many categories or segments or the data may be hard to read.\n- Hover tooltips should only be used to reveal additional non-critical information.\n\n## Terminology\n\n- **Bar**: The UI element that represents a concrete value in a color.\n- **Category**: The section for each bar when grouping.\n- **Segment**: The section for each bar value when stacking\n\n## Features (With Code Examples)\n\nAn bar chart is defined with the custom element and width and height.  This chart does support negative values for regular, horizontal and grouped charts (not stacked).\n\n```html\n  <ids-bar-chart title=\"A bar chart showing component usage\" show-vertical-grid-lines=\"true\" width=\"800\" height=\"500\" id=\"index-example\"></ids-bar-chart>\n```\n\nDatasets can be added to the bar chart by passing in an array of objects. Each object must have a `data` and object with `name` and `values` to form the data points. Also a name should be given for each data object which will be used as the legend text. The `shortName` is used to show the short name of the legend text and the `abbrName` is used to show an even shorter name of the legend text in responsive situations.\n\n```js\nconst dataset = [{\n  data: [{\n    name: 'Jan',\n    value: 1\n  }, {\n    name: 'Feb',\n    value: 2\n  }, {\n    name: 'Mar',\n    value: 3\n  }, {\n    name: 'Apr',\n    value: 5\n  }, {\n    name: 'May',\n    value: 7\n  }, {\n    name: 'Jun',\n    value: 10\n  }],\n  name: 'Component A',\n  shortName: 'Comp A',\n  abbrName: 'A',\n}];\n\ndocument.querySelector('ids-bar-chart').data = dataset;\n```\n\nA chart can also be `stacked` or `grouped`. Stacked bar graphs or composite bar graphs divide an aggregate total into parts. Each segment adds to the total of the bar and are separated by different colors.\n\nTo make a stacked bar chart use `stacked=\"true\"` and provide the appropriately formatted data.\n\n## Class Hierarchy\n\n- IdsBarChart\n  - IdsAxisChart\n    - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Data Settings\n\n(See  Axis Chart Settings for more information)\n\n## Settings\n\n- `barPercentage` {number} A percent (0-1) of the available width each bar should be within the category width. 1.0 will take the whole category width and put the bars right next to each other. In a grouped chart the barPercentage value, will use as whole category percentage. We change the defaults depending on stacked or grouped bar charts but this can be adjusted to change the bar sizes.\n- `categoryPercentage` {number} Percent (0-1) of the available width for each category section. We change the defaults depending on stacked or grouped bar charts.\n- `horizontal` {boolean} Flips the orientation to horizontal.\n\nThe following shows the relationship between the bar percentage option and the category percentage option.\n\n```sh\n// categoryPercentage: 1.0\n// barPercentage: 1.0\nBar:        | 1.0 | 1.0 |\nCategory:   |    1.0    |\nSection:    |===========|\n\n// categoryPercentage: 1.0\n// barPercentage: 0.5\nBar:          |.5|  |.5|\nCategory:  |      1.0     |\nSection:   |==============|\n\n// categoryPercentage: 0.5\n// barPercentage: 1.0\nBar:             |1.0||1.0|\nCategory:        |   .5   |\nSection:    |==================|\n```\n\n- `stacked` {boolean} Set to true to make a stacked bar chart.\n- `grouped` {boolean} Set to true to make a grouped bar chart.\n- `useLogScale` {boolean} Set to true to enable logarithmic scaling for exponential data. When enabled, the y-axis uses a logarithmic scale, which is useful for data spanning several orders of magnitude. Only values >= 1 are supported; bars with zero or negative values will not be displayed.\n\n(See Axis Chart Settings for other shared settings)\n\n## Patterns\n\nThe bar chart includes patterns that can be used for color blind users. We plan on adding this to other charts as well.\nTo use a pattern specify it on the `pattern` attribute it in the data. You can also set a `patternColor` otherwise it will use the default color for that item in the series.\n\n```js\nconst data = [{\n  data: [{\n    name: 'Jan',\n    value: 1\n  }, {\n    name: 'Feb',\n    value: 2\n  }],\n  name: 'Component A',\n  pattern: 'circles',\n  patternColor: '#DA1217'\n}];\n```\n\nThe following patterns are supported:\n\n```sh\narrows\nboxes\ncheckers\npatches\ncircles\nexes\ndiamonds\ndots\nstars\nmixed\nsquares\nhex\nbig-hex\nintersect\nlines\nbars\npipes\nmesh\npluses\nwaves\nbig-waves\n```\n\nShowing component as horizontal orientation.\n\n```html\n<ids-bar-chart\n  horizontal\n  width=\"700\"\n  height=\"400\"\n  id=\"bar-horizontal-example\"\n  title=\"Horizontal example\"\n></ids-bar-chart>\n```\n\n### Logarithmic Scale\n\nFor data that spans several orders of magnitude (like 10, 100, 1000, 10000), you can enable logarithmic scaling to better visualize the relationships between values.\n\n```html\n<ids-bar-chart\n  use-log-scale=\"true\"\n  width=\"700\"\n  height=\"400\"\n  title=\"Exponential Data with Log Scale\"\n  axis-label-start=\"Values (Log Scale)\"\n></ids-bar-chart>\n```\n\n```js\nconst exponentialData = [{\n  data: [\n    { name: 'Item A', value: 10 },\n    { name: 'Item B', value: 100 },\n    { name: 'Item C', value: 1000 },\n    { name: 'Item D', value: 10000 },\n    { name: 'Item E', value: 100000 }\n  ],\n  name: 'Exponential Growth'\n}];\n\ndocument.querySelector('ids-bar-chart').data = exponentialData;\n```\n\n## Events\n\n(See Axis Chart Settings for more information)\n\n## Methods\n\n(See Axis Chart Settings for more information)\n\n## Themeable Parts\n\n- `svg` the outside svg element\n- `bar` each bar element  in the chart\n- `lines` each line element in the chart\n\n## Animation\n\nThe bars rise along the y-axis from 0 to the appropriate values.\n\n## States and Variations\n\n(See Line Chart and Axis Chart Settings for more information)\n\n## Keyboard Guidelines\n\n(See Line Chart and Axis Chart Settings for more information)\n\n## Responsive Guidelines\n\n- The area chart will fill the size of its parent container and readjust when the window is resized.\n\n## Converting from Previous Versions (Breaking Changes)\n\n- 4.x: The area chart was added after version 3.6 so new in 4.x\n- 5.x: Bar Chart have all new markup and classes for web components but the data is still the same except for a few changes.\n  - `shortName` is now `shortName`\n  - `abbreviatedName` is now `abbrName`\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information.\n- Approach is to treat the bar items as a list `role=\"list\"`. The bar items are `role=\"listitem\"`. The tab index is not visible to the user as it is not needed and can be navigated with a screen reader.\n- Using voice over the sequence is to\n  - Navigate to the parent element above it  or parent page\n  - Hold <kbd>caps lock + left/right arrow</kbd>\n  - You will hear the title , followed by number of items and then each list item\n  - Proceed to use <kbd>caps lock + left/right arrow</kbd> will move through the list items announcing the values\n\n## Regional Considerations\n\nChart labels should be localized in the current language. The chart will flip in RTL mode. For some color blind users the svg patterns can be used.\n"}},{"name":"ids-block-grid-item","attributes":[{"name":"checkbox-has-focus","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-block-grid\n\n## Description\n\nThe IDS Block Grid Component displays data as selectable blocks within a simple grid. It gives a way of evenly split contents of a list within a grid.\n\n## Use Cases\n\nUse when you wanted to create rows of images with paragraphs/links that need to stay evenly spaced.\n\n## Terminology\n\n- **Align**: The position of the block grid. You can set it to be center, left, or right.\n\n## Feature (With the Code Examples)\n\nA block grid is created by using the `ids-block-grid` as the main container, and `ids-block-grid-item` for the item inside of it.\n\n```html\n<ids-block-grid>\n  <ids-blockgrid-item>\n    Content Here...\n  </ids-blockgrid-item>\n</ids-block-grid>\n```\n\nYou can set the alignment of the block grid by setting the `align` property with these three options `left`, `centered` or `right`. By default, the position is set to `centered` align.\n\n```html\n<ids-block-grid align=\"centered\">\n  <ids-blockgrid-item>\n    Content Here...\n  </ids-blockgrid-item>\n</ids-block-grid>\n```\n\n## Settings and Attributes\n\n- `align` {string} Sets the position of the block grid and it's contents.\n\n## States and Variations\n\n- Align\n\n## Responsive Guidelines\n\n- The block grid uses flex container to be able to fill available free space and shrinks them to prevent overflow, while the block grid item has a width of 200px. It automatically sets the height depends on how many the block grid item is.\n\n## Accessibility\n\nThe use of this component is not recommended for Accessibility since the lack of elements in the page may pose issues for screen reader and other assistive technology. Consider a way to disable this functionality.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- New Component in 4.x\n\n**4.x to 5.x**\n- Block Grid now uses all new markup and classes for web components (see above)\n- The way paging and selection are applied have changes to the api\n"}},{"name":"ids-block-grid","attributes":[{"name":"datasource","description":"Reference to datasource API","values":[]},{"name":"data","description":"Set the data array of the blockgrid","values":[]},{"name":"align","description":"Set the alignment of blockgrid","values":[]},{"name":"selection","description":"Set the selection to a block-grid and it will add selection to all items","values":[]}],"description":{"kind":"markdown","value":"# ids-block-grid\n\n## Description\n\nThe IDS Block Grid Component displays data as selectable blocks within a simple grid. It gives a way of evenly split contents of a list within a grid.\n\n## Use Cases\n\nUse when you wanted to create rows of images with paragraphs/links that need to stay evenly spaced.\n\n## Terminology\n\n- **Align**: The position of the block grid. You can set it to be center, left, or right.\n\n## Feature (With the Code Examples)\n\nA block grid is created by using the `ids-block-grid` as the main container, and `ids-block-grid-item` for the item inside of it.\n\n```html\n<ids-block-grid>\n  <ids-blockgrid-item>\n    Content Here...\n  </ids-blockgrid-item>\n</ids-block-grid>\n```\n\nYou can set the alignment of the block grid by setting the `align` property with these three options `left`, `centered` or `right`. By default, the position is set to `centered` align.\n\n```html\n<ids-block-grid align=\"centered\">\n  <ids-blockgrid-item>\n    Content Here...\n  </ids-blockgrid-item>\n</ids-block-grid>\n```\n\n## Settings and Attributes\n\n- `align` {string} Sets the position of the block grid and it's contents.\n\n## States and Variations\n\n- Align\n\n## Responsive Guidelines\n\n- The block grid uses flex container to be able to fill available free space and shrinks them to prevent overflow, while the block grid item has a width of 200px. It automatically sets the height depends on how many the block grid item is.\n\n## Accessibility\n\nThe use of this component is not recommended for Accessibility since the lack of elements in the page may pose issues for screen reader and other assistive technology. Consider a way to disable this functionality.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- New Component in 4.x\n\n**4.x to 5.x**\n- Block Grid now uses all new markup and classes for web components (see above)\n- The way paging and selection are applied have changes to the api\n"}},{"name":"ids-box","attributes":[{"name":"actionable","description":"If actionable the box can be toggled trigging a state","values":[]},{"name":"background-color","description":"Set the background color (as a css variable)","values":[]},{"name":"borderless","description":"Turns off the borders","values":[]},{"name":"border-radius","description":"Sets the border radius beyond the default","values":[]},{"name":"width","description":"Sets a width in pixels or percent","values":[]},{"name":"height","description":"Set a height in pixels or percent","values":[]},{"name":"shadowed","description":"Turn off the border but leave the shadow","values":[]},{"name":"padding-x","description":"Get the x axis padding","values":[]},{"name":"padding-y","description":"Get the x axis padding","values":[]},{"name":"selected","description":"Set the selected state on the box","values":[]}],"description":{"kind":"markdown","value":"# ids-box\n\n## Description\n\nids-box is a primitive component that cards and widgets build on. Also consider ids-card, as it includes additional interactivity. See ids-widget for use with Role-Based Workspaces (RBWS).\n\n## Terminology\n\n- **Box**: A configurable box with a border or not that centers contents\n- **Card**: An additional layer to boxes that adds functionality like states and selection\n- **Widget**: An additional layer to cards that adds functionality for home pages / portal\n\n## Features (With Code Examples)\n\nA box with default padding:\n\n```html\n<ids-box>\n  Bordered\n</ids-box>\n```\n\nA square box with padding and unrounded corners:\n\n```html\n<ids-box square padding-x=\"32\" padding-y=\"32\" border-radius=\"0\">\n  Squared\n</ids-box>\n```\n\n## Class Hierarchy\n\n- IdsBox\n  - IdsElement\n\n## Settings (Attributes)\n\n- `actionable` {boolean} Adds actionable states (when used in cards)\n- `backgroundColor` {string} Set the background color (as a CSS variable)\n- `borderless` {boolean} Turns off the borders\n- `borderRadius` {number} Sets the border radius to something non-default\n- `shadowed` {number} Turn off the border but leave the shadow (for RBWS)\n- `width` {string} Sets a width in pixels or percent\n- `height` {string} Sets a height in pixels or percent\n- `paddingX` {string} Set the x axis padding on the box contents (in pixels)\n- `paddingY` {string} Set the y axis padding on the box contents (in pixels)\n\n## Themeable Parts\n\n- `box` allows you to further style the box element\n\n## States and Variations\n\n- Color\n- Size\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- New component that is the base layer to cards in the previous context\n"}},{"name":"ids-breadcrumb","attributes":[{"name":"on-breadcrumb-activate","values":[]},{"name":"#resize-observer","description":"Attach the resize observer.","values":[]},{"name":"color-variants","values":[]},{"name":"current","description":"Get the current breadcrumb element","values":[]},{"name":"button-el","description":"Get reference to the breadcrumb overflow menu button","values":[]},{"name":"menu-container-el","description":"Get reference to the breadcrumb overflow menu's container element","values":[]},{"name":"nav-elem","description":"Get reference to the breadcrumb list's container element","values":[]},{"name":"overflow-menu-items","description":"Get list of menu items that mirror Toolbar items","values":[]},{"name":"popup-menu-el","description":"Get the popup menu element","values":[]},{"name":"popup-menu-group-el","description":"Get the popup menu group element","values":[]},{"name":"truncate","description":"Get the truncate state","values":[]},{"name":"padding","description":"Get the padding value","values":[]},{"name":"size","description":"Get the size variant","values":[]}],"description":{"kind":"markdown","value":"# ids-breadcrumb \n\n## Description\n\nA breadcrumb is a navigational element that shows a user their current location in the hierarchical context of an application and allows them to navigate back through page levels. See more [usage details](https://design.infor.com/components/components/breadcrumb).\n\n## Features (With Code Examples)\n\nA normal breadcrumb component with a disabled item. The last item represents the current page.\n\n```html\n<ids-breadcrumb>\n  <ids-hyperlink font-size=\"14\" color=\"unset\">First Item</ids-hyperlink>\n  <ids-hyperlink font-size=\"14\" color=\"unset\">Second Item</ids-hyperlink>\n  <ids-hyperlink font-size=\"14\" color=\"unset\" disabled>Disabled Item</ids-hyperlink>\n  <ids-hyperlink font-size=\"14\" color=\"unset\">Current Item</ids-hyperlink>\n</ids-breadcrumb>\n```\n\nA large breadcrumb variant with 20px font size for better visual hierarchy:\n\n```html\n<ids-breadcrumb size=\"lg\">\n  <ids-hyperlink href=\"#\">Home</ids-hyperlink>\n  <ids-hyperlink href=\"#\">Products</ids-hyperlink>\n  <ids-hyperlink>Current page</ids-hyperlink>\n</ids-breadcrumb>\n```\n\n## Settings and Attributes\n\nThe breadcrumb can contain either ids-text or ids-hyperlink, depending on whether the item is navigable.\n\nRelevant ids-hyperlink attributes:\n\n- `color` {string} Set to `unset` to use the default coloring.\n- `disabled` Set to `true` to apply disabled styling.\n- `font-size` {number} Defaults to `14`.\n- `href` {string} The URL that the hyperlink points to.\n- `size` {string} Set to `lg` for 20px font size variant, defaults to `md` (14px).\n- `truncate` {boolean} If `true`, the breadcrumb list can be truncated, hiding some links behind an overflow menu.\n\n## States and Variations (With Code Examples)\n\n- Default: The default state of breadcrumb text.\n- Hover: Indicates that the user is hovering over a breadcrumb item, and can click to navigate to a higher hierarchy level. The last item does not have a hover state, as it represents the user’s current page and is typically non-interactive.\n- Focus: Indicates that the user has highlighted the hyperlink through keyboard navigation.\n\n## Themeable Parts\n\n- `checkbox` allows you to further style the checkbox input element\n- `slider` allows you to further style the sliding part of the switch\n- `label` allows you to further style the label text\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- \"Collapsing Lists\" was deprecated but later added as truncate feature.\n- Markup has entirely changed, see the updated code example\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-breadcrumb></ids-breadcrumb>`\n- Markup Uses `ids-hyperlink` instead of `<a>`\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-button-common","description":{"kind":"markdown","value":"# ids-button\n\n## Description\n\nThe ids-button is a simple wrapper around a styled `HTMLButtonElement` and contains additional API to set text, icons, and functionality. See more [usage details](https://design.infor.com/components/components/button/).\n\n## Themeable Parts\n\n- `button` allows you to further style the button element\n- `icon` allows you to further style the icon element (used in some types of buttons)\n- `text` allows you to further style the text element (used in some types of buttons)\n\n## Methods\n\n- `toggleAnimation(isActive?: boolean)`: Toggles generative AI button's active state, including its own indicator.\n- `focus()`: Programmatically focuses the button element.\n\n## Features (With Code Samples)\n\nA standalone primary button:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\">\n  <span>My Button</span>\n</ids-button>\n```\n\nAdding an icon to the button using the `icon` attribute:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span>My Button</span>\n</ids-button>\n```\n\nAn icon-only button without visible text. To maintain accessibility standards, descriptive text explaining the button's function is required. To hide this text visually but provide it to screen readers, add an \"audible\" class to the text `<span>`:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span class=\"audible\">My Button</span>\n</ids-button>\n```\n\n### Label Attribute\n\nThe `label` attribute can be used to set a descriptive label for the button. This is useful for accessibility or when you need additional metadata. The label functionality is provided by the [IdsLabelStateMixin](../../mixins/ids-label-state-mixin/README.md):\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" label=\"Save changes\">\n  <span>Save</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\nconst button = document.querySelector('#my-button');\nbutton.label = 'Save changes';\n```\n\n### Color Variants\n\nIf placing a button in a container with a contrasting background color, the \"base\" appearance may not contain accessible color contrast ratios. The `color-variant` property can be used with the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md):\n\n```html\n<!-- Generates a default (Tertiary) Button with white text and focus/hover states --->\n<ids-button id=\"my-button-1\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a Primary Button with a slightly brighter Blue --->\n<ids-button id=\"my-button-2\" appearance=\"primary\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a Secondary Button with a slightly brighter Neutral --->\n<ids-button id=\"my-button-3\" appearance=\"primary\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a button to use with toolbar formatter type --->\n<ids-button id=\"my-button-4\" color-variant=\"alternate-formatter\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Button Group Variant\n\nButton Group allows layout for buttons in use of popups, modal, popover, datepicker and timepicker. This feature is especially useful for buttons that presents actions within common layouts.\n\nSettings:\n- divider - if set to true adds additional border on top.\n- display - will set the layout either flex or inline-flex.\n- direction - will set the layout either row, row-reverse, column, column-reverse.\n- justify-content - will set the layout either start, stretch, end, flex-start, flex-end, center, left, right, space-between, space-around and space-evenly.\n- compact - if set to true makes the ids-buttons-group-section compact for flex containers.\n- label-position - Applies the same label-position offset as labeled form fields so the button group aligns within a side-label form layout.\n\n```html\n<ids-button-group divider=\"true\" display=\"flex\" direction=\"row\" justify-content=\"space-between\">\n  <ids-button-group-section gap=\"8\">\n    <ids-button width=\"125px\" id=\"test-button-back\" appearance=\"secondary\">\n      <span>Back</span>\n    </ids-button>\n  </ids-button-group-section>\n  <ids-button-group-section gap=\"8\">\n    <ids-button width=\"125px\" id=\"test-button-cancel\" appearance=\"secondary\">\n      <span>Cancel</span>\n    </ids-button>\n    <ids-button width=\"125px\" id=\"test-button-apply\" appearance=\"primary\">\n      <span>Apply</span>\n    </ids-button>\n  </ids-button-group-section>\n</ids-button-group>\n```\n\n### Compact Mode\n\nCompact mode reduces the height of buttons, including icon buttons and text buttons. This feature is especially useful for toolbar buttons or situations where space is limited.\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" compact=\"true\">\n  <span>My Button</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\n// Set the compact mode to true\ndocument.querySelector('#my-button').compact = true;\n\n// Set the compact mode to false\ndocument.querySelector('#my-button').compact = false;\n```\n\n## States and Variations\n\nStandard button states include:\n\n- Appearances types\n  - `default` (not displayed as a \"appearance\" attribute when set)\n  - `primary`\n  - `primary-destructive`\n  - `secondary`\n  - `tertiary`\n  - `tertiary-destructive`\n  - `primary-generative-ai`\n  - `tertiary-generative-ai`\n  - `secondary-generative-ai`\n- Normal\n- Hover\n- Focus\n- Active (pressed)\n- Disabled\n- Color Variant - alternate colors for each button appearance are available via the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md)\n\n### Alignment\n\nDefault alignment of text and icons within ids-button are based on the DOM order of those elements. However, if the `icon-align` attribute is specified, the alignment order of the inner elements can be forced.\n\nExample of icon that follows text, though the DOM order is reversed:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\" icon-align=\"end\">\n  <span>My Button</span>\n</ids-button>\n```\n\n`icon-align` effects:\n\n| Prop value | LTR (default) Icon Location | RTL Icon Location |\n| :--------- | :-------------------------- | :---------------- |\n| undefined  | n/a | n/a |\n| `start`    | Left of text | Right of text |\n| `end`      | Right of text | Left of text |\n\n### Type\n\nThe `type` attribute passes through to the Shadow Root's `HTMLButtonElement` and defines its usage.\n\nFor example, a `<form>` `submit` button:\n\n```html\n<ids-button id=\"my-button\" type=\"submit\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Height and Width\n\nWe do not recommend deviating on the size of the buttons from the original design. But for special uses cases you might change the height and width of a button like this. To change the height you need the span element in the button for it to center properly.\n\n```css\n<ids-button id=\"my-button\" height=\"60px\" width=\"200px\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Bottom Margin\n\nUse the `margin-block-end` attribute to add spacing below the button. This uses CSS logical properties, which respects RTL layouts.\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" margin-block-end=\"16px\">\n  <span>My Button</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\ndocument.querySelector('#my-button').marginBlockEnd = '1rem';\n```\n\n## Settings and Attributes\n\n- `appearance` {string} Visual style defining the button's purpose.\n- `badgeColor` {string} Sets the notification badge color if the button has an icon, passed to `ids-icon` component\n- `badgePosition` {string} Sets the notification badge position if the button has an icon, passed to `ids-icon` component\n- `marginBlockEnd` {string | null} Sets the bottom margin of the button using CSS logical property. Accepts any CSS length value (e.g. `'8px'`, `'1rem'`).\n- `colorVariant` {'alternate' | 'alternate-formatter'} Set the variants theme styles.\n- `compact` {boolean|string|null} Set the button to a compact size.\n- `contentAlign` {string} Sets content alignment within the button ('default', 'start', 'end')\n- `cssClass` {Array<string> | string | null} Contains space-delimited CSS classes (or an array of CSS classes) that will be passed to the Shadow Root button.\n- `disabled` {boolean} Sets the internal Button element's `disabled` property to enable/disable the button.\n- `height` {string} Sets height of the button. Accepts percent, pixels, rem, etc. (Only use this for isolated use cases)\n- `hidden` {boolean} Controls the visibility of the button\n- `icon` {string | null} A string representing an icon to display inside the button. This string is passed to a slotted [IdsIcon](../ids-icon/README.md) element's `icon` setting to set the desired icon type.\n- `iconAlign` {string} Defines which side to align the Button's icon against, can be 'start' or 'end'\n- `id` {string} Defines an identifier (ID) that must be unique within the entire document.\n- `label` {string | null} Sets a descriptive label for the button. This can be used for accessibility or additional metadata purposes.\n- `label-audible` {string | null} Sets audible text for button.\n- `label-position` {string} Positions the button as if it had an inline-start label, applying the same layout offset as labeled form fields. This keeps the button aligned within a form that uses side labels.\n- `label-width` {string | null} Overrides the default label width used for the inline offset (e.g. `'200px'`, `'250px'`). Sets the `--ids-label-width-inline-start` CSS variable on the host. When used with `label-position=\"inline-start\"`, the button's spacer element uses this width to match sibling input label widths. The spacer responds to the same `@media` and `@container` breakpoints as input labels.\n- `noAnimation` {boolean} Disables generative AI animations when true\n- `noMargins` {boolean} Removes default margins from the button\n- `noPadding` {boolean} Removes default padding from the button\n- `overflow` {string} Controls text overflow behavior, can be 'ellipsis' or null\n- `overflow-tooltip` {string} Controls which tooltip content displays based on overflow state when `overflow=\"ellipsis\"` is set. Values: `'text'` (default — shows button text when overflowing), `'custom'` (shows custom tooltip even when overflowing), `'false'` (no tooltip when overflowing). When text is NOT overflowing, the custom tooltip (if configured) always displays regardless of this setting. Does not require `tooltip=\"true\"` to be set.\n- `size` {string | null} Matches the button's occupied width to an `ids-input` size by adding `margin-inline-end`. Valid values: `'xs'` (75px), `'sm'` (150px), `'mm'` (225px), `'md'` (300px), `'lg'` (400px). The margin is computed dynamically so the button + margin equals the target input width.\n- `square` {boolean} whether the corners of the button as an icon-button are angled/90°.\n- `tabIndex` {string | number} Sets the internal Button element's `tabIndex` property for controlling focus\n- `text` {string} API-level method for setting a button's text content. This will become the content of the slotted text node when set.\n- `tooltip` {string} Sets up a string based tooltip.\n- `type` {string} Passes a 'type' attribute for the button, some map to standard `HTMLButtonElement` button types. This can be one of 'button', 'submit', 'reset', 'menu'.\n- `width` {string} Sets width of the button. Accepts percent, pixels, rem, etc.\n\n## Events\n\n- `click`: Fired when the button is clicked. For submit buttons, this will also trigger form submission.\n- `focus`: Fired when the button receives focus.\n- `blur`: Fired when the button loses focus.\n\n## Responsive Guidelines\n\n- Buttons can span 100% width of their parent container on mobile breakpoints.\n\n## Accessibility Guidelines\n\n- All buttons, including icon-only buttons, must have descriptive text inside the button to communicate its action to a screen reader user. Use the `audible` CSS class to visually hide the text if necessary.\n\n## Regional Considerations\n\nBe aware of the content layout for buttons in right-to-left (RTL) UIs.\n\n## Converting from Previous Versions\n\n**3.x to 4.x**\n- Change class `inforFormButton` default to `btn-primary`\n- Change class `inforFormButton` to `btn-secondary`\n\n**4.x to 5.x**\nThe ids-button is now a WebComponent. Instead of using classes to define a button's purpose or visual style, it's now done directly with an \"appearance\" attribute:\n\n```html\n<!-- 4.x button example -->\n<button class=\"btn-primary\" id=\"my-button\">\n  <svg class=\"icon\" role=\"presentation\">\n    <use href=\"#settings\"></use>\n  </svg>\n  <span>My Button</span>\n</button>\n\n<!-- this is the same button using the WebComponent -->\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span>My Button</span>\n</ids-button>\n```\n\n- Markup has changed to a custom element `<ids-button id=\"my-button\" appearance=\"primary\"></ids-button>`\n- Can now be imported as a single JS file and used with encapsulated styles.\n- Some button properties are now attributes - \"appearance\", \"text\", \"icon\", \"disabled\", etc.\n- Some components now extend IdsButton, such as [IdsToggleButton](../ids-toggle-button/README.md) and [IdsMenuButton](../ids-menu-button/README.md)...\n"}},{"name":"ids-button-group-section","attributes":[],"description":{"kind":"markdown","value":"# ids-button\n\n## Description\n\nThe ids-button is a simple wrapper around a styled `HTMLButtonElement` and contains additional API to set text, icons, and functionality. See more [usage details](https://design.infor.com/components/components/button/).\n\n## Themeable Parts\n\n- `button` allows you to further style the button element\n- `icon` allows you to further style the icon element (used in some types of buttons)\n- `text` allows you to further style the text element (used in some types of buttons)\n\n## Methods\n\n- `toggleAnimation(isActive?: boolean)`: Toggles generative AI button's active state, including its own indicator.\n- `focus()`: Programmatically focuses the button element.\n\n## Features (With Code Samples)\n\nA standalone primary button:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\">\n  <span>My Button</span>\n</ids-button>\n```\n\nAdding an icon to the button using the `icon` attribute:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span>My Button</span>\n</ids-button>\n```\n\nAn icon-only button without visible text. To maintain accessibility standards, descriptive text explaining the button's function is required. To hide this text visually but provide it to screen readers, add an \"audible\" class to the text `<span>`:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span class=\"audible\">My Button</span>\n</ids-button>\n```\n\n### Label Attribute\n\nThe `label` attribute can be used to set a descriptive label for the button. This is useful for accessibility or when you need additional metadata. The label functionality is provided by the [IdsLabelStateMixin](../../mixins/ids-label-state-mixin/README.md):\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" label=\"Save changes\">\n  <span>Save</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\nconst button = document.querySelector('#my-button');\nbutton.label = 'Save changes';\n```\n\n### Color Variants\n\nIf placing a button in a container with a contrasting background color, the \"base\" appearance may not contain accessible color contrast ratios. The `color-variant` property can be used with the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md):\n\n```html\n<!-- Generates a default (Tertiary) Button with white text and focus/hover states --->\n<ids-button id=\"my-button-1\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a Primary Button with a slightly brighter Blue --->\n<ids-button id=\"my-button-2\" appearance=\"primary\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a Secondary Button with a slightly brighter Neutral --->\n<ids-button id=\"my-button-3\" appearance=\"primary\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a button to use with toolbar formatter type --->\n<ids-button id=\"my-button-4\" color-variant=\"alternate-formatter\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Button Group Variant\n\nButton Group allows layout for buttons in use of popups, modal, popover, datepicker and timepicker. This feature is especially useful for buttons that presents actions within common layouts.\n\nSettings:\n- divider - if set to true adds additional border on top.\n- display - will set the layout either flex or inline-flex.\n- direction - will set the layout either row, row-reverse, column, column-reverse.\n- justify-content - will set the layout either start, stretch, end, flex-start, flex-end, center, left, right, space-between, space-around and space-evenly.\n- compact - if set to true makes the ids-buttons-group-section compact for flex containers.\n- label-position - Applies the same label-position offset as labeled form fields so the button group aligns within a side-label form layout.\n\n```html\n<ids-button-group divider=\"true\" display=\"flex\" direction=\"row\" justify-content=\"space-between\">\n  <ids-button-group-section gap=\"8\">\n    <ids-button width=\"125px\" id=\"test-button-back\" appearance=\"secondary\">\n      <span>Back</span>\n    </ids-button>\n  </ids-button-group-section>\n  <ids-button-group-section gap=\"8\">\n    <ids-button width=\"125px\" id=\"test-button-cancel\" appearance=\"secondary\">\n      <span>Cancel</span>\n    </ids-button>\n    <ids-button width=\"125px\" id=\"test-button-apply\" appearance=\"primary\">\n      <span>Apply</span>\n    </ids-button>\n  </ids-button-group-section>\n</ids-button-group>\n```\n\n### Compact Mode\n\nCompact mode reduces the height of buttons, including icon buttons and text buttons. This feature is especially useful for toolbar buttons or situations where space is limited.\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" compact=\"true\">\n  <span>My Button</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\n// Set the compact mode to true\ndocument.querySelector('#my-button').compact = true;\n\n// Set the compact mode to false\ndocument.querySelector('#my-button').compact = false;\n```\n\n## States and Variations\n\nStandard button states include:\n\n- Appearances types\n  - `default` (not displayed as a \"appearance\" attribute when set)\n  - `primary`\n  - `primary-destructive`\n  - `secondary`\n  - `tertiary`\n  - `tertiary-destructive`\n  - `primary-generative-ai`\n  - `tertiary-generative-ai`\n  - `secondary-generative-ai`\n- Normal\n- Hover\n- Focus\n- Active (pressed)\n- Disabled\n- Color Variant - alternate colors for each button appearance are available via the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md)\n\n### Alignment\n\nDefault alignment of text and icons within ids-button are based on the DOM order of those elements. However, if the `icon-align` attribute is specified, the alignment order of the inner elements can be forced.\n\nExample of icon that follows text, though the DOM order is reversed:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\" icon-align=\"end\">\n  <span>My Button</span>\n</ids-button>\n```\n\n`icon-align` effects:\n\n| Prop value | LTR (default) Icon Location | RTL Icon Location |\n| :--------- | :-------------------------- | :---------------- |\n| undefined  | n/a | n/a |\n| `start`    | Left of text | Right of text |\n| `end`      | Right of text | Left of text |\n\n### Type\n\nThe `type` attribute passes through to the Shadow Root's `HTMLButtonElement` and defines its usage.\n\nFor example, a `<form>` `submit` button:\n\n```html\n<ids-button id=\"my-button\" type=\"submit\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Height and Width\n\nWe do not recommend deviating on the size of the buttons from the original design. But for special uses cases you might change the height and width of a button like this. To change the height you need the span element in the button for it to center properly.\n\n```css\n<ids-button id=\"my-button\" height=\"60px\" width=\"200px\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Bottom Margin\n\nUse the `margin-block-end` attribute to add spacing below the button. This uses CSS logical properties, which respects RTL layouts.\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" margin-block-end=\"16px\">\n  <span>My Button</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\ndocument.querySelector('#my-button').marginBlockEnd = '1rem';\n```\n\n## Settings and Attributes\n\n- `appearance` {string} Visual style defining the button's purpose.\n- `badgeColor` {string} Sets the notification badge color if the button has an icon, passed to `ids-icon` component\n- `badgePosition` {string} Sets the notification badge position if the button has an icon, passed to `ids-icon` component\n- `marginBlockEnd` {string | null} Sets the bottom margin of the button using CSS logical property. Accepts any CSS length value (e.g. `'8px'`, `'1rem'`).\n- `colorVariant` {'alternate' | 'alternate-formatter'} Set the variants theme styles.\n- `compact` {boolean|string|null} Set the button to a compact size.\n- `contentAlign` {string} Sets content alignment within the button ('default', 'start', 'end')\n- `cssClass` {Array<string> | string | null} Contains space-delimited CSS classes (or an array of CSS classes) that will be passed to the Shadow Root button.\n- `disabled` {boolean} Sets the internal Button element's `disabled` property to enable/disable the button.\n- `height` {string} Sets height of the button. Accepts percent, pixels, rem, etc. (Only use this for isolated use cases)\n- `hidden` {boolean} Controls the visibility of the button\n- `icon` {string | null} A string representing an icon to display inside the button. This string is passed to a slotted [IdsIcon](../ids-icon/README.md) element's `icon` setting to set the desired icon type.\n- `iconAlign` {string} Defines which side to align the Button's icon against, can be 'start' or 'end'\n- `id` {string} Defines an identifier (ID) that must be unique within the entire document.\n- `label` {string | null} Sets a descriptive label for the button. This can be used for accessibility or additional metadata purposes.\n- `label-audible` {string | null} Sets audible text for button.\n- `label-position` {string} Positions the button as if it had an inline-start label, applying the same layout offset as labeled form fields. This keeps the button aligned within a form that uses side labels.\n- `label-width` {string | null} Overrides the default label width used for the inline offset (e.g. `'200px'`, `'250px'`). Sets the `--ids-label-width-inline-start` CSS variable on the host. When used with `label-position=\"inline-start\"`, the button's spacer element uses this width to match sibling input label widths. The spacer responds to the same `@media` and `@container` breakpoints as input labels.\n- `noAnimation` {boolean} Disables generative AI animations when true\n- `noMargins` {boolean} Removes default margins from the button\n- `noPadding` {boolean} Removes default padding from the button\n- `overflow` {string} Controls text overflow behavior, can be 'ellipsis' or null\n- `overflow-tooltip` {string} Controls which tooltip content displays based on overflow state when `overflow=\"ellipsis\"` is set. Values: `'text'` (default — shows button text when overflowing), `'custom'` (shows custom tooltip even when overflowing), `'false'` (no tooltip when overflowing). When text is NOT overflowing, the custom tooltip (if configured) always displays regardless of this setting. Does not require `tooltip=\"true\"` to be set.\n- `size` {string | null} Matches the button's occupied width to an `ids-input` size by adding `margin-inline-end`. Valid values: `'xs'` (75px), `'sm'` (150px), `'mm'` (225px), `'md'` (300px), `'lg'` (400px). The margin is computed dynamically so the button + margin equals the target input width.\n- `square` {boolean} whether the corners of the button as an icon-button are angled/90°.\n- `tabIndex` {string | number} Sets the internal Button element's `tabIndex` property for controlling focus\n- `text` {string} API-level method for setting a button's text content. This will become the content of the slotted text node when set.\n- `tooltip` {string} Sets up a string based tooltip.\n- `type` {string} Passes a 'type' attribute for the button, some map to standard `HTMLButtonElement` button types. This can be one of 'button', 'submit', 'reset', 'menu'.\n- `width` {string} Sets width of the button. Accepts percent, pixels, rem, etc.\n\n## Events\n\n- `click`: Fired when the button is clicked. For submit buttons, this will also trigger form submission.\n- `focus`: Fired when the button receives focus.\n- `blur`: Fired when the button loses focus.\n\n## Responsive Guidelines\n\n- Buttons can span 100% width of their parent container on mobile breakpoints.\n\n## Accessibility Guidelines\n\n- All buttons, including icon-only buttons, must have descriptive text inside the button to communicate its action to a screen reader user. Use the `audible` CSS class to visually hide the text if necessary.\n\n## Regional Considerations\n\nBe aware of the content layout for buttons in right-to-left (RTL) UIs.\n\n## Converting from Previous Versions\n\n**3.x to 4.x**\n- Change class `inforFormButton` default to `btn-primary`\n- Change class `inforFormButton` to `btn-secondary`\n\n**4.x to 5.x**\nThe ids-button is now a WebComponent. Instead of using classes to define a button's purpose or visual style, it's now done directly with an \"appearance\" attribute:\n\n```html\n<!-- 4.x button example -->\n<button class=\"btn-primary\" id=\"my-button\">\n  <svg class=\"icon\" role=\"presentation\">\n    <use href=\"#settings\"></use>\n  </svg>\n  <span>My Button</span>\n</button>\n\n<!-- this is the same button using the WebComponent -->\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span>My Button</span>\n</ids-button>\n```\n\n- Markup has changed to a custom element `<ids-button id=\"my-button\" appearance=\"primary\"></ids-button>`\n- Can now be imported as a single JS file and used with encapsulated styles.\n- Some button properties are now attributes - \"appearance\", \"text\", \"icon\", \"disabled\", etc.\n- Some components now extend IdsButton, such as [IdsToggleButton](../ids-toggle-button/README.md) and [IdsMenuButton](../ids-menu-button/README.md)...\n"}},{"name":"ids-button-group","attributes":[{"name":"divider","description":"Set the divider to button group","values":[]},{"name":"display","description":"Set the display setting","values":[]},{"name":"direction","description":"Set the direction setting","values":[]},{"name":"justify-content","description":"Set the justify content setting","values":[]},{"name":"compact","description":"Set the compact to button group","values":[]}],"description":{"kind":"markdown","value":"# ids-button\n\n## Description\n\nThe ids-button is a simple wrapper around a styled `HTMLButtonElement` and contains additional API to set text, icons, and functionality. See more [usage details](https://design.infor.com/components/components/button/).\n\n## Themeable Parts\n\n- `button` allows you to further style the button element\n- `icon` allows you to further style the icon element (used in some types of buttons)\n- `text` allows you to further style the text element (used in some types of buttons)\n\n## Methods\n\n- `toggleAnimation(isActive?: boolean)`: Toggles generative AI button's active state, including its own indicator.\n- `focus()`: Programmatically focuses the button element.\n\n## Features (With Code Samples)\n\nA standalone primary button:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\">\n  <span>My Button</span>\n</ids-button>\n```\n\nAdding an icon to the button using the `icon` attribute:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span>My Button</span>\n</ids-button>\n```\n\nAn icon-only button without visible text. To maintain accessibility standards, descriptive text explaining the button's function is required. To hide this text visually but provide it to screen readers, add an \"audible\" class to the text `<span>`:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span class=\"audible\">My Button</span>\n</ids-button>\n```\n\n### Label Attribute\n\nThe `label` attribute can be used to set a descriptive label for the button. This is useful for accessibility or when you need additional metadata. The label functionality is provided by the [IdsLabelStateMixin](../../mixins/ids-label-state-mixin/README.md):\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" label=\"Save changes\">\n  <span>Save</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\nconst button = document.querySelector('#my-button');\nbutton.label = 'Save changes';\n```\n\n### Color Variants\n\nIf placing a button in a container with a contrasting background color, the \"base\" appearance may not contain accessible color contrast ratios. The `color-variant` property can be used with the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md):\n\n```html\n<!-- Generates a default (Tertiary) Button with white text and focus/hover states --->\n<ids-button id=\"my-button-1\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a Primary Button with a slightly brighter Blue --->\n<ids-button id=\"my-button-2\" appearance=\"primary\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a Secondary Button with a slightly brighter Neutral --->\n<ids-button id=\"my-button-3\" appearance=\"primary\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a button to use with toolbar formatter type --->\n<ids-button id=\"my-button-4\" color-variant=\"alternate-formatter\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Button Group Variant\n\nButton Group allows layout for buttons in use of popups, modal, popover, datepicker and timepicker. This feature is especially useful for buttons that presents actions within common layouts.\n\nSettings:\n- divider - if set to true adds additional border on top.\n- display - will set the layout either flex or inline-flex.\n- direction - will set the layout either row, row-reverse, column, column-reverse.\n- justify-content - will set the layout either start, stretch, end, flex-start, flex-end, center, left, right, space-between, space-around and space-evenly.\n- compact - if set to true makes the ids-buttons-group-section compact for flex containers.\n- label-position - Applies the same label-position offset as labeled form fields so the button group aligns within a side-label form layout.\n\n```html\n<ids-button-group divider=\"true\" display=\"flex\" direction=\"row\" justify-content=\"space-between\">\n  <ids-button-group-section gap=\"8\">\n    <ids-button width=\"125px\" id=\"test-button-back\" appearance=\"secondary\">\n      <span>Back</span>\n    </ids-button>\n  </ids-button-group-section>\n  <ids-button-group-section gap=\"8\">\n    <ids-button width=\"125px\" id=\"test-button-cancel\" appearance=\"secondary\">\n      <span>Cancel</span>\n    </ids-button>\n    <ids-button width=\"125px\" id=\"test-button-apply\" appearance=\"primary\">\n      <span>Apply</span>\n    </ids-button>\n  </ids-button-group-section>\n</ids-button-group>\n```\n\n### Compact Mode\n\nCompact mode reduces the height of buttons, including icon buttons and text buttons. This feature is especially useful for toolbar buttons or situations where space is limited.\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" compact=\"true\">\n  <span>My Button</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\n// Set the compact mode to true\ndocument.querySelector('#my-button').compact = true;\n\n// Set the compact mode to false\ndocument.querySelector('#my-button').compact = false;\n```\n\n## States and Variations\n\nStandard button states include:\n\n- Appearances types\n  - `default` (not displayed as a \"appearance\" attribute when set)\n  - `primary`\n  - `primary-destructive`\n  - `secondary`\n  - `tertiary`\n  - `tertiary-destructive`\n  - `primary-generative-ai`\n  - `tertiary-generative-ai`\n  - `secondary-generative-ai`\n- Normal\n- Hover\n- Focus\n- Active (pressed)\n- Disabled\n- Color Variant - alternate colors for each button appearance are available via the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md)\n\n### Alignment\n\nDefault alignment of text and icons within ids-button are based on the DOM order of those elements. However, if the `icon-align` attribute is specified, the alignment order of the inner elements can be forced.\n\nExample of icon that follows text, though the DOM order is reversed:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\" icon-align=\"end\">\n  <span>My Button</span>\n</ids-button>\n```\n\n`icon-align` effects:\n\n| Prop value | LTR (default) Icon Location | RTL Icon Location |\n| :--------- | :-------------------------- | :---------------- |\n| undefined  | n/a | n/a |\n| `start`    | Left of text | Right of text |\n| `end`      | Right of text | Left of text |\n\n### Type\n\nThe `type` attribute passes through to the Shadow Root's `HTMLButtonElement` and defines its usage.\n\nFor example, a `<form>` `submit` button:\n\n```html\n<ids-button id=\"my-button\" type=\"submit\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Height and Width\n\nWe do not recommend deviating on the size of the buttons from the original design. But for special uses cases you might change the height and width of a button like this. To change the height you need the span element in the button for it to center properly.\n\n```css\n<ids-button id=\"my-button\" height=\"60px\" width=\"200px\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Bottom Margin\n\nUse the `margin-block-end` attribute to add spacing below the button. This uses CSS logical properties, which respects RTL layouts.\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" margin-block-end=\"16px\">\n  <span>My Button</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\ndocument.querySelector('#my-button').marginBlockEnd = '1rem';\n```\n\n## Settings and Attributes\n\n- `appearance` {string} Visual style defining the button's purpose.\n- `badgeColor` {string} Sets the notification badge color if the button has an icon, passed to `ids-icon` component\n- `badgePosition` {string} Sets the notification badge position if the button has an icon, passed to `ids-icon` component\n- `marginBlockEnd` {string | null} Sets the bottom margin of the button using CSS logical property. Accepts any CSS length value (e.g. `'8px'`, `'1rem'`).\n- `colorVariant` {'alternate' | 'alternate-formatter'} Set the variants theme styles.\n- `compact` {boolean|string|null} Set the button to a compact size.\n- `contentAlign` {string} Sets content alignment within the button ('default', 'start', 'end')\n- `cssClass` {Array<string> | string | null} Contains space-delimited CSS classes (or an array of CSS classes) that will be passed to the Shadow Root button.\n- `disabled` {boolean} Sets the internal Button element's `disabled` property to enable/disable the button.\n- `height` {string} Sets height of the button. Accepts percent, pixels, rem, etc. (Only use this for isolated use cases)\n- `hidden` {boolean} Controls the visibility of the button\n- `icon` {string | null} A string representing an icon to display inside the button. This string is passed to a slotted [IdsIcon](../ids-icon/README.md) element's `icon` setting to set the desired icon type.\n- `iconAlign` {string} Defines which side to align the Button's icon against, can be 'start' or 'end'\n- `id` {string} Defines an identifier (ID) that must be unique within the entire document.\n- `label` {string | null} Sets a descriptive label for the button. This can be used for accessibility or additional metadata purposes.\n- `label-audible` {string | null} Sets audible text for button.\n- `label-position` {string} Positions the button as if it had an inline-start label, applying the same layout offset as labeled form fields. This keeps the button aligned within a form that uses side labels.\n- `label-width` {string | null} Overrides the default label width used for the inline offset (e.g. `'200px'`, `'250px'`). Sets the `--ids-label-width-inline-start` CSS variable on the host. When used with `label-position=\"inline-start\"`, the button's spacer element uses this width to match sibling input label widths. The spacer responds to the same `@media` and `@container` breakpoints as input labels.\n- `noAnimation` {boolean} Disables generative AI animations when true\n- `noMargins` {boolean} Removes default margins from the button\n- `noPadding` {boolean} Removes default padding from the button\n- `overflow` {string} Controls text overflow behavior, can be 'ellipsis' or null\n- `overflow-tooltip` {string} Controls which tooltip content displays based on overflow state when `overflow=\"ellipsis\"` is set. Values: `'text'` (default — shows button text when overflowing), `'custom'` (shows custom tooltip even when overflowing), `'false'` (no tooltip when overflowing). When text is NOT overflowing, the custom tooltip (if configured) always displays regardless of this setting. Does not require `tooltip=\"true\"` to be set.\n- `size` {string | null} Matches the button's occupied width to an `ids-input` size by adding `margin-inline-end`. Valid values: `'xs'` (75px), `'sm'` (150px), `'mm'` (225px), `'md'` (300px), `'lg'` (400px). The margin is computed dynamically so the button + margin equals the target input width.\n- `square` {boolean} whether the corners of the button as an icon-button are angled/90°.\n- `tabIndex` {string | number} Sets the internal Button element's `tabIndex` property for controlling focus\n- `text` {string} API-level method for setting a button's text content. This will become the content of the slotted text node when set.\n- `tooltip` {string} Sets up a string based tooltip.\n- `type` {string} Passes a 'type' attribute for the button, some map to standard `HTMLButtonElement` button types. This can be one of 'button', 'submit', 'reset', 'menu'.\n- `width` {string} Sets width of the button. Accepts percent, pixels, rem, etc.\n\n## Events\n\n- `click`: Fired when the button is clicked. For submit buttons, this will also trigger form submission.\n- `focus`: Fired when the button receives focus.\n- `blur`: Fired when the button loses focus.\n\n## Responsive Guidelines\n\n- Buttons can span 100% width of their parent container on mobile breakpoints.\n\n## Accessibility Guidelines\n\n- All buttons, including icon-only buttons, must have descriptive text inside the button to communicate its action to a screen reader user. Use the `audible` CSS class to visually hide the text if necessary.\n\n## Regional Considerations\n\nBe aware of the content layout for buttons in right-to-left (RTL) UIs.\n\n## Converting from Previous Versions\n\n**3.x to 4.x**\n- Change class `inforFormButton` default to `btn-primary`\n- Change class `inforFormButton` to `btn-secondary`\n\n**4.x to 5.x**\nThe ids-button is now a WebComponent. Instead of using classes to define a button's purpose or visual style, it's now done directly with an \"appearance\" attribute:\n\n```html\n<!-- 4.x button example -->\n<button class=\"btn-primary\" id=\"my-button\">\n  <svg class=\"icon\" role=\"presentation\">\n    <use href=\"#settings\"></use>\n  </svg>\n  <span>My Button</span>\n</button>\n\n<!-- this is the same button using the WebComponent -->\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span>My Button</span>\n</ids-button>\n```\n\n- Markup has changed to a custom element `<ids-button id=\"my-button\" appearance=\"primary\"></ids-button>`\n- Can now be imported as a single JS file and used with encapsulated styles.\n- Some button properties are now attributes - \"appearance\", \"text\", \"icon\", \"disabled\", etc.\n- Some components now extend IdsButton, such as [IdsToggleButton](../ids-toggle-button/README.md) and [IdsMenuButton](../ids-menu-button/README.md)...\n"}},{"name":"ids-button","attributes":[{"name":"should-update","values":[]},{"name":"#is-setting-initial-state","values":[]},{"name":"#size-ro","description":"ResizeObserver for size-based margin computation","values":[]},{"name":"#is-overflowing","values":[]},{"name":"size-widths","description":"Map of size keys to CSS variable names matching ids-input widths","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"#mo","description":"Watches for changes","values":[]},{"name":"#audible-mo","description":"Watches for changes on .audible element within the button","values":[]},{"name":"proto-classes","description":"Figure out the classes","values":[]},{"name":"#is-updating-hidden","values":[]},{"name":"tab-index","description":"Set the tab index value","values":[]},{"name":"hidden","description":"Set the hidden value","values":[]},{"name":"button","values":[]},{"name":"span","values":[]},{"name":"compact","description":"Indicates whether the button is in a compact state.","values":[]},{"name":"content-align","description":"Set the button content alignment between 'default (center)', 'start', or 'end'","values":[]},{"name":"overflow","description":"Set how content overflows; can specify 'ellipsis', or undefined or 'none'","values":[]},{"name":"css-class","values":[]},{"name":"disabled","description":"Passes a disabled attribute from the custom element to the button","values":[]},{"name":"#tab-index","description":"Passes a tabIndex attribute from the custom element to the button","values":[]},{"name":"icon","description":"Gets the current icon used on the button","values":[]},{"name":"icon-el","description":"Gets the current icon element","values":[]},{"name":"icon-align","description":"Sets the automatic alignment of an existing icon to the 'start' or 'end' of the text","values":[]},{"name":"width","description":"Set width of button","values":[]},{"name":"height","description":"Set height of button","values":[]},{"name":"no-animation","description":"Gets flag for generative AI animation","values":[]},{"name":"text","values":[]},{"name":"appearance","description":"Set the button appearance between 'default', 'primary', 'secondary', 'tertiary', or 'destructive'","values":[]},{"name":"type","description":"Sets the HTMLButtonElement 'type' attribute","values":[]},{"name":"no-margins","description":"Sets the no margins attribute","values":[]},{"name":"margin-block-end","description":"Sets the margin-block-end on the button","values":[]},{"name":"no-padding","values":[]},{"name":"square","values":[]},{"name":"badge-color","values":[]},{"name":"badge-position","values":[]},{"name":"label-audible","description":"Set the audible text of button","values":[]},{"name":"label-width","description":"Gets the current label width value","values":[]},{"name":"label-position","description":"Gets the current label position value","values":[]},{"name":"size","description":"Gets the current size value","values":[]},{"name":"described-by","description":"Aria describedby for button","values":[]},{"name":"background-fill","description":"Get the background fill setting","values":[]}],"description":{"kind":"markdown","value":"# ids-button\n\n## Description\n\nThe ids-button is a simple wrapper around a styled `HTMLButtonElement` and contains additional API to set text, icons, and functionality. See more [usage details](https://design.infor.com/components/components/button/).\n\n## Themeable Parts\n\n- `button` allows you to further style the button element\n- `icon` allows you to further style the icon element (used in some types of buttons)\n- `text` allows you to further style the text element (used in some types of buttons)\n\n## Methods\n\n- `toggleAnimation(isActive?: boolean)`: Toggles generative AI button's active state, including its own indicator.\n- `focus()`: Programmatically focuses the button element.\n\n## Features (With Code Samples)\n\nA standalone primary button:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\">\n  <span>My Button</span>\n</ids-button>\n```\n\nAdding an icon to the button using the `icon` attribute:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span>My Button</span>\n</ids-button>\n```\n\nAn icon-only button without visible text. To maintain accessibility standards, descriptive text explaining the button's function is required. To hide this text visually but provide it to screen readers, add an \"audible\" class to the text `<span>`:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span class=\"audible\">My Button</span>\n</ids-button>\n```\n\n### Label Attribute\n\nThe `label` attribute can be used to set a descriptive label for the button. This is useful for accessibility or when you need additional metadata. The label functionality is provided by the [IdsLabelStateMixin](../../mixins/ids-label-state-mixin/README.md):\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" label=\"Save changes\">\n  <span>Save</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\nconst button = document.querySelector('#my-button');\nbutton.label = 'Save changes';\n```\n\n### Color Variants\n\nIf placing a button in a container with a contrasting background color, the \"base\" appearance may not contain accessible color contrast ratios. The `color-variant` property can be used with the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md):\n\n```html\n<!-- Generates a default (Tertiary) Button with white text and focus/hover states --->\n<ids-button id=\"my-button-1\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a Primary Button with a slightly brighter Blue --->\n<ids-button id=\"my-button-2\" appearance=\"primary\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a Secondary Button with a slightly brighter Neutral --->\n<ids-button id=\"my-button-3\" appearance=\"primary\" color-variant=\"alternate\">\n  <span>My Button</span>\n</ids-button>\n\n<!-- Generates a button to use with toolbar formatter type --->\n<ids-button id=\"my-button-4\" color-variant=\"alternate-formatter\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Button Group Variant\n\nButton Group allows layout for buttons in use of popups, modal, popover, datepicker and timepicker. This feature is especially useful for buttons that presents actions within common layouts.\n\nSettings:\n- divider - if set to true adds additional border on top.\n- display - will set the layout either flex or inline-flex.\n- direction - will set the layout either row, row-reverse, column, column-reverse.\n- justify-content - will set the layout either start, stretch, end, flex-start, flex-end, center, left, right, space-between, space-around and space-evenly.\n- compact - if set to true makes the ids-buttons-group-section compact for flex containers.\n- label-position - Applies the same label-position offset as labeled form fields so the button group aligns within a side-label form layout.\n\n```html\n<ids-button-group divider=\"true\" display=\"flex\" direction=\"row\" justify-content=\"space-between\">\n  <ids-button-group-section gap=\"8\">\n    <ids-button width=\"125px\" id=\"test-button-back\" appearance=\"secondary\">\n      <span>Back</span>\n    </ids-button>\n  </ids-button-group-section>\n  <ids-button-group-section gap=\"8\">\n    <ids-button width=\"125px\" id=\"test-button-cancel\" appearance=\"secondary\">\n      <span>Cancel</span>\n    </ids-button>\n    <ids-button width=\"125px\" id=\"test-button-apply\" appearance=\"primary\">\n      <span>Apply</span>\n    </ids-button>\n  </ids-button-group-section>\n</ids-button-group>\n```\n\n### Compact Mode\n\nCompact mode reduces the height of buttons, including icon buttons and text buttons. This feature is especially useful for toolbar buttons or situations where space is limited.\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" compact=\"true\">\n  <span>My Button</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\n// Set the compact mode to true\ndocument.querySelector('#my-button').compact = true;\n\n// Set the compact mode to false\ndocument.querySelector('#my-button').compact = false;\n```\n\n## States and Variations\n\nStandard button states include:\n\n- Appearances types\n  - `default` (not displayed as a \"appearance\" attribute when set)\n  - `primary`\n  - `primary-destructive`\n  - `secondary`\n  - `tertiary`\n  - `tertiary-destructive`\n  - `primary-generative-ai`\n  - `tertiary-generative-ai`\n  - `secondary-generative-ai`\n- Normal\n- Hover\n- Focus\n- Active (pressed)\n- Disabled\n- Color Variant - alternate colors for each button appearance are available via the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md)\n\n### Alignment\n\nDefault alignment of text and icons within ids-button are based on the DOM order of those elements. However, if the `icon-align` attribute is specified, the alignment order of the inner elements can be forced.\n\nExample of icon that follows text, though the DOM order is reversed:\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\" icon-align=\"end\">\n  <span>My Button</span>\n</ids-button>\n```\n\n`icon-align` effects:\n\n| Prop value | LTR (default) Icon Location | RTL Icon Location |\n| :--------- | :-------------------------- | :---------------- |\n| undefined  | n/a | n/a |\n| `start`    | Left of text | Right of text |\n| `end`      | Right of text | Left of text |\n\n### Type\n\nThe `type` attribute passes through to the Shadow Root's `HTMLButtonElement` and defines its usage.\n\nFor example, a `<form>` `submit` button:\n\n```html\n<ids-button id=\"my-button\" type=\"submit\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Height and Width\n\nWe do not recommend deviating on the size of the buttons from the original design. But for special uses cases you might change the height and width of a button like this. To change the height you need the span element in the button for it to center properly.\n\n```css\n<ids-button id=\"my-button\" height=\"60px\" width=\"200px\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Bottom Margin\n\nUse the `margin-block-end` attribute to add spacing below the button. This uses CSS logical properties, which respects RTL layouts.\n\n```html\n<ids-button id=\"my-button\" appearance=\"primary\" margin-block-end=\"16px\">\n  <span>My Button</span>\n</ids-button>\n```\n\nYou can also set it programmatically:\n\n```javascript\ndocument.querySelector('#my-button').marginBlockEnd = '1rem';\n```\n\n## Settings and Attributes\n\n- `appearance` {string} Visual style defining the button's purpose.\n- `badgeColor` {string} Sets the notification badge color if the button has an icon, passed to `ids-icon` component\n- `badgePosition` {string} Sets the notification badge position if the button has an icon, passed to `ids-icon` component\n- `marginBlockEnd` {string | null} Sets the bottom margin of the button using CSS logical property. Accepts any CSS length value (e.g. `'8px'`, `'1rem'`).\n- `colorVariant` {'alternate' | 'alternate-formatter'} Set the variants theme styles.\n- `compact` {boolean|string|null} Set the button to a compact size.\n- `contentAlign` {string} Sets content alignment within the button ('default', 'start', 'end')\n- `cssClass` {Array<string> | string | null} Contains space-delimited CSS classes (or an array of CSS classes) that will be passed to the Shadow Root button.\n- `disabled` {boolean} Sets the internal Button element's `disabled` property to enable/disable the button.\n- `height` {string} Sets height of the button. Accepts percent, pixels, rem, etc. (Only use this for isolated use cases)\n- `hidden` {boolean} Controls the visibility of the button\n- `icon` {string | null} A string representing an icon to display inside the button. This string is passed to a slotted [IdsIcon](../ids-icon/README.md) element's `icon` setting to set the desired icon type.\n- `iconAlign` {string} Defines which side to align the Button's icon against, can be 'start' or 'end'\n- `id` {string} Defines an identifier (ID) that must be unique within the entire document.\n- `label` {string | null} Sets a descriptive label for the button. This can be used for accessibility or additional metadata purposes.\n- `label-audible` {string | null} Sets audible text for button.\n- `label-position` {string} Positions the button as if it had an inline-start label, applying the same layout offset as labeled form fields. This keeps the button aligned within a form that uses side labels.\n- `label-width` {string | null} Overrides the default label width used for the inline offset (e.g. `'200px'`, `'250px'`). Sets the `--ids-label-width-inline-start` CSS variable on the host. When used with `label-position=\"inline-start\"`, the button's spacer element uses this width to match sibling input label widths. The spacer responds to the same `@media` and `@container` breakpoints as input labels.\n- `noAnimation` {boolean} Disables generative AI animations when true\n- `noMargins` {boolean} Removes default margins from the button\n- `noPadding` {boolean} Removes default padding from the button\n- `overflow` {string} Controls text overflow behavior, can be 'ellipsis' or null\n- `overflow-tooltip` {string} Controls which tooltip content displays based on overflow state when `overflow=\"ellipsis\"` is set. Values: `'text'` (default — shows button text when overflowing), `'custom'` (shows custom tooltip even when overflowing), `'false'` (no tooltip when overflowing). When text is NOT overflowing, the custom tooltip (if configured) always displays regardless of this setting. Does not require `tooltip=\"true\"` to be set.\n- `size` {string | null} Matches the button's occupied width to an `ids-input` size by adding `margin-inline-end`. Valid values: `'xs'` (75px), `'sm'` (150px), `'mm'` (225px), `'md'` (300px), `'lg'` (400px). The margin is computed dynamically so the button + margin equals the target input width.\n- `square` {boolean} whether the corners of the button as an icon-button are angled/90°.\n- `tabIndex` {string | number} Sets the internal Button element's `tabIndex` property for controlling focus\n- `text` {string} API-level method for setting a button's text content. This will become the content of the slotted text node when set.\n- `tooltip` {string} Sets up a string based tooltip.\n- `type` {string} Passes a 'type' attribute for the button, some map to standard `HTMLButtonElement` button types. This can be one of 'button', 'submit', 'reset', 'menu'.\n- `width` {string} Sets width of the button. Accepts percent, pixels, rem, etc.\n\n## Events\n\n- `click`: Fired when the button is clicked. For submit buttons, this will also trigger form submission.\n- `focus`: Fired when the button receives focus.\n- `blur`: Fired when the button loses focus.\n\n## Responsive Guidelines\n\n- Buttons can span 100% width of their parent container on mobile breakpoints.\n\n## Accessibility Guidelines\n\n- All buttons, including icon-only buttons, must have descriptive text inside the button to communicate its action to a screen reader user. Use the `audible` CSS class to visually hide the text if necessary.\n\n## Regional Considerations\n\nBe aware of the content layout for buttons in right-to-left (RTL) UIs.\n\n## Converting from Previous Versions\n\n**3.x to 4.x**\n- Change class `inforFormButton` default to `btn-primary`\n- Change class `inforFormButton` to `btn-secondary`\n\n**4.x to 5.x**\nThe ids-button is now a WebComponent. Instead of using classes to define a button's purpose or visual style, it's now done directly with an \"appearance\" attribute:\n\n```html\n<!-- 4.x button example -->\n<button class=\"btn-primary\" id=\"my-button\">\n  <svg class=\"icon\" role=\"presentation\">\n    <use href=\"#settings\"></use>\n  </svg>\n  <span>My Button</span>\n</button>\n\n<!-- this is the same button using the WebComponent -->\n<ids-button id=\"my-button\" appearance=\"primary\" icon=\"settings\">\n  <span>My Button</span>\n</ids-button>\n```\n\n- Markup has changed to a custom element `<ids-button id=\"my-button\" appearance=\"primary\"></ids-button>`\n- Can now be imported as a single JS file and used with encapsulated styles.\n- Some button properties are now attributes - \"appearance\", \"text\", \"icon\", \"disabled\", etc.\n- Some components now extend IdsButton, such as [IdsToggleButton](../ids-toggle-button/README.md) and [IdsMenuButton](../ids-menu-button/README.md)...\n"}},{"name":"ids-calendar-event-group","attributes":[{"name":"#order","values":[]},{"name":"css-classes","values":[]},{"name":"#date-key","values":[]},{"name":"cached-events","values":[]},{"name":"cached-event-type","values":[]},{"name":"#tooltip-settings","values":[]},{"name":"#show-tooltip","values":[]},{"name":"on-language-change","description":"Respond to language changes","values":[]},{"name":"locale-api","values":[]},{"name":"event-data","description":"Gets calendar event data","values":[]},{"name":"event-type-data","description":"Gets calendar event type","values":[]},{"name":"y-offset","description":"Gets y offset","values":[]},{"name":"x-offset","description":"Sets horizontal position of calendar event\nStyles left or right depending on rtl flag","values":[]},{"name":"height","description":"Gets height","values":[]},{"name":"width","description":"Gets width","values":[]},{"name":"css-class","description":"Sets extra css classes to calendar event","values":[]},{"name":"overflow","description":"Gets overflow value of IdsText","values":[]},{"name":"order","description":"Gets order property","values":[]},{"name":"color","description":"Gets color property from event type data","values":[]},{"name":"date-key","description":"Gets dateKey property","values":[]},{"name":"disabled","description":"Get disabled property","values":[]},{"name":"tooltip-settings","description":"sets the tooltip settings","values":[]},{"name":"show-tooltip","description":"Sets the show tooltip setting","values":[]}],"description":{"kind":"markdown","value":"# ids-calendar\n\n## Description\n\nThe ids-calendar component provides a calendar view that displays month, week, and day views. See more [usage details](https://design.infor.com/components/components/calendar).\n\n## Use Cases\n- Displays month view in selected date\n- Display a week calendar in selected date\n- Display one day calendar in selected date\n\n## Settings (Attributes)\n- `date` `{string|null}` - Specifies active date in a string date format. Defaults to current date.\n- `show-details` `{string|null}` - Specifies whether detail pane is shown\n- `show-legend` `{string|null}` - Specifies whether legend pane is shown\n- `suppress-form` `{boolean}` - Disables built in calendar event forms which handle creating/updating calendar events.\n- `display-time` `{boolean}` - Controls whether time information is displayed in calendar events\n- `display-comments` `{boolean}` - Controls whether comments are displayed in calendar events\n- `group-events` `{boolean}` - Controls whether similar calendar events are grouped by type\n\n## Settings (Properties)\n- `eventsData` `{Array<CalendarEventData>}` - Array of calendar event data to populate the week view\n- `eventTypesData` `{Array<CalendarEventTypeData>}` - Array of calendar event types used to categorize calendar events\n\n## Calendar Event Data Properties\n- `headerIcons` `{Array<{icon: string, tooltip?: string, color?: string}>}` - Array of icons displayed in the event header with optional tooltips and colors\n- `rsvpState` `{RsvpState}` - RSVP status for the event. Values: `pending`, `declined`, `attending`, `notAttending`\n\n## Events\n- `eventadded` - Fires when new event is added to calendar. Detail contains new event and calendar element.\n- `eventupdated` - Fires when existing event is updated. Detail contains updated event and calendar element.\n- `beforeeventrendered` Fires for each event rendered (full day or in day) before the element is added to the DOM. This event can fire frequently or more than expected as the component does re-rendering.\n- `aftereventrendered` Fires for each event rendered (full day or in day) after the element is added to the DOM. This event can fire frequently or more than expected as the component does re-rendering.\n- `daydblclick` - Fires when a day cell in month view is double clicked.\n- `clickcalendarevent` - Fires when a calendar event is clicked. Detail contains IdsCalendarEvent element.\n- `dblclickcalendarevent` - Fires when a calendar event is double clicked. Detail contains IdsCalendarEvent element.\n- `eventsrendered` - Fires when calendar events are rendered in current view. Detail contains calendar events data.\n- `afterrendermonth` - Fires when after month render. Detail contains calendar events data.\n- `beforerendermonth` - Fires when before month render. Detail contains calendar events data.\n\n## Methods\n- `addEvent(eventData: CalendarEventData)` - Add an event to the calendar.\n- `updateEvent(eventData: CalendarEventData)` - Update an existing calendar event.\n\n## Features (With Code Examples)\n\nWith no settings. Calendar shows month view set to current date without legend or detail panes.\n\n```html\n<ids-calendar></ids-calendar>\n```\n\nWith `date` setting. Calendar shows month/week/day view of provided date.\n\n```html\n<ids-calendar date=\"11/11/2021\"></ids-calendar>\n```\n\nWith `show-legend` setting. Calendar shows legend pane. By default, legend pane contains calendar event type checkboxes\nused to filter populated calendar events by event type.\n\n```html\n<ids-calendar\n  date=\"11/11/2021\"\n  show-legend=\"true\"\n></ids-calendar>\n```\n\nWith `show-details` setting. Calendar shows details pane. Detail pane shows detailed list of calendar event within the active date.\nDetail pane is only visible when month view is active.\n\n```html\n<ids-calendar\n  date=\"11/01/2021\"\n  show-details=\"true\"\n></ids-calendar>\n```\n\nThe component can be controlled dynamically\n\n```js\nconst calendar = document.querySelector('ids-calendar');\n\n// Changing date\ncalendar.date = 'Tue Nov 16 2021';\ncalendar.date = '11/17/2021';\n\n// Changing pane visibility\ncalendar.showLegend = false;\ncalendar.showDetails = true;\n\n// Setting calendar event data\ncalendar.eventsData = [...eventsData];\ncalendar.eventsData = [];\n\n// Setting calendar event types data\ncalendar.eventTypesData = [...eventTypesData];\ncalendar.eventTypesData = [];\n\n// Calendar event with header icons and RSVP state\nconst eventWithIcons = {\n  id: 'event-1',\n  subject: 'Team Meeting',\n  starts: '2021-11-16T10:00:00',\n  ends: '2021-11-16T11:00:00',\n  type: 'meeting',\n  isAllDay: false,\n  headerIcons: [\n    { icon: 'user-profile', tooltip: 'Required attendees', color: 'info' },\n    { icon: 'attach', tooltip: 'Has attachments' }\n  ],\n  rsvpState: 'pending'\n};\ncalendar.eventsData = [eventWithIcons];\n```\n"}},{"name":"ids-calendar-event","attributes":[{"name":"#order","values":[]},{"name":"css-classes","values":[]},{"name":"#date-key","values":[]},{"name":"cached-event","values":[]},{"name":"cached-event-type","values":[]},{"name":"#show-tooltip","values":[]},{"name":"#tooltip-settings","values":[]},{"name":"header-icon-tooltips","values":[]},{"name":"on-language-change","description":"Respond to language changes","values":[]},{"name":"locale-api","values":[]},{"name":"event-data","description":"Gets calendar event data","values":[]},{"name":"event-type-data","description":"Gets calendar event type","values":[]},{"name":"y-offset","description":"Gets y offset","values":[]},{"name":"x-offset","description":"Sets horizontal position of calendar event\nStyles left or right depending on rtl flag","values":[]},{"name":"height","description":"Gets height","values":[]},{"name":"width","description":"Gets width","values":[]},{"name":"css-class","description":"Sets extra css classes to calendar event","values":[]},{"name":"start-date","description":"Gets start date of calendar event","values":[]},{"name":"end-date","description":"Gets end date of calendar event","values":[]},{"name":"duration","description":"Gets duration of event in hours","values":[]},{"name":"display-time","description":"Gets displayTime setting value","values":[]},{"name":"display-comments","description":"Gets displayComments setting value","values":[]},{"name":"overflow","description":"Gets overflow value of IdsText","values":[]},{"name":"order","description":"Gets order property","values":[]},{"name":"color","description":"Gets color property from event type data","values":[]},{"name":"date-key","description":"Gets dateKey property","values":[]},{"name":"disabled","description":"Get disabled property","values":[]},{"name":"tooltip-settings","description":"sets the tooltip settings","values":[]},{"name":"show-tooltip","description":"Sets the show tooltip setting","values":[]}],"description":{"kind":"markdown","value":"# ids-calendar\n\n## Description\n\nThe ids-calendar component provides a calendar view that displays month, week, and day views. See more [usage details](https://design.infor.com/components/components/calendar).\n\n## Use Cases\n- Displays month view in selected date\n- Display a week calendar in selected date\n- Display one day calendar in selected date\n\n## Settings (Attributes)\n- `date` `{string|null}` - Specifies active date in a string date format. Defaults to current date.\n- `show-details` `{string|null}` - Specifies whether detail pane is shown\n- `show-legend` `{string|null}` - Specifies whether legend pane is shown\n- `suppress-form` `{boolean}` - Disables built in calendar event forms which handle creating/updating calendar events.\n- `display-time` `{boolean}` - Controls whether time information is displayed in calendar events\n- `display-comments` `{boolean}` - Controls whether comments are displayed in calendar events\n- `group-events` `{boolean}` - Controls whether similar calendar events are grouped by type\n\n## Settings (Properties)\n- `eventsData` `{Array<CalendarEventData>}` - Array of calendar event data to populate the week view\n- `eventTypesData` `{Array<CalendarEventTypeData>}` - Array of calendar event types used to categorize calendar events\n\n## Calendar Event Data Properties\n- `headerIcons` `{Array<{icon: string, tooltip?: string, color?: string}>}` - Array of icons displayed in the event header with optional tooltips and colors\n- `rsvpState` `{RsvpState}` - RSVP status for the event. Values: `pending`, `declined`, `attending`, `notAttending`\n\n## Events\n- `eventadded` - Fires when new event is added to calendar. Detail contains new event and calendar element.\n- `eventupdated` - Fires when existing event is updated. Detail contains updated event and calendar element.\n- `beforeeventrendered` Fires for each event rendered (full day or in day) before the element is added to the DOM. This event can fire frequently or more than expected as the component does re-rendering.\n- `aftereventrendered` Fires for each event rendered (full day or in day) after the element is added to the DOM. This event can fire frequently or more than expected as the component does re-rendering.\n- `daydblclick` - Fires when a day cell in month view is double clicked.\n- `clickcalendarevent` - Fires when a calendar event is clicked. Detail contains IdsCalendarEvent element.\n- `dblclickcalendarevent` - Fires when a calendar event is double clicked. Detail contains IdsCalendarEvent element.\n- `eventsrendered` - Fires when calendar events are rendered in current view. Detail contains calendar events data.\n- `afterrendermonth` - Fires when after month render. Detail contains calendar events data.\n- `beforerendermonth` - Fires when before month render. Detail contains calendar events data.\n\n## Methods\n- `addEvent(eventData: CalendarEventData)` - Add an event to the calendar.\n- `updateEvent(eventData: CalendarEventData)` - Update an existing calendar event.\n\n## Features (With Code Examples)\n\nWith no settings. Calendar shows month view set to current date without legend or detail panes.\n\n```html\n<ids-calendar></ids-calendar>\n```\n\nWith `date` setting. Calendar shows month/week/day view of provided date.\n\n```html\n<ids-calendar date=\"11/11/2021\"></ids-calendar>\n```\n\nWith `show-legend` setting. Calendar shows legend pane. By default, legend pane contains calendar event type checkboxes\nused to filter populated calendar events by event type.\n\n```html\n<ids-calendar\n  date=\"11/11/2021\"\n  show-legend=\"true\"\n></ids-calendar>\n```\n\nWith `show-details` setting. Calendar shows details pane. Detail pane shows detailed list of calendar event within the active date.\nDetail pane is only visible when month view is active.\n\n```html\n<ids-calendar\n  date=\"11/01/2021\"\n  show-details=\"true\"\n></ids-calendar>\n```\n\nThe component can be controlled dynamically\n\n```js\nconst calendar = document.querySelector('ids-calendar');\n\n// Changing date\ncalendar.date = 'Tue Nov 16 2021';\ncalendar.date = '11/17/2021';\n\n// Changing pane visibility\ncalendar.showLegend = false;\ncalendar.showDetails = true;\n\n// Setting calendar event data\ncalendar.eventsData = [...eventsData];\ncalendar.eventsData = [];\n\n// Setting calendar event types data\ncalendar.eventTypesData = [...eventTypesData];\ncalendar.eventTypesData = [];\n\n// Calendar event with header icons and RSVP state\nconst eventWithIcons = {\n  id: 'event-1',\n  subject: 'Team Meeting',\n  starts: '2021-11-16T10:00:00',\n  ends: '2021-11-16T11:00:00',\n  type: 'meeting',\n  isAllDay: false,\n  headerIcons: [\n    { icon: 'user-profile', tooltip: 'Required attendees', color: 'info' },\n    { icon: 'attach', tooltip: 'Has attachments' }\n  ],\n  rsvpState: 'pending'\n};\ncalendar.eventsData = [eventWithIcons];\n```\n"}},{"name":"ids-calendar","attributes":[{"name":"#mobile-breakpoint","values":[]},{"name":"#resize-observer","values":[]},{"name":"#selected-event-id","values":[]},{"name":"#has-custom-legend","values":[]},{"name":"#tooltip-settings","values":[]},{"name":"suppress-form","description":"Get the suppress form state","values":[]},{"name":"show-details","description":"Get the show details state","values":[]},{"name":"show-legend","description":"Get the show legend state","values":[]},{"name":"show-today","description":"Set whether or not the today button should be shown","values":[]},{"name":"show-tooltip","description":"Set whether or not to show the tooltip","values":[]},{"name":"tooltip-settings","description":"Sets the tooltip settings","values":[]},{"name":"slide-selection","description":"Sets the slide selection","values":[]},{"name":"date","description":"Get the active date","values":[]},{"name":"on-locale-change","description":"Handle when locale changes","values":[]},{"name":"#last-month-legend-data","values":[]},{"name":"start-date","description":"Get the start date","values":[]},{"name":"end-date","description":"Get the end date","values":[]},{"name":"display-time","description":"Gets displayTime setting value","values":[]},{"name":"group-events","description":"Gets groupEvents setting value","values":[]},{"name":"display-comments","description":"Gets displayComments setting value","values":[]}],"description":{"kind":"markdown","value":"# ids-calendar\n\n## Description\n\nThe ids-calendar component provides a calendar view that displays month, week, and day views. See more [usage details](https://design.infor.com/components/components/calendar).\n\n## Use Cases\n- Displays month view in selected date\n- Display a week calendar in selected date\n- Display one day calendar in selected date\n\n## Settings (Attributes)\n- `date` `{string|null}` - Specifies active date in a string date format. Defaults to current date.\n- `show-details` `{string|null}` - Specifies whether detail pane is shown\n- `show-legend` `{string|null}` - Specifies whether legend pane is shown\n- `suppress-form` `{boolean}` - Disables built in calendar event forms which handle creating/updating calendar events.\n- `display-time` `{boolean}` - Controls whether time information is displayed in calendar events\n- `display-comments` `{boolean}` - Controls whether comments are displayed in calendar events\n- `group-events` `{boolean}` - Controls whether similar calendar events are grouped by type\n\n## Settings (Properties)\n- `eventsData` `{Array<CalendarEventData>}` - Array of calendar event data to populate the week view\n- `eventTypesData` `{Array<CalendarEventTypeData>}` - Array of calendar event types used to categorize calendar events\n\n## Calendar Event Data Properties\n- `headerIcons` `{Array<{icon: string, tooltip?: string, color?: string}>}` - Array of icons displayed in the event header with optional tooltips and colors\n- `rsvpState` `{RsvpState}` - RSVP status for the event. Values: `pending`, `declined`, `attending`, `notAttending`\n\n## Events\n- `eventadded` - Fires when new event is added to calendar. Detail contains new event and calendar element.\n- `eventupdated` - Fires when existing event is updated. Detail contains updated event and calendar element.\n- `beforeeventrendered` Fires for each event rendered (full day or in day) before the element is added to the DOM. This event can fire frequently or more than expected as the component does re-rendering.\n- `aftereventrendered` Fires for each event rendered (full day or in day) after the element is added to the DOM. This event can fire frequently or more than expected as the component does re-rendering.\n- `daydblclick` - Fires when a day cell in month view is double clicked.\n- `clickcalendarevent` - Fires when a calendar event is clicked. Detail contains IdsCalendarEvent element.\n- `dblclickcalendarevent` - Fires when a calendar event is double clicked. Detail contains IdsCalendarEvent element.\n- `eventsrendered` - Fires when calendar events are rendered in current view. Detail contains calendar events data.\n- `afterrendermonth` - Fires when after month render. Detail contains calendar events data.\n- `beforerendermonth` - Fires when before month render. Detail contains calendar events data.\n\n## Methods\n- `addEvent(eventData: CalendarEventData)` - Add an event to the calendar.\n- `updateEvent(eventData: CalendarEventData)` - Update an existing calendar event.\n\n## Features (With Code Examples)\n\nWith no settings. Calendar shows month view set to current date without legend or detail panes.\n\n```html\n<ids-calendar></ids-calendar>\n```\n\nWith `date` setting. Calendar shows month/week/day view of provided date.\n\n```html\n<ids-calendar date=\"11/11/2021\"></ids-calendar>\n```\n\nWith `show-legend` setting. Calendar shows legend pane. By default, legend pane contains calendar event type checkboxes\nused to filter populated calendar events by event type.\n\n```html\n<ids-calendar\n  date=\"11/11/2021\"\n  show-legend=\"true\"\n></ids-calendar>\n```\n\nWith `show-details` setting. Calendar shows details pane. Detail pane shows detailed list of calendar event within the active date.\nDetail pane is only visible when month view is active.\n\n```html\n<ids-calendar\n  date=\"11/01/2021\"\n  show-details=\"true\"\n></ids-calendar>\n```\n\nThe component can be controlled dynamically\n\n```js\nconst calendar = document.querySelector('ids-calendar');\n\n// Changing date\ncalendar.date = 'Tue Nov 16 2021';\ncalendar.date = '11/17/2021';\n\n// Changing pane visibility\ncalendar.showLegend = false;\ncalendar.showDetails = true;\n\n// Setting calendar event data\ncalendar.eventsData = [...eventsData];\ncalendar.eventsData = [];\n\n// Setting calendar event types data\ncalendar.eventTypesData = [...eventTypesData];\ncalendar.eventTypesData = [];\n\n// Calendar event with header icons and RSVP state\nconst eventWithIcons = {\n  id: 'event-1',\n  subject: 'Team Meeting',\n  starts: '2021-11-16T10:00:00',\n  ends: '2021-11-16T11:00:00',\n  type: 'meeting',\n  isAllDay: false,\n  headerIcons: [\n    { icon: 'user-profile', tooltip: 'Required attendees', color: 'info' },\n    { icon: 'attach', tooltip: 'Has attachments' }\n  ],\n  rsvpState: 'pending'\n};\ncalendar.eventsData = [eventWithIcons];\n```\n"}},{"name":"ids-card-action","attributes":[],"description":{"kind":"markdown","value":"# ids-card\n\n## Description\n\nA card is an element that groups related information in a flexible container. See more [usage details](https://design.infor.com/components/components/card).\n\n## Terminology\n\n- **Card**: UI design pattern that groups related information that resembles a card\n- **Widget**: Card and widget are sometimes used interchangeably.\n- **Group Action**: A special toolbar inside the card content area that can be used to act on the content.\n\n## Themeable Parts\n\n- `card` allows you to further style the main card element\n- `header` allows you to further style the card header element\n- `content` allows you to further style the card content element\n- `footer` allows you to further style the card footer element\n\n## Features (With Code Examples)\n\nA card is created by using the custom `ids-card` element. A card has two content slots, one for the header area which usually contains title and a small number of action buttons. The card content area can contain whatever content you like. This content should be responsive.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n  </div>\n</ids-card>\n```\n\nA card can be an actionable with the behavior of a button.\n\n```html\n<ids-card actionable=\"true\">\n  <div slot=\"actionable-text\">\n    <ids-text font-size=\"16\" type=\"p\">Actionable Button Card</ids-text>\n  </div>\n</ids-card>\n```\n\nA card can be a draggable with custom drag-size and drag-styling.\n\n```html\n<ids-card draggable drop-target=\"droppable-panel\" width=\"100%\" fixed=\"true\" drag-width=\"200px\" drag-height=\"400px\" drop-width=\"200px\" drop-height=\"400px\">\n    <img src=\"datagrid-icon.png\">\n    <ids-text slot=\"card-header\" font-size=\"16\">Form</ids-text>\n</ids-card>\n```\n\nA card can be a draggable that can be stacked.\n\n```html\n<ids-card draggable stacked=\"true\" fixed=\"true\" drag-width=\"200px\" drag-height=\"400px\" drop-width=\"200px\" drop-height=\"400px\" width=\"100%\">\n    <img src=\"datagrid-icon.png\">\n    <ids-text slot=\"card-header\" font-size=\"16\">Form</ids-text>\n</ids-card>\n```\n\nA card with footer element.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n  </div>\n  <div slot=\"card-footer\">\n  </div>\n</ids-card>\n```\n\nA card with footer element and vertical no-padding.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n  </div>\n  <div slot=\"card-footer\" no-padding>\n  </div>\n</ids-card>\n```\n## Class Hierarchy\n\n- IdsCard\n  - IdsBox\n    - IdsElement\n- Mixins\n  IdsHideFocusMixin\n  IdsEventsMixin\n  IdsSelectionMixin\n\n## Settings and Attributes\n\n- `autoHeight` {boolean} Makes the card the same height as its inner content\n- `actionable` {boolean} It will make the card act as a button (can also act as a link)\n- `autoFit` {boolean} Makes the card the same dimensions as the parent element\n- `height` {number} It will make the card have a fixed height (used primarily on actionable cards)\n- `href` {number} Sets the href attribute for actionable cards that are hyperlinks\n- `noHeader` {boolean} Hides the header area\n- `backgroundColor` {string} Set the background-color of the card\n- `width` {number} Sets the default width of the card\n- `dragWidth` {number} Sets the width of the card when being dragged\n- `dragHeight` {number} Sets the height of the card when being dragged\n- `dragBgColor` {string} Set the background-color of the card while its being dragged\n- `dropped` {boolean} Whether the card has been dropped or not\n- `dropWidth` {number} Set the width that the card should be once it's dropped\n- `dropHeight` {number} Set the height that the card should be once it's dropped\n- `dropBgColor` {string} Set the background-color that the card should be once it's dropped\n- `fixed` {boolean} If true, the dragged card will remain in its original place while a shadow of the card will be dragged.\n- `stacked` {boolean} If true, the dragged card can be dropped (i.e. stacked) on top of another card.\n\nNOTE: See also `ids-box` settings as some of these will also work on cards.\n\n## States and Variations (With Code Examples)\n\n- Group Action\n- Sizes\n- Hover\n- Disabled\n- Focus\n- Pressed/Active/Selected\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the card has focusable elements, tab will toggle through them in the general form order. If the header contains a toolbar. Arrow keys should be used between buttons on the toolbars\n\n## Responsive Guidelines\n\n- Depending on the container in the responsive grid, the width of the card follows the layout of the grid. However, when using in a home page a special algorithm is used to both keep the tab order and fill in the gaps most efficiently depending on the card dimensions.\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nTitles should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Cards have all new markup and classes.\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-card></ids-card>` and has slots for the header and body content\n- Can now be imported as a single JS file and used with encapsulated styles.\n- The Card/Widget component has been changed to a web component and renamed to ids-card.\n- The expandable card feature is deprecated\n"}},{"name":"ids-card","attributes":[{"name":"#cloned-card","values":[]},{"name":"#position-id","values":[]},{"name":"dropped-positions","values":[]},{"name":"dropped-target-element","description":"Get the dropped target element","values":[]},{"name":"auto-fit","description":"Get the auto fit state","values":[]},{"name":"auto-height","description":"Get the auto height state","values":[]},{"name":"actionable","description":"Get the actionable state","values":[]},{"name":"disabled","description":"Get the disabled state","values":[]},{"name":"draggable","description":"Get the draggable state","values":[]},{"name":"dropped","description":"Get the dropped state","values":[]},{"name":"drop-target","description":"Get the drop target element ID","values":[]},{"name":"fixed","description":"Get the fixed state","values":[]},{"name":"stacked","description":"Get the stacked state","values":[]},{"name":"background-color","description":"Set the background color","values":[]},{"name":"width","description":"Set the width of the card","values":[]},{"name":"overflow","description":"Get the overflow setting","values":[]},{"name":"href","description":"Set href for actionable link card","values":[]},{"name":"target","description":"Set target for an actionable link card","values":[]},{"name":"no-header","description":"Set to true to hide the header space","values":[]}],"description":{"kind":"markdown","value":"# ids-card\n\n## Description\n\nA card is an element that groups related information in a flexible container. See more [usage details](https://design.infor.com/components/components/card).\n\n## Terminology\n\n- **Card**: UI design pattern that groups related information that resembles a card\n- **Widget**: Card and widget are sometimes used interchangeably.\n- **Group Action**: A special toolbar inside the card content area that can be used to act on the content.\n\n## Themeable Parts\n\n- `card` allows you to further style the main card element\n- `header` allows you to further style the card header element\n- `content` allows you to further style the card content element\n- `footer` allows you to further style the card footer element\n\n## Features (With Code Examples)\n\nA card is created by using the custom `ids-card` element. A card has two content slots, one for the header area which usually contains title and a small number of action buttons. The card content area can contain whatever content you like. This content should be responsive.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n  </div>\n</ids-card>\n```\n\nA card can be an actionable with the behavior of a button.\n\n```html\n<ids-card actionable=\"true\">\n  <div slot=\"actionable-text\">\n    <ids-text font-size=\"16\" type=\"p\">Actionable Button Card</ids-text>\n  </div>\n</ids-card>\n```\n\nA card can be a draggable with custom drag-size and drag-styling.\n\n```html\n<ids-card draggable drop-target=\"droppable-panel\" width=\"100%\" fixed=\"true\" drag-width=\"200px\" drag-height=\"400px\" drop-width=\"200px\" drop-height=\"400px\">\n    <img src=\"datagrid-icon.png\">\n    <ids-text slot=\"card-header\" font-size=\"16\">Form</ids-text>\n</ids-card>\n```\n\nA card can be a draggable that can be stacked.\n\n```html\n<ids-card draggable stacked=\"true\" fixed=\"true\" drag-width=\"200px\" drag-height=\"400px\" drop-width=\"200px\" drop-height=\"400px\" width=\"100%\">\n    <img src=\"datagrid-icon.png\">\n    <ids-text slot=\"card-header\" font-size=\"16\">Form</ids-text>\n</ids-card>\n```\n\nA card with footer element.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n  </div>\n  <div slot=\"card-footer\">\n  </div>\n</ids-card>\n```\n\nA card with footer element and vertical no-padding.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n  </div>\n  <div slot=\"card-footer\" no-padding>\n  </div>\n</ids-card>\n```\n## Class Hierarchy\n\n- IdsCard\n  - IdsBox\n    - IdsElement\n- Mixins\n  IdsHideFocusMixin\n  IdsEventsMixin\n  IdsSelectionMixin\n\n## Settings and Attributes\n\n- `autoHeight` {boolean} Makes the card the same height as its inner content\n- `actionable` {boolean} It will make the card act as a button (can also act as a link)\n- `autoFit` {boolean} Makes the card the same dimensions as the parent element\n- `height` {number} It will make the card have a fixed height (used primarily on actionable cards)\n- `href` {number} Sets the href attribute for actionable cards that are hyperlinks\n- `noHeader` {boolean} Hides the header area\n- `backgroundColor` {string} Set the background-color of the card\n- `width` {number} Sets the default width of the card\n- `dragWidth` {number} Sets the width of the card when being dragged\n- `dragHeight` {number} Sets the height of the card when being dragged\n- `dragBgColor` {string} Set the background-color of the card while its being dragged\n- `dropped` {boolean} Whether the card has been dropped or not\n- `dropWidth` {number} Set the width that the card should be once it's dropped\n- `dropHeight` {number} Set the height that the card should be once it's dropped\n- `dropBgColor` {string} Set the background-color that the card should be once it's dropped\n- `fixed` {boolean} If true, the dragged card will remain in its original place while a shadow of the card will be dragged.\n- `stacked` {boolean} If true, the dragged card can be dropped (i.e. stacked) on top of another card.\n\nNOTE: See also `ids-box` settings as some of these will also work on cards.\n\n## States and Variations (With Code Examples)\n\n- Group Action\n- Sizes\n- Hover\n- Disabled\n- Focus\n- Pressed/Active/Selected\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the card has focusable elements, tab will toggle through them in the general form order. If the header contains a toolbar. Arrow keys should be used between buttons on the toolbars\n\n## Responsive Guidelines\n\n- Depending on the container in the responsive grid, the width of the card follows the layout of the grid. However, when using in a home page a special algorithm is used to both keep the tab order and fill in the gaps most efficiently depending on the card dimensions.\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nTitles should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Cards have all new markup and classes.\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-card></ids-card>` and has slots for the header and body content\n- Can now be imported as a single JS file and used with encapsulated styles.\n- The Card/Widget component has been changed to a web component and renamed to ids-card.\n- The expandable card feature is deprecated\n"}},{"name":"ids-checkbox-group","attributes":[{"name":"label","description":"Set the label of checkbox-group","values":[]},{"name":"checkboxes","description":"Get child ids-checkbox inputs in this group","values":[]},{"name":"selected-checkboxes","description":"Get the selected ids-checkbox inputs in this group","values":[]},{"name":"checked","description":"Set the checked state of checkboxes in the group","values":[]}],"description":{"kind":"markdown","value":"# ids-checkbox\n\n## Description\n\nThe ids-checkbox is a wrapper around a standard `HTMLInputElement` that provides additional API for setting checkbox states, labels, and functionality. Checkboxes can also be grouped together with a label. See more [usage details](https://design.infor.com/components/components/checkbox).\n\n## Terminology\n\n- **Checkbox**: A standard checkbox element that can be set to checked, unchecked, indeterminate, or disabled. It adds `aria-required` for required elements.\n- **Label**: An `HTMLLabelElement` associated with the checkbox input. Make sure the label has a meaningful relative. It will add pseudo UI `*` for required elements.\n\n## Themeable Parts\n\n- `label` allows further styling of the label element\n- `input` allows further styling of the checkbox input element\n- `label-text` allows further styling of the text element in the label\n\n## Features (With Code Samples)\n\nA standard `unchecked` checkbox:\n\n```html\n<ids-checkbox label=\"Unchecked\"></ids-checkbox>\n```\n\nSets the checkbox as `checked`:\n\n```html\n<ids-checkbox label=\"Checked\" checked=\"true\"></ids-checkbox>\n```\n\nSet the hitbox to the checkbox:\n\n```html\n<ids-checkbox label=\"Checkbox with Hitbox\" hitbox=\"true\"></ids-checkbox>\n```\n\n### Disabled Checkboxes\n\nAdd a disabled checkbox as unchecked:\n\n```html\n<ids-checkbox label=\"Disabled and unchecked\" disabled=\"true\"></ids-checkbox>\n```\n\nAdd a disabled checkbox as checked:\n\n```html\n<ids-checkbox label=\"Disabled and checked\" checked=\"true\" disabled=\"true\"></ids-checkbox>\n```\n\nSet validation `required` to the checkbox:\n\n```html\n<ids-checkbox label=\"Required\" validate=\"required\"></ids-checkbox>\n```\n\nSet validation `required` to the checkbox without label required indicator:\n\n```html\n<ids-checkbox label=\"Required (No indicator)\" label-required=\"false\" validate=\"required\"></ids-checkbox>\n```\n\nCustomize the checkbox color:\n\n```html\n<ids-checkbox checked=\"true\" color=\"green\" label=\"Green\"></ids-checkbox>\n<ids-checkbox checked=\"true\" color=\"caution\" label=\"Caution\"></ids-checkbox>\n```\n\nSet an indeterminate state. The `indeterminate` attribute will be removed each time the checkbox `change` its state `checked/unchecked`, so it must be added every time it need to set.\n\n```html\n<ids-checkbox label=\"Indeterminate\" indeterminate=\"true\"></ids-checkbox>\n```\n\nHide the checkbox label:\n\n```html\n<ids-checkbox label=\"UnChecked\" label-state=\"hidden\"></ids-checkbox>\n```\n\nSet the label text alignment:\n\n```html\n<ids-checkbox label=\"Left aligned label\" label-align=\"start\"></ids-checkbox>\n<ids-checkbox label=\"Center aligned label\" label-align=\"center\"></ids-checkbox>\n<ids-checkbox label=\"Right aligned label\" label-align=\"end\"></ids-checkbox>\n```\n\nSet the label position with inline positioning:\n\n```html\n<ids-checkbox label=\"Terms and Conditions\" label-position=\"inline-start\" label-width=\"300px\"></ids-checkbox>\n```\n\nControl label breaking behavior with inline positioning:\n\n```html\n<!-- Default: label and checkbox stay on same line -->\n<ids-checkbox label=\"I agree to the terms\" label-position=\"inline-start\" label-width=\"300px\"></ids-checkbox>\n\n<!-- Same as above (shrink-value is default) -->\n<ids-checkbox label=\"Subscribe to newsletter\" label-position=\"inline-start\" label-width=\"300px\" label-break=\"shrink-value\"></ids-checkbox>\n\n<!-- Label text stacks above checkbox indicator -->\n<ids-checkbox label=\"Receive marketing emails\" label-position=\"inline-start\" label-width=\"300px\" label-break=\"break\"></ids-checkbox>\n```\n\nAlign the label text to the end of its fixed-width area with inline positioning:\n\n```html\n<ids-checkbox label=\"I agree to the terms and conditions\" label-position=\"inline-start\" label-width=\"300px\" label-alignment=\"end\"></ids-checkbox>\n<ids-checkbox label=\"Subscribe to newsletter\" label-position=\"inline-start\" label-width=\"300px\" label-alignment=\"end\" checked=\"true\"></ids-checkbox>\n```\n\n### Label Wrapping\n\nControl how long labels are handled with the `label-wrap` attribute:\n\n```html\n<ids-checkbox label=\"This is a very long label that demonstrates label wrapping behavior\"></ids-checkbox>\n<ids-checkbox label-wrap=\"ellipsis\" label=\"This is a very long label that demonstrates label wrapping behavior\"></ids-checkbox>\n<ids-checkbox label-wrap=\"wrap-no-stretch\" label=\"This is a very long label that demonstrates label wrapping behavior\"></ids-checkbox>\n<ids-checkbox label-wrap=\"ellipsis-no-stretch\" label=\"This is a very long label that demonstrates label wrapping behavior\"></ids-checkbox>\n```\n\n## Checkbox Groups\n\nThe Checkbox Group consists of a set of checkboxes with labels. It groups a set of options with a summarizing `<legend>`. Has a `label` property and `ids-checkbox` elements for slots.\n\n```html\n<ids-checkbox-group label=\"Checkbox Group\">\n  <ids-checkbox label=\"Option 1\" checked=\"false\"></ids-checkbox>\n  <ids-checkbox label=\"Option 2\" checked=\"true\"></ids-checkbox>\n  <ids-checkbox label=\"Option 3\" checked=\"true\"></ids-checkbox>\n</ids-checkbox-group>\n```\n\n- `label` {string} Sets the label for the checkbox group\n\n## Checkbox Settings\n\n- `checked` {boolean} Sets the checked state.\n- `color` {string} Sets the checkbox color.\n- `disabled` {boolean} Sets the disabled state.\n- `hidden` {boolean} Hides the checkbox visually while keeping it in the DOM for accessibility. Useful when the checkbox needs to be present for screen readers but not visible to sighted users.\n- `horizontal` {boolean} Sets the checkbox layout inline as horizontal.\n- `horizontal-aligned` {boolean} Should be set when checkboxes with `label-position=\"inline-start\"` are lined up horizontally. This ensures correct responsive behavior so all checkboxes flip their layout together based on viewport size.\n- `indeterminate` {boolean} Sets the checkbox to neither checked nor unchecked.\n- `label` {string} Sets the label text.\n- `label-align` {string} Controls the horizontal text alignment of the label text. Options are:\n  - `start`: Aligns label text to the start (left in LTR, right in RTL)\n  - `end`: Aligns label text to the end (right in LTR, left in RTL)\n  - `center`: Centers the label text\n  - `justify`: Justifies the label text\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `label-alignment` {string} Controls the horizontal text alignment of the label within its fixed-width area when using inline positioning. Options are:\n  - `start` (default): Label text aligns to the start of the label area\n  - `end`: Label text aligns to the end of the label area (right in LTR, left in RTL)\n- `label-break` {string} Controls how the label behaves when used with `label-position=\"inline-start\"`. Options are:\n  - `shrink-value` (default): Label and checkbox stay on the same line, label does not shrink\n  - `break`: Label text appears above the checkbox indicator, stacked vertically\n- `label-position` {string} Controls the position of the label relative to the checkbox. Options are:\n  - `inline-end` (default): Label appears at the end of the checkbox (right in LTR, left in RTL)\n  - `inline-start`: Label appears at the start of the checkbox (left in LTR, right in RTL)\n  - Note: Checkboxes do not support `top` positioning\n- `label-required` {boolean} Sets validation `required` indicator. Defaults to `true`.\n- `label-state` {string} Sets the checkbox label state: can be `hidden` or omitted.\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-wrap` {string} Controls how long labels are handled. Options are:\n  - `wrap` (default): Label text wraps to multiple lines when needed\n  - `ellipsis`: Label text is truncated with ellipsis when it overflows\n  - `wrap-no-stretch`: Label wraps but doesn't stretch beyond container width\n  - `ellipsis-no-stretch`: Label is truncated with ellipsis and doesn't stretch beyond container width\n- `noAnimation` {boolean} Disables the checkbox animation.\n- `skip-sanitize` {boolean} Disables HTML sanitization for the label text, allowing raw HTML content to be rendered. **Warning**: Only use with trusted content to prevent XSS attacks. When enabled, HTML tags in the label will be rendered as actual HTML elements instead of escaped text.\n- `validate` {string} Sets the validation rule `required`.\n- `validation-events` {string} Sets the validation events. Use `space` to add multiple. Defaults to `change`.\n- `value` {string} Sets the `<form>` `submit` value (not to be confused with `checked`, it only sets the form value).\n\n## Events\n\n- `change`: The change event is fired when a checkbox element's value is committed by the user. Unlike the input event, the change event is not necessarily fired for each alteration to an element's value.\n- `input`: The input event fires when the value of a checkbox element has been changed.\n\n## States\n\n- disabled\n- dirty (not supported on this component)\n- validation/error\n- focused\n- active\n- unchecked/checked/indeterminate\n\n## Responsive Guidelines\n\n- Default display set as `block`, but can change to `inline-block` by setting `horizontal` attribute to `true`.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Wrap the input in an element with the class field\n- Change class `inforCheckbox` to checkbox\n- Change class `inforCheckboxLabel` to checkbox-label\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-checkbox></ids-checkbox>`\n- Can now be imported as a single JS file and used with encapsulated styles.\n- If using events, events are now plain JS events (change/input ect)\n- Can now use the hitbox styles by adding the setting to the ids-checkbox component\n\nThe IDS Checkbox component is now a Web Component. Instead of using classes to define, it is done directly:\n\n```html\n<!-- 4.x checkbox example -->\n<div class=\"field\">\n  <input type=\"checkbox\" class=\"checkbox\" name=\"checkbox1\" id=\"checkbox1\"/>\n  <label for=\"checkbox1\" class=\"checkbox-label\">Unchecked</label>\n</div>\n\n<!-- this is the same checkbox using the web component version -->\n<ids-checkbox label=\"Unchecked\"></ids-checkbox>\n```\n"}},{"name":"ids-checkbox","attributes":[{"name":"label-audible","values":[]},{"name":"is-form-component","values":[]},{"name":"#triggered-change","description":"Internal change event detection trigger.","values":[]},{"name":"input","description":"Get the inner input element","values":[]},{"name":"label-el","description":"Get the inner label element","values":[]},{"name":"label-position","description":"Get the position of the label","values":[]},{"name":"checked","description":"Get the checked state","values":[]},{"name":"color","description":"Get the checkbox color","values":[]},{"name":"disabled","description":"Get the disabled state","values":[]},{"name":"horizontal","description":"Get the horizontal orientation state","values":[]},{"name":"indeterminate","description":"Get the indeterminate state","values":[]},{"name":"value","description":"Get the checkbox value attribute","values":[]},{"name":"no-animation","description":"Get the no animation state","values":[]},{"name":"label-wrap","description":"Get the label wrap setting","values":[]},{"name":"label-align","description":"Get the label text alignment","values":[]},{"name":"label-text-el","description":"Get the inner label text element","values":[]},{"name":"tooltip","description":"Get the tooltip value (defaults to 'true' for ellipsis detection)","values":[]}],"description":{"kind":"markdown","value":"# ids-checkbox\n\n## Description\n\nThe ids-checkbox is a wrapper around a standard `HTMLInputElement` that provides additional API for setting checkbox states, labels, and functionality. Checkboxes can also be grouped together with a label. See more [usage details](https://design.infor.com/components/components/checkbox).\n\n## Terminology\n\n- **Checkbox**: A standard checkbox element that can be set to checked, unchecked, indeterminate, or disabled. It adds `aria-required` for required elements.\n- **Label**: An `HTMLLabelElement` associated with the checkbox input. Make sure the label has a meaningful relative. It will add pseudo UI `*` for required elements.\n\n## Themeable Parts\n\n- `label` allows further styling of the label element\n- `input` allows further styling of the checkbox input element\n- `label-text` allows further styling of the text element in the label\n\n## Features (With Code Samples)\n\nA standard `unchecked` checkbox:\n\n```html\n<ids-checkbox label=\"Unchecked\"></ids-checkbox>\n```\n\nSets the checkbox as `checked`:\n\n```html\n<ids-checkbox label=\"Checked\" checked=\"true\"></ids-checkbox>\n```\n\nSet the hitbox to the checkbox:\n\n```html\n<ids-checkbox label=\"Checkbox with Hitbox\" hitbox=\"true\"></ids-checkbox>\n```\n\n### Disabled Checkboxes\n\nAdd a disabled checkbox as unchecked:\n\n```html\n<ids-checkbox label=\"Disabled and unchecked\" disabled=\"true\"></ids-checkbox>\n```\n\nAdd a disabled checkbox as checked:\n\n```html\n<ids-checkbox label=\"Disabled and checked\" checked=\"true\" disabled=\"true\"></ids-checkbox>\n```\n\nSet validation `required` to the checkbox:\n\n```html\n<ids-checkbox label=\"Required\" validate=\"required\"></ids-checkbox>\n```\n\nSet validation `required` to the checkbox without label required indicator:\n\n```html\n<ids-checkbox label=\"Required (No indicator)\" label-required=\"false\" validate=\"required\"></ids-checkbox>\n```\n\nCustomize the checkbox color:\n\n```html\n<ids-checkbox checked=\"true\" color=\"green\" label=\"Green\"></ids-checkbox>\n<ids-checkbox checked=\"true\" color=\"caution\" label=\"Caution\"></ids-checkbox>\n```\n\nSet an indeterminate state. The `indeterminate` attribute will be removed each time the checkbox `change` its state `checked/unchecked`, so it must be added every time it need to set.\n\n```html\n<ids-checkbox label=\"Indeterminate\" indeterminate=\"true\"></ids-checkbox>\n```\n\nHide the checkbox label:\n\n```html\n<ids-checkbox label=\"UnChecked\" label-state=\"hidden\"></ids-checkbox>\n```\n\nSet the label text alignment:\n\n```html\n<ids-checkbox label=\"Left aligned label\" label-align=\"start\"></ids-checkbox>\n<ids-checkbox label=\"Center aligned label\" label-align=\"center\"></ids-checkbox>\n<ids-checkbox label=\"Right aligned label\" label-align=\"end\"></ids-checkbox>\n```\n\nSet the label position with inline positioning:\n\n```html\n<ids-checkbox label=\"Terms and Conditions\" label-position=\"inline-start\" label-width=\"300px\"></ids-checkbox>\n```\n\nControl label breaking behavior with inline positioning:\n\n```html\n<!-- Default: label and checkbox stay on same line -->\n<ids-checkbox label=\"I agree to the terms\" label-position=\"inline-start\" label-width=\"300px\"></ids-checkbox>\n\n<!-- Same as above (shrink-value is default) -->\n<ids-checkbox label=\"Subscribe to newsletter\" label-position=\"inline-start\" label-width=\"300px\" label-break=\"shrink-value\"></ids-checkbox>\n\n<!-- Label text stacks above checkbox indicator -->\n<ids-checkbox label=\"Receive marketing emails\" label-position=\"inline-start\" label-width=\"300px\" label-break=\"break\"></ids-checkbox>\n```\n\nAlign the label text to the end of its fixed-width area with inline positioning:\n\n```html\n<ids-checkbox label=\"I agree to the terms and conditions\" label-position=\"inline-start\" label-width=\"300px\" label-alignment=\"end\"></ids-checkbox>\n<ids-checkbox label=\"Subscribe to newsletter\" label-position=\"inline-start\" label-width=\"300px\" label-alignment=\"end\" checked=\"true\"></ids-checkbox>\n```\n\n### Label Wrapping\n\nControl how long labels are handled with the `label-wrap` attribute:\n\n```html\n<ids-checkbox label=\"This is a very long label that demonstrates label wrapping behavior\"></ids-checkbox>\n<ids-checkbox label-wrap=\"ellipsis\" label=\"This is a very long label that demonstrates label wrapping behavior\"></ids-checkbox>\n<ids-checkbox label-wrap=\"wrap-no-stretch\" label=\"This is a very long label that demonstrates label wrapping behavior\"></ids-checkbox>\n<ids-checkbox label-wrap=\"ellipsis-no-stretch\" label=\"This is a very long label that demonstrates label wrapping behavior\"></ids-checkbox>\n```\n\n## Checkbox Groups\n\nThe Checkbox Group consists of a set of checkboxes with labels. It groups a set of options with a summarizing `<legend>`. Has a `label` property and `ids-checkbox` elements for slots.\n\n```html\n<ids-checkbox-group label=\"Checkbox Group\">\n  <ids-checkbox label=\"Option 1\" checked=\"false\"></ids-checkbox>\n  <ids-checkbox label=\"Option 2\" checked=\"true\"></ids-checkbox>\n  <ids-checkbox label=\"Option 3\" checked=\"true\"></ids-checkbox>\n</ids-checkbox-group>\n```\n\n- `label` {string} Sets the label for the checkbox group\n\n## Checkbox Settings\n\n- `checked` {boolean} Sets the checked state.\n- `color` {string} Sets the checkbox color.\n- `disabled` {boolean} Sets the disabled state.\n- `hidden` {boolean} Hides the checkbox visually while keeping it in the DOM for accessibility. Useful when the checkbox needs to be present for screen readers but not visible to sighted users.\n- `horizontal` {boolean} Sets the checkbox layout inline as horizontal.\n- `horizontal-aligned` {boolean} Should be set when checkboxes with `label-position=\"inline-start\"` are lined up horizontally. This ensures correct responsive behavior so all checkboxes flip their layout together based on viewport size.\n- `indeterminate` {boolean} Sets the checkbox to neither checked nor unchecked.\n- `label` {string} Sets the label text.\n- `label-align` {string} Controls the horizontal text alignment of the label text. Options are:\n  - `start`: Aligns label text to the start (left in LTR, right in RTL)\n  - `end`: Aligns label text to the end (right in LTR, left in RTL)\n  - `center`: Centers the label text\n  - `justify`: Justifies the label text\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `label-alignment` {string} Controls the horizontal text alignment of the label within its fixed-width area when using inline positioning. Options are:\n  - `start` (default): Label text aligns to the start of the label area\n  - `end`: Label text aligns to the end of the label area (right in LTR, left in RTL)\n- `label-break` {string} Controls how the label behaves when used with `label-position=\"inline-start\"`. Options are:\n  - `shrink-value` (default): Label and checkbox stay on the same line, label does not shrink\n  - `break`: Label text appears above the checkbox indicator, stacked vertically\n- `label-position` {string} Controls the position of the label relative to the checkbox. Options are:\n  - `inline-end` (default): Label appears at the end of the checkbox (right in LTR, left in RTL)\n  - `inline-start`: Label appears at the start of the checkbox (left in LTR, right in RTL)\n  - Note: Checkboxes do not support `top` positioning\n- `label-required` {boolean} Sets validation `required` indicator. Defaults to `true`.\n- `label-state` {string} Sets the checkbox label state: can be `hidden` or omitted.\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-wrap` {string} Controls how long labels are handled. Options are:\n  - `wrap` (default): Label text wraps to multiple lines when needed\n  - `ellipsis`: Label text is truncated with ellipsis when it overflows\n  - `wrap-no-stretch`: Label wraps but doesn't stretch beyond container width\n  - `ellipsis-no-stretch`: Label is truncated with ellipsis and doesn't stretch beyond container width\n- `noAnimation` {boolean} Disables the checkbox animation.\n- `skip-sanitize` {boolean} Disables HTML sanitization for the label text, allowing raw HTML content to be rendered. **Warning**: Only use with trusted content to prevent XSS attacks. When enabled, HTML tags in the label will be rendered as actual HTML elements instead of escaped text.\n- `validate` {string} Sets the validation rule `required`.\n- `validation-events` {string} Sets the validation events. Use `space` to add multiple. Defaults to `change`.\n- `value` {string} Sets the `<form>` `submit` value (not to be confused with `checked`, it only sets the form value).\n\n## Events\n\n- `change`: The change event is fired when a checkbox element's value is committed by the user. Unlike the input event, the change event is not necessarily fired for each alteration to an element's value.\n- `input`: The input event fires when the value of a checkbox element has been changed.\n\n## States\n\n- disabled\n- dirty (not supported on this component)\n- validation/error\n- focused\n- active\n- unchecked/checked/indeterminate\n\n## Responsive Guidelines\n\n- Default display set as `block`, but can change to `inline-block` by setting `horizontal` attribute to `true`.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Wrap the input in an element with the class field\n- Change class `inforCheckbox` to checkbox\n- Change class `inforCheckboxLabel` to checkbox-label\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-checkbox></ids-checkbox>`\n- Can now be imported as a single JS file and used with encapsulated styles.\n- If using events, events are now plain JS events (change/input ect)\n- Can now use the hitbox styles by adding the setting to the ids-checkbox component\n\nThe IDS Checkbox component is now a Web Component. Instead of using classes to define, it is done directly:\n\n```html\n<!-- 4.x checkbox example -->\n<div class=\"field\">\n  <input type=\"checkbox\" class=\"checkbox\" name=\"checkbox1\" id=\"checkbox1\"/>\n  <label for=\"checkbox1\" class=\"checkbox-label\">Unchecked</label>\n</div>\n\n<!-- this is the same checkbox using the web component version -->\n<ids-checkbox label=\"Unchecked\"></ids-checkbox>\n```\n"}},{"name":"ids-color","attributes":[{"name":"swatch","values":[]},{"name":"icon","values":[]},{"name":"popup","values":[]},{"name":"suppress-tooltip","description":"Gets the suppress-tooltip attribute","values":[]},{"name":"disabled","description":"Gets the disabled attribute","values":[]},{"name":"hex","values":[]},{"name":"label","values":[]},{"name":"show-label","values":[]},{"name":"tooltip","values":[]},{"name":"size","values":[]},{"name":"clickable","values":[]},{"name":"color","values":[]}],"description":{"kind":"markdown","value":"# ids-color\n\n## Description\n\nids-color consists of custom element `<ids-color>`. Once initialized, it functions to display a color setting using a `hex` attribute.\n\n## Settings and Attributes\n\n- `hex` {string} Sets the color hex attribute. Value should be a hex code or IDS color variable name.\n- `size` {string} The size of the color swatch: `xs`, `sm`, `mm`, `md`, `lg`, or `full`\n- `color` {string} Sets the background color to a CSS variable.\n- `clickable` {boolean} Set to `true` to add the checkbox from ids-color-picker.\n- `label` {string} Displays a label under the color swatch.\n\n## Code Examples\n\nA basic use of the color picker with a hex color option.\n\n```html\n<ids-color hex=\"#b94e4e\"></ids-color>\n```\n\nA basic use case of the color picker to show a color palette item in larger size.\n\n```html\n<ids-color size=\"full\" color=\"--ids-color-red-10\" clickable=\"false\" label=\"--ids-color-red-10\"></ids-color>\n```"}},{"name":"ids-color-picker","attributes":[{"name":"is-form-component","values":[]},{"name":"use-default-swatches","values":[]},{"name":"initialized","values":[]},{"name":"default-swatches-cache","values":[]},{"name":"input","description":"Get the text input element","values":[]},{"name":"color-input","description":"Get the color input element for advanced mode","values":[]},{"name":"color-preview","description":"Get the color preview element","values":[]},{"name":"trigger-btn","description":"Get the trigger button element","values":[]},{"name":"color-preview-html","description":"HTML for Color Picker Previw Swatch","values":[]},{"name":"popup","description":"Get the popup element","values":[]},{"name":"color-picker-advanced-html","description":"HTML for Advanced Color Picker Popup","values":[]},{"name":"swatches","description":"Available color swatches within this color-picker","values":[]},{"name":"default-swatches","description":"Default color swatches for this color-picker if no children provided","values":[]},{"name":"value","description":"Gets the value attribute","values":[]},{"name":"placeholder","description":"Get the placeholder text","values":[]},{"name":"size","description":"Get the size of the color picker","values":[]},{"name":"validate","description":"Get the validation rules","values":[]},{"name":"suppress-validation","description":"Get the suppress validation state","values":[]},{"name":"suppress-error-message","description":"Gets whether validation is suppressed on the inner input element.","values":[]},{"name":"tabbable","description":"Get the tabbable state","values":[]},{"name":"tooltip","description":"Get the tooltip text","values":[]},{"name":"advanced","description":"Gets the advanced attribute","values":[]},{"name":"disabled","description":"Gets the disabled attribute","values":[]},{"name":"readonly","description":"Gets the readonly attribute","values":[]},{"name":"suppress-labels","description":"Gets the labels attribute","values":[]},{"name":"suppress-tooltips","description":"Get the suppress tooltips state","values":[]},{"name":"compact","description":"Get the compact mode state","values":[]},{"name":"id","description":"Get the id value","values":[]},{"name":"#handle-popup-key-navigation","description":"Handle keyboard navigation within the popup","values":[]}],"description":{"kind":"markdown","value":"# ids-color-picker\n\n## Description\n\nThe color picker consists of a custom element `<ids-color-picker>`. Once initialized, it functions similarly to a dropdown except that the list shows a color palette in the popup. After selecting a color, the hex code and swatch will display the new value.\n\n## Behavior Guidelines\n\nThe color picker contains colors from the core IDS palette. You can add custom colors by nesting an `<ids-color>` custom element inside `<ids-color-picker>`.\n\n## Settings and Attributes\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `value` {string} Sets the selected color. Example: `value=\"#b94e4e\"`\n- `label` {string} Sets the label which displays above the color picker. Example: `label=\"Color Picker\"`\n- `clearable` {boolean} If `true`, adds the empty color swatch to the list of colors. Example: `clearable=\"true\"`\n- `disabled` {boolean} If `true`, sets the entire color picker as disabled. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa. Example: `disabled=\"true\"`\n- `readonly` {boolean} If `true`, sets the color picker as readonly. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `suppress-labels` {boolean} If `true`, the color swatches display hex values instead of labels.\n- `suppress-tooltips` {boolean} If `true`, the color swatches do not display tooltips on hover.\n- `validate` {string} Set the validation rule, e.g., `required`.\n- `advanced` {boolean} If `true`, the component will provide a browser's visual color picker interface and the input will be masked, allowing only `#rrggbb` hexadecimal format.\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `row-start` {boolean} This can be added to the ids-color items in the slot for custom colors to make them start on a new row.\n\n## Code Examples\n\nA basic use case of the color picker:\n\n```html\n<ids-color-picker></ids-color-picker>\n```\n\nA color picker with labels and tooltips disabled:\n\n```html\n<ids-color-picker suppress-labels suppress-tooltips></ids-color-picker>\n```\n\nA color picker with custom colors. Use `row-start` to indicate the color should start a new row. You can add labels and tooltips as well. Also note that you can have special items for transparent, inherit, clear/no-color and inherit.\n\n```html\n<ids-color-picker label=\"Custom Colors\" value=\"#EF9A9A\">\n  <ids-color hex=\"#FFEBEE\" label=\"#FFEBEE\" tooltip=\"#FFEBEE\"></ids-color>\n  <ids-color hex=\"#FFCDD2\" label=\"#FFCDD2\" tooltip=\"#FFCDD2\"></ids-color>\n  <ids-color hex=\"#EF9A9A\" label=\"#EF9A9A\" tooltip=\"#EF9A9A\"></ids-color>\n  <ids-color hex=\"#E57373\" label=\"#E57373\" tooltip=\"#E57373\"></ids-color>\n  <ids-color hex=\"#EF5350\" label=\"#EF5350\" tooltip=\"#EF5350\"></ids-color>\n\n  <ids-color hex=\"#E8F5E9\" row-start label=\"#E8F5E9\" tooltip=\"#E8F5E9\"></ids-color>\n  <ids-color hex=\"#C8E6C9\" label=\"#C8E6C9\" tooltip=\"#C8E6C9\"></ids-color>\n  <ids-color hex=\"#A5D6A7\" label=\"#A5D6A7\" tooltip=\"#A5D6A7\"></ids-color>\n  <ids-color hex=\"#81C784\" label=\"#81C784\" tooltip=\"#81C784\"></ids-color>\n  <ids-color hex=\"#66BB6A\" label=\"#66BB6A\" tooltip=\"#66BB6A\"></ids-color>\n\n  <ids-color hex=\"#E3F2FD\" row-start label=\"#E3F2FD\" tooltip=\"#E3F2FD\"></ids-color>\n  <ids-color hex=\"#BBDEFB\" label=\"#BBDEFB\" tooltip=\"#BBDEFB\"></ids-color>\n  <ids-color hex=\"#90CAF9\" label=\"#90CAF9\" tooltip=\"#90CAF9\"></ids-color>\n  <ids-color hex=\"#64B5F6\" label=\"#64B5F6\" tooltip=\"#64B5F6\"></ids-color>\n  <ids-color hex=\"#42A5F5\" label=\"#42A5F5\" tooltip=\"#42A5F5\"></ids-color>\n\n  <ids-color hex=\"transparent\" label=\"transparent\" tooltip=\"transparent\" row-start></ids-color>\n  <ids-color hex=\"inherit\" label=\"inherit\" tooltip=\"inherit\"></ids-color>\n  <ids-color hex=\"\" label=\"No color\" tooltip=\"none\"></ids-color>\n  <ids-color hex=\"initial\" label=\"initial\" tooltip=\"initial\"></ids-color>\n</ids-color-picker>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Adjust the markup to use fields, inputs, and labels:\n```html\n<div class=\"field\">\n  <label for=\"background-color\">Background Color</label>\n  <input class=\"colorpicker\" value=\"#ffa800\" id=\"background-color\" type=\"text\" />\n</div>\n```\n\n**3.x to 5.x**\n\n- Markup has changed to a custom element `ids-color-picker`\n- Can now be imported as a single JS file and used with encapsulated styles\n- Events are now plain JS events (change/input etc.)\n- The IDS Color Picker component is now a WebComponent. Custom colors are added as slot items:\n\n```html\n<ids-color-picker id=\"color-picker-1\" disabled=\"false\" label=\"Ids Color Picker\">\n  <ids-color hex=\"#1A1A1A\"></ids-color>\n  <ids-color hex=\"#292929\"></ids-color>\n  <ids-color hex=\"#383838\"></ids-color>\n  <ids-color hex=\"#454545\"></ids-color>\n  <ids-color hex=\"#5C5C5C\" row-start></ids-color>\n  <ids-color hex=\"#737373\"></ids-color>\n  <ids-color hex=\"#999999\"></ids-color>\n  <ids-color hex=\"#BDBDBD\"></ids-color>\n</ids-color-picker>\n```\n\n## Keyboard Guidelines\n\n- <kbd>Tab / Shift+Tab</kbd>: Navigate color swatches\n- <kbd>ArrowDown / ArrowLeft / ArrowRight / ArrowUp</kbd>: Navigate color swatches\n- <kbd>Enter / Space</kbd>: Select currently focused color swatch\n"}},{"name":"ids-container","attributes":[{"name":"#resize-observer","description":"ResizeObserver instance for tracking container size changes","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"padding","description":"If set to number the container will have padding added (in pixels)","values":[]},{"name":"event-debounce","values":[]},{"name":"scrollable","description":"If set to true the container is scrollable","values":[]},{"name":"reset","description":"If set to true body element will get a \"css reset\"","values":[]},{"name":"background-color","description":"Pass in a css variable name to set the background color","values":[]}],"description":{"kind":"markdown","value":"# ids-container \n\n## Description\n\nA root container component that's used for theming the page and resetting the browser styles. The ids-container is also the parent element for the locale and language, all components that are in it will use this locale/language.\n\n## Use Cases\n\n- When you need to use components that will not overflow the page boundary\n- When you need a root container for IDS components\n- When you need to style the page background\n- When you need a locale and language\n\n## Terminology\n\n- **Page Container**: The older term for ids-container\n\n## Features (With Code Examples)\n\nA normal container used as a web component.\n\n```html\n<ids-container scrollable=\"true\">\n  <!-- ids components -->\n</ids-container>\n```\n\nA normal container with a set padding.\n```html\n<ids-container scrollable=\"true\" padding=\"8\">\n  <!-- ids components -->\n</ids-container>\n```\n\n## Settings and Attributes\n\n- `scrollable` {boolean} If `true`, turns on the overflow to allow for scroll.\n- `padding` {number} Sets the padding (in px) around the container. Defaults to 0 / none.\n- `color-variant` {string} Can be set to \"alternate\" to display contrasting color for text or icons via the [IdsColorVariantMixin](../../src/mixins/ids-color-variant-mixin/README.md).\n- `background-color` {boolean} Set as `true` to display a background color (different based on theme).\n- `event-debounce` {boolean} If `true`, debounces scroll and resize events to improve performance. Useful for high-frequency event scenarios. The `scroll` and `resize` events will be affected by this attribute.\n\n## Events\n\n- `scroll` Fires when the container is scrolled. Event detail contains the original scroll `event` object.\n- `resize` Fires when the container is resized. Event detail contains `width`, `height`, and `event` object.\n\n```javascript\nconst container = document.querySelector('ids-container');\n\ncontainer.addEventListener('scroll', (e) => {\n  console.log('Scrolled:', e.detail);\n});\n\ncontainer.addEventListener('resize', (e) => {\n  console.log('Resized:', e.detail.width, e.detail.height);\n});\n```\n\n## States and Variations (With Code Examples)\n\n- Color\n- Scrollable\n- Padding\n\n## Keyboard Guidelines\n\n- <kbd>Down Arrow/Up Arrow</kbd>: Scrolls the container\n\n## Responsive Guidelines\n\n- This component will be 100% width and height in the page / parent\n\n## Converting from Previous Versions\n\n- 3.x: Did not exist\n- 4.x: Replaces a div with the page-container class\n"}},{"name":"ids-counts","attributes":[{"name":"color","description":"Set the color of the counts","values":[]},{"name":"compact","description":"Set the compact attribute","values":[]},{"name":"href","description":"Set the href attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-counts\n\n## Description\n\nCounts are distinctive elements used to highlight high level numbers or metrics.\n\n## Use Cases\n\n- Use counts in dashboards and visualizations for summarizing key numeric takeaways.\n- Use counts as a concise numeric data point that can link to underlying detail elsewhere on the page or site.\n\n## Terminology\n\n- **Counts**: UI embellishments for summarizing high level numeric information.\n- **Value**: The numeric value displayed on the count component.\n- **Text**: The name or brief description of the value.\n- **Compact**: When compact, the count value appears slightly smaller than usual.\n\n## Features (With Code Examples)\n\nA card is created using the custom `ids-counts` element. A user can place elements inside of the component to represent text. It is recommended to use ids-text components as ids-counts has functionality to manage that input specifically.\n\nA normal Counts component\n\n```html\n<ids-counts href=\"#\">\n  <ids-text count-value>7</ids-text>\n  <ids-text count-text>Active <br /> Opportunities</ids-text>\n</ids-counts>\n```\n\nThe same component could be made \"Not Actionable\" by removing the href attribute\n\n```html\n<ids-counts>\n  <ids-text count-value>7</ids-text>\n  <ids-text count-text>Active <br /> Opportunities</ids-text>\n</ids-counts>\n```\n\nSetting the optional \"Compact\" attribute to \"true\" decreases the font size of the value\n\n```html\n<ids-counts compact=\"true\" href=\"#\">\n  <ids-text count-value>7</ids-text>\n  <ids-text count-text>Active <br /> Opportunities</ids-text>\n</ids-counts>\n```\n\nThe counts component also supports an optional \"Color\" attribute. The options for color are base (blue), caution, error, success, warning, or a hex code with the \"#\"\n\n```html\n<ids-counts href=\"#\" color=\"base\">\n  <ids-text count-value>7</ids-text>\n  <ids-text count-text>Active <br /> Opportunities</ids-text>\n</ids-counts>\n```\n\nCounts using just the css. Use the anchor tag for normal counts and span for non-actionable.\n\n```html\n<a class=\"ids-counts\" color=\"base\" href=\"#\">\n  <div class=\"text\">7</div>\n  <div class=\"value\">Active<br>Opportunities</div>\n</a>\n<span class=\"ids-counts\" color=\"base\">\n  <div class=\"text\">7</div>\n  <div class=\"value\">Active<br>Opportunities</div>\n</span>\n```\n\n## Settings and Attributes\n\n- `color` {string} Sets the color to an internal color such as `blue`. Can also a hexadecimal color code beginning with `#`.\n- `compact` {string} Use \"true\" to set the value font-size to 40. Omitting this attribute or using any will result in the default value of 48.\n- `href` {string} The url that the count component links to.\n\n## States and Variations (With Code Examples)\n\n- Actionable\n- Color\n- Compact\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the count is actionable (default) this will toggle through them in the general form order. Non-actionable counts do not get selected.\n- <kbd>Enter</kbd>: This will follow the tag link.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- The counts component has been changed to a web component and renamed to ids-counts.\n- Text is now contained in an ids-text element `<ids-text></ids-text>`\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nText should be localized in the current language. Consider that in some languages text may be longer (German) and in some cases it can't be wrapped (Thai).\n"}},{"name":"ids-data-grid-cell","attributes":[{"name":"root-node","values":[]},{"name":"is-in-valid","values":[]},{"name":"editor","description":"The editor element","values":[]},{"name":"parent-row","values":[]},{"name":"is-draggable","values":[]},{"name":"is-editable","values":[]},{"name":"data-grid","description":"Reference to the data grid parent","values":[]},{"name":"row-below","description":"Gets data grid row below this cell","values":[]},{"name":"row-above","description":"Gets data grid row above this cell","values":[]},{"name":"cell-above","description":"Get the cell above this cell","values":[]},{"name":"cell-below","description":"Get the cell below this cell","values":[]},{"name":"cell-left","description":"Get the cell to the left of this cell","values":[]},{"name":"cell-right","description":"Get the cell to the right of this cell","values":[]},{"name":"cell-left-editable","description":"Get the next editable cell to the left of this cell","values":[]},{"name":"cell-right-editable","description":"Get the next editable cell to the right of this cell","values":[]},{"name":"#memoized-column","values":[]},{"name":"#memoized-column-index","values":[]},{"name":"column","description":"Get the column definition","values":[]},{"name":"column-header","description":"Get the column header cell element","values":[]},{"name":"column-index","description":"Gets the column # in which this cell exists","values":[]},{"name":"row-index","description":"Gets the row-index # in which this cell exists","values":[]},{"name":"formatter","values":[]},{"name":"row","description":"Get row of table cell","values":[]},{"name":"value","description":"Get data value of this cell","values":[]},{"name":"default-value","description":"Get the default/original value of this cell","values":[]},{"name":"original-value","description":"Previous Value before Editing","values":[]},{"name":"original-selected-index","description":"Previous Selected Index before Editing","values":[]},{"name":"previous-invalid-state","description":"Previous Invalid state before reseting","values":[]},{"name":"is-editing","description":"If currently in edit mode","values":[]},{"name":"cell-cache","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-column","description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-common","description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-container-arguments","description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-contextmenu","description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-editors","attributes":[{"name":"type","description":"The type of editor (i.e. input, dropdown, checkbox ect)","values":[]},{"name":"input","description":"Holds the Editor","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-empty-message","description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-filter-manager","attributes":[{"name":"#instance","description":"Singleton instance of the filter manager","values":[]},{"name":"#filters","description":"Collection of active filter instances","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-filters","attributes":[{"name":"root","description":"Reference to the parent data grid component","values":[]},{"name":"defaults","description":"Default filter configuration values","values":[]},{"name":"#conditions","description":"Saved list of filter conditions to use with filter rerender","values":[]},{"name":"#filter-popups","description":"Track filter popups that get moved outside the data grid","values":[]},{"name":"#filter-condition-popups","description":"Track filter condition popups that get moved outside the data grid","values":[]},{"name":"#initial","description":"Initial filter values used for resetting filters","values":[]},{"name":"filter-is-processing","description":"Flag indicating whether a filter operation is currently in progress","values":[]},{"name":"focused","description":"Currently focused filter element, used during filter rerender","values":[]},{"name":"#suppress-filtered-event","description":"Flag to suppress the filtered event from being triggered","values":[]},{"name":"filter-nodes","description":"Get list of filter wrapper elements","values":[]},{"name":"#operators-dataset","description":"Dataset of available filter operators with their values, labels, and icons","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-formatters","attributes":[{"name":"default-icon-labels","description":"Default aria-label map for row indicator icons","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-header","attributes":[{"name":"root-node","values":[]},{"name":"header-checkbox","values":[]},{"name":"column-checkbox","values":[]},{"name":"is-header-expander-collapsed","description":"Tracks the state of the header expander","values":[]},{"name":"data-grid","description":"Reference to the data grid parent","values":[]},{"name":"expander-icons","values":[]},{"name":"#columns","values":[]},{"name":"columns","values":[]},{"name":"columns-onscreen","description":"Returns all the columns in the header","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-row","attributes":[{"name":"root-node","values":[]},{"name":"data-grid","description":"Reference to the data grid parent","values":[]},{"name":"data","values":[]},{"name":"row-data","values":[]},{"name":"columns","values":[]},{"name":"visible-columns","values":[]},{"name":"cells-editable","values":[]},{"name":"is-row-disabled","values":[]},{"name":"dimensions","values":[]},{"name":"expand-icon","values":[]},{"name":"disabled","description":"Set the row disabled state.","values":[]},{"name":"row-index","description":"Gets the row index # of this row.","values":[]},{"name":"row-cache","description":"Implements row cache","values":[]},{"name":"selected","description":"Select this row node","values":[]},{"name":"record-index","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-save-settings-mixin","attributes":[{"name":"settings","description":"Settings to use with local storage.","values":[]},{"name":"#val-settings","description":"List of values for each setting.","values":[]},{"name":"#save-mode","description":"State to check if can be able to save.","values":[]},{"name":"#is-column-moving","description":"Flag to track if column move is in progress","values":[]},{"name":"#restored","description":"List of restored options.","values":[]},{"name":"save-active-page","description":"Sets to save active page","values":[]},{"name":"save-columns","description":"Sets to save columns","values":[]},{"name":"save-filter","description":"Sets to save filter","values":[]},{"name":"save-page-size","description":"Sets to save page size","values":[]},{"name":"save-row-height","description":"Sets to save row height","values":[]},{"name":"save-sort-order","description":"Sets to save sort order","values":[]},{"name":"save-user-settings","description":"Sets to save all user settings","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-search-mixin","attributes":[{"name":"#search-term","description":"Current search term","values":[]},{"name":"#search-field","description":"Reference to the search field element","values":[]},{"name":"data-grid","description":"Reference to the data grid parent","values":[]},{"name":"toolbar","description":"Reference to the data grid toolbar","values":[]},{"name":"searchable","description":"Set searchable which allows list view to be filtered","values":[]},{"name":"search-term-min-size","description":"Set search term min size, will trigger filtering only when its length is greater than or equals to term value.","values":[]},{"name":"search-field-id","description":"Set search field","values":[]},{"name":"search-field","description":"Get search field","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-settings","description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-toolbar-mixin","attributes":[{"name":"#toolbar","description":"Reference to the toolbar element","values":[]},{"name":"data-grid","description":"Reference to the data grid parent","values":[]},{"name":"contextual-toolbar-id","description":"Get contextualToolbarId attribute value","values":[]},{"name":"toolbar","description":"Get toolbar","values":[]},{"name":"toolbar-selection-count-text","description":"Get the selection count text element","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid-tooltip-mixin","attributes":[{"name":"tooltip","description":"Retrieves the current tooltip instance","values":[]},{"name":"suppress-tooltips","description":"Set the tooltips on/off.","values":[]},{"name":"#tooltip","description":"Single tooltip use with all grid elements","values":[]},{"name":"#types","description":"Types of tooltip as unique identifier","values":[]},{"name":"#mouse-out","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-grid","attributes":[{"name":"valid-row-states","values":[]},{"name":"too-many-columns","values":[]},{"name":"cache-hash","values":[]},{"name":"cache-selected","values":[]},{"name":"cache-deselected","values":[]},{"name":"cache-expanded","values":[]},{"name":"cache-collapsed","values":[]},{"name":"cache-cell-class","values":[]},{"name":"cache-cell-part","values":[]},{"name":"initialized","values":[]},{"name":"is-resizing","values":[]},{"name":"is-selecting","values":[]},{"name":"active-cell","values":[]},{"name":"last-active-cell","values":[]},{"name":"#active-cell-cache","values":[]},{"name":"#edited-cells-cache","values":[]},{"name":"auto-fit-set","values":[]},{"name":"current-columns","values":[]},{"name":"sort-column","values":[]},{"name":"empty-message-elements","values":[]},{"name":"open-menu","values":[]},{"name":"server-side-selections","values":[]},{"name":"is-row-disabled","values":[]},{"name":"filter-fields","values":[]},{"name":"#start-selection-cell","values":[]},{"name":"#end-selection-cell","values":[]},{"name":"#column-visibility-update-timer","values":[]},{"name":"#columns-to-update","values":[]},{"name":"#current-scroll","values":[]},{"name":"#after-set-active-cell-fn","values":[]},{"name":"contextmenu-types","description":"Types for contextmenu.","values":[]},{"name":"select-with-filter-dropdown","values":[]},{"name":"dirty-rows","values":[]},{"name":"span-tracker","values":[]},{"name":"#active-indicator-row","description":"Tracks the row index currently showing the active row indicator icon","values":[]},{"name":"#header","description":"#@see IdsDataGrid.header","values":[]},{"name":"header","description":"Get the header element","values":[]},{"name":"body","description":"Get the body element","values":[]},{"name":"wrapper","description":"Get the outside wrapper element","values":[]},{"name":"cell-focused","description":"Get the cell with active tabindex","values":[]},{"name":"cells-editable","description":"Get all the editable cell elements in an array","values":[]},{"name":"rows","description":"Get all the row elements in an array","values":[]},{"name":"rows-selected","description":"Get all the selected row elements in an array","values":[]},{"name":"rows-hidden","description":"Get all the hidden row elements in an array","values":[]},{"name":"rows-visible","description":"Get all the visible row elements in an array","values":[]},{"name":"virtual-rows","description":"Get rows used for virtual scrolling to operate on","values":[]},{"name":"#filters","values":[]},{"name":"datasource","description":"Reference to datasource API","values":[]},{"name":"filters","description":"Get the filters instance attached to component","values":[]},{"name":"formatters","description":"Get the API for list of formatters","values":[]},{"name":"editors","description":"Get the API for list of editors","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"filter-conditions","description":"Get the current filter conditions applied to the data grid","values":[]},{"name":"contextmenu-info","description":"Contextmenu stuff use for info and events","values":[]},{"name":"is-dynamic-contextmenu","description":"Track contextmenu data dynamicly changed by the user.","values":[]},{"name":"#last-selected-row","description":"Keep flag for last selected row","values":[]},{"name":"#initially-selected-row","description":"Keep flag for initially selected row","values":[]},{"name":"#last-shifted-row","description":"Keep reference to last shifted row","values":[]},{"name":"#previous-last-row","description":"Keep reference to previous last row with no-border-bottom class","values":[]},{"name":"#pending-row-append","description":"Flag to prevent multiple concurrent async row appends","values":[]},{"name":"on-locale-change","description":"Handle Locale (and language) change","values":[]},{"name":"max-content-column-widths","values":[]},{"name":"row-height-padding","description":"Utility function to get padding for each rowHeight,\nnote that there is a little extra padding than the css would be for better look.","values":[]},{"name":"visible-columns","description":"Get the visible column data (via hidden attributes)","values":[]},{"name":"hidden-at-runtime-columns","description":"Get the visible column data (via hidden attributes)","values":[]},{"name":"right-frozen-columns","description":"Get the columns frozen on the right","values":[]},{"name":"left-frozen-columns","description":"Get the columns frozen on the left","values":[]},{"name":"has-frozen-columns","description":"Check if any columns are frozen","values":[]},{"name":"next-id-value","values":[]},{"name":"next-id","description":"Set the next unique ID counter","values":[]},{"name":"show-header-expander","description":"Get the show header expander state","values":[]},{"name":"alternate-row-shading","description":"Get the alternate row shading state","values":[]},{"name":"strip-column-id","description":"Get the strip column ID state","values":[]},{"name":"disable-row-highlight","description":"Get the disable row highlight state","values":[]},{"name":"disable-client-sort","description":"Get the disable client sort state","values":[]},{"name":"suppress-select-all-events","description":"Get the suppress select all events state","values":[]},{"name":"disable-header-checkbox","description":"Get the disable header checkbox state","values":[]},{"name":"cell-copy-paste","description":"Get the cell copy paste state","values":[]},{"name":"hide-header-checkbox","description":"Get the hide header checkbox state","values":[]},{"name":"columns","description":"Get the columns of the data grid","values":[]},{"name":"column-groups","description":"Get the column groups of the data grid","values":[]},{"name":"data","description":"Get the data of the data grid","values":[]},{"name":"empty-message-description","description":"Set empty message description","values":[]},{"name":"empty-message-icon","description":"Set empty message icon","values":[]},{"name":"empty-message-label","description":"Set empty message label","values":[]},{"name":"header-menu-id","description":"Set header menu id","values":[]},{"name":"header-opacity-value","description":"Set the opacity value applied to header cells with headerOpacity enabled","values":[]},{"name":"header-menu-data","description":"Set the header menu data","values":[]},{"name":"menu-id","description":"Set menu id","values":[]},{"name":"menu-data","description":"Set the menu data","values":[]},{"name":"virtual-scroll","description":"Set the list view to use virtual scrolling for a large amount of rows","values":[]},{"name":"overflow","description":"Set the overflow property to enable/disable scrollbars","values":[]},{"name":"virtual-scroll-settings","description":"Some future configurable virtual scroll settings","values":[]},{"name":"#virtual-scroll-max-rows-in-dom","values":[]},{"name":"scroll-max-rows","description":"Setting for max virtual scroll rows in DOM","values":[]},{"name":"#custom-scroll-event-cache","values":[]},{"name":"label","description":"Set the aria-label element in the DOM. This should be translated.","values":[]},{"name":"row-height","description":"Set the row height between extra-small, small, medium and large (default)","values":[]},{"name":"min-height","description":"Set the min height of the grid (for the empty message or loading indicator)","values":[]},{"name":"height","description":"Set the height of the grid","values":[]},{"name":"max-height","description":"Set the max height of the grid","values":[]},{"name":"width","description":"Set the width of the grid","values":[]},{"name":"min-width","description":"Set the min width of the grid","values":[]},{"name":"max-width","description":"Set the max width of the grid","values":[]},{"name":"row-start","description":"Get the start-row index","values":[]},{"name":"row-navigation","description":"Sets keyboard navigation to rows","values":[]},{"name":"list-style","description":"Set the style of the grid to list style for simple readonly lists","values":[]},{"name":"row-selection","description":"Set the row selection mode between false, 'single', 'multiple' and 'mixed'","values":[]},{"name":"cell-selection","description":"Set the cell selection mode. Default is false.","values":[]},{"name":"col-selection","description":"Set the column selection, true to add column header selection","values":[]},{"name":"suppress-empty-message","description":"Set suppress empty message","values":[]},{"name":"loading-indicator","values":[]},{"name":"suppress-row-click-selection","description":"Get the current value of suppress row click selection","values":[]},{"name":"suppress-row-deselection","description":"Set to true to prevent rows from being deselected if click or space bar the row.\ni.e. once a row is selected, it remains selected until another row is selected in its place.","values":[]},{"name":"suppress-row-deactivation","description":"Set to true to prevent rows from being deactivated if clicked.\ni.e. once a row is activated, it remains activated until another row is activated in its place.","values":[]},{"name":"selected-rows","description":"Get the selected rows","values":[]},{"name":"selected-map","description":"Map and boundary data on selected cells","values":[]},{"name":"selected-rows-across-pages","description":"Get the selected rows across all pages, if a paged dataset is present","values":[]},{"name":"activated-row","description":"Get the activated row","values":[]},{"name":"active-cell-editor","values":[]},{"name":"is-editable","values":[]},{"name":"row-count","description":"Set/Get the total number of records","values":[]},{"name":"row-pixel-height","description":"Get the row height in pixels","values":[]},{"name":"auto-fit","description":"Set the card to auto fit to its parent size","values":[]},{"name":"suppress-caching","description":"Suppress row row and cell caching","values":[]},{"name":"disable-client-filter","description":"Sets disable client filter","values":[]},{"name":"filterable","description":"Sets the data grid to be filterable","values":[]},{"name":"first-draggable-column","description":"Gets the minimum column index that can be reordered","values":[]},{"name":"keep-filter-conditions","description":"Keep filter conditions when calling `data` to reload data","values":[]},{"name":"filter-row-disabled","description":"Sets disabled to be filter row","values":[]},{"name":"filter-when-typing","description":"Sets the data grid to filter when typing","values":[]},{"name":"tree-grid","description":"Sets the grid to render as a tree grid (does require a tree formatter column)","values":[]},{"name":"groupable","description":"Sets the grid to group rows (only one field is supported)","values":[]},{"name":"group-selects-children","description":"If true then the children will be selected when a group is selected","values":[]},{"name":"id-column","description":"Used to set which column is the unique id column in the data set.\nThis is needed for some operations.","values":[]},{"name":"expandable-row","description":"If true an expandable row is present in the grid. Also requires a expandable-row-template and\nan expander formatter.","values":[]},{"name":"allow-one-expanded-row","description":"This setting will allow only one expandable-row to be opened/expanded at a time.","values":[]},{"name":"expandable-row-template","description":"An id that points to the template to use for expandable rows. Also requires the expandable-row setting\nand an expander formatter.","values":[]},{"name":"unique-id","description":"Set uniqueId to save to local storage.","values":[]},{"name":"editable","description":"Set to true if one or more editors is present to activate editing","values":[]},{"name":"edit-next-on-enter-press","description":"Set to false to avoid moving up and down rows when editing and hitting enter","values":[]},{"name":"add-new-at-end","description":"Set to true to automatically append rows when keyboard navigating\nthe data grid in editable mode","values":[]},{"name":"invalid-cells","description":"Get all the currently invalid cells","values":[]},{"name":"dirty-cells","description":"Get all the currently dirty cells","values":[]},{"name":"modal-template","values":[]},{"name":"text-search-type","description":"Set the text search type for search functionality","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# Ids Data Grid\n\n## Description\n\nThe data grid component (ids-data-grid) is used to arrange tabular data in rows and columns for easier scanning and comparison. Data grids are very configurable in both design and functionality and they can be found within almost every product/app.\n\nYou should pass an array of objects in to the grid on the `dataset` object. Also pass the `columns` array which contains the column configuration. There are a number of events described in the events and API section, as well as the column settings.\n\nA Read-Only data grid uses \"Formatters\" to render cell content. A number of these are listed in the API section and it is possible to create your own.\n\n## Use Cases\n\n- The data grid component is most useful when it is used for categorically sorting dense and repetitive information. Each individual item is listed down the Y axis of the chart, and their shared attribute categories are listed along the X axis. The resulting cells are filled with information that is relevant to the corresponding item and attribute.\n\n## Terminology\n\n- **Title**: The name of the data grid optionally appearing above the grid and describing the contents.\n- **Options**: An optionally actions menu button with functionality that operates on the entire data grid.\n- **Cell**: Body elements of the data grid that contain an object's value or attribute. Cells should only contain one type of content or it can be confusing and hurt accessibility.\n- **Header Cell**: These cells contain the names of the columns in the grid and related functions like filtering and sorting. All cells below the header cell will hold values related to the attribute in the header cell.\n- **Column**: Cells stacked vertically that contain values relate to the attribute found on the top header cell.\n- **Row**: Each row contains one cell per column in the data grid, and each cell displays a single value in the bound data item.\n- **Tree**: Denotes the use of hierarchical data, with an expandable and collapsible hierarchy.\n\n## Themeable Parts\n\n- `table` allows you to further style the table main element\n- `container` allows you to further style the container element\n- `body` allows you to further style the body element\n- `header` allows you to further style the header element\n- `headerCell` allows you to further style the header cells\n- `row` allows you to further style the rows\n- `cell` allows you to further style the row cells\n- `cell-selected` allows you to further style row cells that are selected (in mixed-selection mode, activated cells are also styled)\n- `tooltip-popup` allows you to further style or adjust the outer tooltip popup element\n- `tooltip-arrow` allows you to adjust the tooltip arrow element\n\n## Features (With Code Examples)\n\nA data grid is created by adding an `ids-data-grid` html element in the page and setting the options either inline in the markup or in the JS part of the code. You can only use simple types (string, boolean ect) for inline markup so passing the data and column arrangement is always done in the JS part. The data will be an array of objects so its in the correct tabular form. The columns are also an array of objects but with defined options and types. See more about columns in next section.\n\n```html\n<ids-data-grid id=\"data-grid-1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.data = dataset;\ndataGrid.columns = columns;\n```\n\n### Column Groups\n\nSetting column groups allows you to add a second level of columns in your header and the ability to group the first level. This is useful for when you have a large number of columns and you want to group them into logical or related sections.\n\nColumn groups are achieved by providing an array to the `columnGroups` setting. Only one level of column groups can be defined.\n\n```js\ndataGrid.columnGroups = [\n{\n  colspan: 3,\n  id: 'group1',\n  name: 'Column Group One',\n  align: 'center'\n},\n{\n  colspan: 2,\n  id: 'group2',\n  name: 'Column Group Two'\n},\n{\n  colspan: 2,\n  id: 'group3',\n  name: 'Column Group Three',\n  align: 'right'\n},\n{\n  colspan: 11,\n  id: 'group4',\n  name: 'Column Group Four',\n  align: 'left'\n}\n];\n```\n\nIf the column is hidden it will be automatically removed from the `colspan`. If in the last group you didn't provided a bug enough `colspan` it will be set to the remaining columns. The `name` text can be right or left aligned and given an id. The only required property is `colspan`.\n\n### Disabling Rows\n\nDisabling rows with certain conditions can be done by using the `isRowDisabled` setting. `isRowDisabled` is a callback function that takes in `rowNumber` and `rowData` as parameters. This can be used to make conditional checks for rows.\n\nHere is an example on using `isRowDisabled`. This will disable rows that have row data with the `activity` variable equal to \"Assemble Paint\".\n\n```js\nconst isRowDisabled = (rowIndex, rowData) => {\n  return rowData.activity === 'Assemble Paint';\n}\n\ndataGrid.isRowDisabled = isRowDisabled;\n```\n\n### Disabling Sort\n\nDisabling the sorting in datagrid can be done using `disableClientSort` setting or the `disable-client-sort` attribute. This will disable the default sorting in the component but still update the sorting icon status on the button.\n\n```js\ndataGrid.disableClientSort = true;\n```\n\n```html\n<ids-data-grid disable-client-sort>\n</ids-data-grid>\n```\n\n### Selection\n\nThe data grid has several options for selecting. Row selection, column selection, and dragging and selecting a group of cells using the mouse.\n\n#### Row Selection\n\nThis involves the setting `rowSelection`. This can be one of several values.\n\n- `false` No selection enabled.\n- `multiple` Allows multiple rows to be selected. When doing this it is recommended to add a `formatters.selectionCheckbox` for the first column.\n- `single` Allows a single row to be selected. When doing this you can optionally to add a `formatters.selectionRadio` for the first column. You can use the `suppressRowDeselection` if you want one row to always be selected.\n- `mixed` Allows multiple rows to be selected by clicking only on the checkbox or <kbd>Space</kbd> key. If clicking a row then that row is activated, meaning it is the current row and something might be shown based on the data of that row. You can use the `suppressRowDeactivation` if you want one row to always be selected.\n\nHere is a code example for multi select\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" row-selection=\"multiple\">\n</ids-data-grid>\n```\n\n```js\n  dataGrid.addEventListener('beforerowselected', (e: Event) => {\n    console.info(`Before Row Selected`, (<CustomEvent>e).detail);\n    if (Number((e as any).detail.data.book) === 104) {\n      console.error('Row 104 randomly cant be selected');\n      (<CustomEvent>e).detail.response(false);\n    }\n  });\n\n  dataGrid.addEventListener('rowselected', (e) => {\n    console.info(`Row Selected`, e.detail);\n  });\n\n  dataGrid.addEventListener('rowdeselected', (e) => {\n    console.info(`Row Deselected`, e.detail);\n  });\n\n  dataGrid.addEventListener('selectionchanged', (e) => {\n    console.info(`Selection Changed`, e.detail);\n  });\n```\n\n#### Column Selection\n\nThis involves the setting `colSelection` or `col-selection` in attributes. This can be set to either `true` or `false`. Setting it to true will enable the column selection header checkboxes on datagrid.\n\n```html\n<ids-data-grid col-selection=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.colSelection = true;\n```\n\nThe following events are relevant to selection/activation.\n\n`rowselected` Fires when an individual row is activation and gives information about that row.\n`rowdeselected` Fires when an individual row is deselected and gives information about that row.\n`selectionchanged` Fires once for each time selection changes and gives information about all selected rows.\n\n`rowactivated` Fires when an individual row is activated and gives information about that row.\n`rowdeactivated` Fires when an individual row is deactivated and gives information about that row.\n`activationchanged` Fires once for each time activation changes and gives information about the active row.\n\nThe following settings are relevant to ui state of header checkbox\n\n`disableHeaderCheckbox` When true, disable the ui interaction of header checkbox but the data row checkboxes are still enabled.\n`hideHeaderCheckbox` When true, hides the ui of header checkbox but the data row checkboxes are still visible.\n\n### Tree Grid\n\nThe tree grid feature involves the setting `treeGrid` to true. In addition the data passed to the tree grid should contain a field called `children`. That contains the child rows. This can by unlimited levels but 2-4 is recommended as a max for a more usable UI. In addition you can preset some states by adding `rowExpanded: false` to the parent elements (default is expanded). And also set `rowHidden: false` for child rows that are expanded. You also need a `Expander` formatter on a cell (usually the first visible cell.\n\nHere is a code example for a tree grid.\n\n```html\n<ids-data-grid id=\"tree-grid\" label=\"Buildings\" tree-grid=\"true\" group-selects-children=\"true\"></ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to selection/activation.\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `groupSelectsChildren` {boolean} If the tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `suppressRowClickSelection` {boolean} If using selection you might want to set this so clicking a row will not select it.\n\n### Rowspan\n\nThe rowspan feature automatically spans cells across multiple rows when consecutive rows have identical values in specified columns. This is useful for displaying grouped data with visual hierarchy. Not compatible with virtual scroll since only a subset of rows are rendered, preventing accurate rowspan calculations.\n\nTo enable automatic rowspan for a column, set the `rowspan` property to `true` in the column definition:\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    formatter: dataGrid.formatters.text,\n    rowspan: true  // Enable automatic rowspan for this column\n  },\n  {\n    id: 'period',\n    name: 'Period',\n    field: 'period',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'amount',\n    name: 'Amount',\n    field: 'amount',\n    formatter: dataGrid.formatters.decimal\n  }\n];\n\nconst data = [\n  {\n    description: 'Office Supplies',\n    ledger: '1000',\n    period: 'Jan',\n    amount: 150\n  },\n  {\n    description: 'Office Supplies',  // Will automatically span with previous row\n    ledger: '1000',                  // Will automatically span with previous row\n    period: 'Feb',\n    amount: 200\n  },\n  {\n    description: 'Travel',\n    ledger: '2000',\n    period: 'Jan',\n    amount: 500\n  }\n];\n```\n\nThe data grid automatically calculates rowspan based on consecutive rows with identical values in columns marked with `rowspan: true`. When data is sorted or filtered, rowspan relationships are automatically recalculated to maintain correct spanning.\n\n### Expandable Row\n\nThe Expandable Row feature involves the setting `expandableRow` to true. In addition a row template should be provided via an id that points to the `expandableRowTemplate` which is a `template` element. You can preset the expandable state by adding `rowExpanded: true` to the row element you want to expand. The default is collapsed.\n\nHere is a code example for an expandable row\n\n```html\n<ids-data-grid\n    id=\"data-grid-expandable-row\"\n    expandable-row=\"true\"\n    expandable-row-template=\"expandable-row-tmpl\"\n    label=\"Books\">\n    <template id=\"expandable-row-tmpl\">\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"16\" type=\"span\">${convention}</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">${price} USD</ids-text>\n        </ids-layout-grid>\n        <ids-layout-grid auto-fit=\"true\" padding-x=\"md\">\n        <ids-text font-size=\"14\" type=\"span\">Lorem Ipsum is simply sample text of the printing and typesetting industry. Lorem Ipsum has been the industry standard sample text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only...</ids-text>\n        </ids-layout-grid>\n    </template>\n</ids-data-grid>\n```\n\n```js\ndataGrid.addEventListener('rowexpanded', (e) => {\n  console.info(`Row Expanded`, e.detail);\n});\n\ndataGrid.addEventListener('rowcollapsed', (e) => {\n  console.info(`Row Collapsed`, e.detail);\n});\n```\n\nThe following events are relevant to expandable rows\n\n`rowexpanded` Fires when a tree grid row is expanded by click or keyboard.\n`rowcollapsed` Fires when a tree grid row is collapsed by click or keyboard.\n\nSome additional settings are needed or possibly needed.\n\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `expandableRowTemplate` {string} Should point to the row `template` element.\n\n### Editing\n\nThe Editing features start by setting `editable` to true. In addition you should add editors to columns and enable features of each of the editors. The features differ depending on the component used for editing. See the Keyboard section for information on which keys can be used when editing..\n\nHere is a code example for an editable text cell.\n\n```js\ncolumns.push({\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.text,\n    editor: {\n      type: 'input',\n      inline: true,\n      editorSettings: {\n        autoselect: true,\n        dirtyTracker: true,\n        browserAutocomplete: 'name',\n      },\n      editorValidation: {\n        check: (input) => input.value.length < 50>,\n        message: 'Maximum of 50 characters',\n        messageId: 'translationKey',\n        id: 'maxchars'\n      }\n    }\n  });\n```\n\nHere is a code example for an editable dropdown cell\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.dropdown,\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      dirtyTracker: true,\n      validate: 'required',\n      options: [\n        {\n          label: 'Option 1',\n          value: 'opt1'\n        },\n        {\n          label: 'Option 2',\n          value: 'opt2'\n        }\n      ]\n    }\n  }\n});\n```\n\nHere is a code example for an editable multiselect cell\n\n```js\ncolumns.push({\n  id: 'categories',\n  name: 'Categories',\n  field: 'categories',\n  resizable: true,\n  reorderable: true,\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'multiselect',\n    inline: true,\n    editorSettings: {\n      dirtyTracker: true,\n      options: [\n        {\n          label: 'Category A',\n          value: 'cat-a'\n        },\n        {\n          label: 'Category B',\n          value: 'cat-b'\n        },\n        {\n          label: 'Category C',\n          value: 'cat-c'\n        }\n      ]\n    }\n  }\n});\n```\n\nThe multiselect editor allows users to select multiple values from a dropdown list. The cell value should be an array of selected values. When using the `beforeShow` callback, you can dynamically populate options based on the current cell data.\n\nTo cancel or disabled editing there are a few ways:\n\n- setting the column `editor` setting to undefined will disable editing on the column (as will not having an editor setting at all).\n- adding a `readonly` or `disabled` function which returned true for some cells based on a condition will disable or mark the cell readonly.\n- return false in the `beforecelledit` event in the response function\n\nThe following settings are available on editors.\n\n`type` As of now can be `checkbox`, `input`, `datepicker`, `timepicker`, `dropdown`, `multiselect`, or `tree` but more will be added.\n`inline` Default is false. If true the editor (for example an input) will be visible in a field.\n`editorSettings` Is an object that is loosely typed that lets you pass any option the editor supports in. For example any of the IdsInput or IdsCheckbox options can be passing in. Some special ones are:\n`editorSettings.autoselect` Text will be selected when entering edit mode. If false, cursor will be appended to end of input value.\n`editorSettings.dirtyTracker` Enables the dirty tracker that marks changed cells.\n`editorSettings.browserAutocomplete` Adds the autocomplete attribute to the editor input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n`editorSettings.validate` Text will be selected when entering edit mode\n`editorSettings.mask` Will pass mask settings to the input (if supported).\n`editorSettings.maskOptions` Will pass maskOptions settings to the input (if supported).\n`editorSettings.options` Dataset used for dropdown editor's list box options. If none are specified the value in the data will be applied as the only options.\n`editorSettings.maxlength` Sets the input editor's `maxlength` property to the max characters you can type\n`editorSettings.uppercase` Sets the input editor's to all uppercase\n`editorValidation` Optional property to set custom validation rule\n`editorValidation.check` Callback function for custom validation. It is passed the editable cell's input field and expects a boolean value in return\n`editorValidation.message` Error message displayed when the validation check fails\n`editorValidation.id` Unique id for the validation rule\n`showEditorIcons` Sets the editable cell icons to be always open or only on hover. Default is `hover`.\n\nWhen the use clicks in the cell or activates editing with the keyboard with the Enter key and types. The following events will fire.\n\n`beforecelledit` Fires before a cell is being edit (before edit is started). Can be vetoed by returning false as shown below.\n`celledit` Fires exactly when a cell is being edited.\n`endcelledit` Fires when a cell edit is completed and changed. Event detail includes `oldValue`, `newValue`, `oldSelectedIndex`, and `newSelectedIndex` properties.\n`cancelcelledit` Fires when an edit is cancelled via the <kbd>Esc</kbd> key. Event detail includes `oldValue` and `oldSelectedIndex` properties.\n\nTo cancel editing based on some condition or if editing is not allowed you can veto the `beforecelledit` event.\n\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(false);\n  });\n```\n\nIf the callback for the `beforecelledit` event requires async operations, the user can pass an `async function` or a `Promise<boolean>`.\n```js\n  dataGrid.addEventListener('beforecelledit', (e: Event) => {\n    (<CustomEvent>e).detail.response(async () => {\n      const dbResponse: boolean = await fetchDbResponse;\n      return dbResponse;\n    });\n  });\n```\n\nThere are a few utility functions for editing the data grid mentioned in the Methods section.\n\n### Field Indicators for Input Editors\n\nField indicators provide visual cues on editable input cells to communicate field status, validation state, or other contextual information. A colored triangle appears in the top corner of the cell, and an icon with a tooltip provides additional details.\n\nThis feature only applies to columns with `editor.type` set to `'input'`.\n\n#### Indicator Types\n\nThe following indicator types are available, each with a distinct color:\n\n- `neutral` - Gray indicator for informational purposes\n- `info` - Blue indicator for helpful information\n- `success` - Green indicator for valid or complete fields\n- `caution` - Yellow indicator for fields that need review\n- `warning` - Orange indicator for fields requiring attention\n- `error` - Red indicator for invalid or required fields\n\n#### Static Field Indicator\n\nSet a static indicator type directly on the column:\n\n```js\ncolumns.push({\n  id: 'ledger',\n  name: 'Ledger',\n  field: 'ledger',\n  formatter: dataGrid.formatters.text,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true\n    }\n  },\n  fieldIndicator: 'info',\n  fieldIndicatorMessage: 'Ledger code is auto-generated if left blank'\n});\n```\n\n#### Dynamic Field Indicator\n\nUse a function to determine the indicator type based on row data:\n\n```js\ncolumns.push({\n  id: 'price',\n  name: 'Price',\n  field: 'price',\n  align: 'right',\n  formatter: dataGrid.formatters.decimal,\n  editor: {\n    type: 'input',\n    editorSettings: {\n      autoselect: true,\n      dirtyTracker: true,\n      mask: 'number'\n    }\n  },\n  fieldIndicator: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'error';\n    if (price < 10) return 'caution';\n    if (price > 100) return 'warning';\n    return 'success';\n  },\n  fieldIndicatorMessage: (row, value, column, rowData) => {\n    const price = Number(value) || 0;\n    if (price === 0) return 'Price cannot be zero';\n    if (price < 10) return 'Low price - verify if correct';\n    if (price > 100) return 'High price - requires approval';\n    return 'Price is within normal range';\n  }\n});\n```\n\n#### Column Settings for Field Indicators\n\n| Setting | Type | Description |\n|---------|------|-------------|\n| `fieldIndicator` | `string \\| function` | The indicator type (`'neutral'`, `'info'`, `'success'`, `'caution'`, `'warning'`, `'error'`) or a function that returns the type based on row data. Return `null` to hide the indicator. |\n| `fieldIndicatorMessage` | `string \\| function` | The tooltip message displayed when hovering over the indicator icon, or a function that returns the message based on row data. |\n\n#### RTL Support\n\nField indicators automatically adjust for right-to-left (RTL) languages. The triangle indicator appears in the top-right corner in LTR mode and top-left corner in RTL mode. The tooltip also positions appropriately based on the text direction.\n\nSee the [Field Indicator Demo](./demos/field-indicator.html) for a complete example.\n\n### Grouped Rows (Groupable)\n\nThe grouped row feature start by setting `groupable` setting to an object containing fields to group by. Only one group by field is currently supported.\n\n```js\n  dataGrid.groupable = {\n    fields: ['type']\n  };\n```\n\nThe `groupable` object can contain the following properties some are for future support. Aggregators do work in the data now but the footer is not yet available.\n\n- `fields` {array} Sets the field to group by on\n- `aggregators` {array} For future support.\n- `expanded`: {boolean | function} For future support.\n- `groupRowFormatter`: {function} For future support.\n- `groupFooterRow`: {boolean} For future support.\n- `groupFooterRowFormatter`: {function} For future support.\n\nWhen a row is collapsed the internal grouped data will set a field`groupCollapsed` on your data object and hide child rows.\n\n### Column Attributes / Test Attributes\n\nThe `attributes` column setting allows you to add custom data attributes to each cell for testing or automation purposes.\n\n```js\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  attributes: [\n    { name: 'data-automation-id', value: 'description', prefix: 'my-grid' }\n  ]\n});\n```\n\nEach attribute object supports:\n- `name` - The attribute name (e.g., `data-automation-id`)\n- `value` - Optional string with a string value, or may use a function receiving `{ rowIndex, rowData, columnId }` that use can use conditionally return a value.\n- `prefix` - Optional prefix prepended to value\n- `suffix` - Optional suffix appended to value\n\nThe final attribute is built as: `prefix-value-suffix` (parts joined with `-`).\n\nExample with function value for row-specific IDs. Note that running a function on each cell has a slight performance impact.\n\n```js\nattributes: [{\n  name: 'data-automation-id',\n  value: ({ rowIndex }) => `description-row-${rowIndex}`,\n  prefix: 'my-grid'\n}]\n// Result: data-automation-id=\"my-grid-description-row-0\"\n```\n\n### Header Opacity (Design Mode)\n\nThe header opacity feature allows you to visually dim specific column headers to indicate they are hidden in normal mode. This is useful in designer mode where users need to see all columns but distinguish between visible and hidden ones.\n\nTo enable, set `headerOpacity: true` on individual columns and optionally set `headerOpacityValue` on the grid to control the opacity level (defaults to `0.2` via CSS).\n\n```html\n<ids-data-grid id=\"my-grid\" filterable=\"true\" header-opacity-value=\"0.2\"></ids-data-grid>\n```\n\n```js\nconst columns = [\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'price',\n    name: 'Price',\n    field: 'price',\n    formatter: dataGrid.formatters.decimal,\n    headerOpacity: true // This column header will appear dimmed\n  }\n];\n\ndataGrid.columns = columns;\n```\n\nYou can change the opacity value dynamically:\n\n```js\ndataGrid.headerOpacityValue = 0.5;\n```\n\nTo toggle opacity on a specific column at runtime without a full redraw:\n\n```js\n// Dim a column header\ndataGrid.setColumnHeaderOpacity('price', true);\n\n// Restore to normal\ndataGrid.setColumnHeaderOpacity('price', false);\n```\n\nColumns with `headerOpacity: true` will have `pointer-events: none` applied, making them non-interactive via mouse. See the `header-opacity` example for a working demo.\n\n## Column Sizing\n\nThe columns can be sized by using the `width`, `minWidth`, and `maxWidth` settings. They have a few options that can be used to control the sizing in different ways. I.E. There are three column configurations: `auto`, `fixed` and `percent`.\n\n- Unspecified - The column will be sized by the content `minmax(150px, 1fr)` to a reasonable / readable default. This is known as `auto` columns.\n- `150` { integer } - The column will be a fixed size in pixels if provided as an integer.\n- `10%` { string } - The column will be a percentage of the table width.\n- `minmax(130px, 4fr)` { string } - The column will be a minimum of 150px and a maximum of 1fr. This is useful for a stretch column. (see example columns-stretch.html)\n- `10ch` { string } - The column will be sized to 10 characters wide. This is an approximation based on the largest size character `W` in a default font plus a buffer so not exact for every character possible.\n- `max-content` { string } - The column will be sized to the max width of the content in the column. Either the title or the biggest cell content depending what is bigger. This method needs to scan the entire data set to determine the max width so is slightly slower. If virtual scrolling is enabled this will only scan the data that is in the visible buffer.\n\nFor a spacer column you just need to specify one extra column at the end (see example columns-fixed.html).\n\n## Settings and Attributes\n\nWhen used as an attribute in the DOM the settings are kebab case, when used in JS they are camel case.\n\n- `addNewAtEnd` {boolean} Automatically append rows while keyboard navigating data grid in edit mode.\n- `allow-one-expanded-row` {boolean} This setting will allow only one expandable-row to be opened/expanded at a time. Defaults to false.\n- `alternateRowShading` {boolean} For better scan-ability you can shade alternate rows.\n- `autoFit` {boolean} If true, the data grid will automatically fit to its parent container size.\n- `cellCopyPaste` {boolean} Enable the copy-paste handling that's based on cell selection (copying selected cells and pasting based on selected cells). Default is false.\n- `columnGroups` {Array<object>} Allows you to group columns together in logical sets. See section below for details.\n- `columns` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `data` {Array<object>} Sets the data to show in the data grid. This can be a JSON Array.\n- `disableClientFilter` {boolean} Disables the filter logic client side in situations you want to filter server side.\n- `disableClientSort` {boolean} Disables the default sorting in datagrid.\n- `disableHeaderCheckbox` {boolean} If true, the header checkbox will be disabled but still visible.\n- `disableRowHighlight` {boolean} Disables row highlighting when a row is hovered.\n- `editable` {boolean} If true in addition to adding editors to columns the data grid is editable.\n- `editNextOnEnterPress` {boolean} If enabled when editing using <kbd>ENTER</kbd> will finish editing and start editing the same cell in next row and <kbd>SHIFT + ENTER</kbd> will edit the previous row.\n- `emptyMessageDescription` {string} Set empty message description text.\n- `emptyMessageIcon` {string} Set empty message icon name.\n- `emptyMessageLabel` {string} Set empty message label text.\n- `expandableRow` {boolean} Indicates expandable rows will be used in the data grid.  See the expandable row section for more details.\n- `expandableRowTemplate` {string} Should point to the row `template` element for expandable rows.\n- `filterable` {boolean} Turns on or off the filter functionality.\n- `filterRowDisabled` {boolean} Disables the filter row.\n- `filterWhenTyping` {boolean} If true (default), filtering will occur while typing in filter fields. If false, press Enter to filter.\n- `firstDraggableColumn` {number} Sets the minimum column index that can be reordered. Columns before this index are fixed and cannot be moved. Defaults to 0 (all columns can be reordered).\n- `groupSelectsChildren` {boolean} If a tree grid has multiple selection, setting this will select all children when a parent is selected.\n- `headerMenuData` {Array<object>} Dataset to build context menu for header and header group cells.\n- `headerMenuId` {string} ID of the popupmenu to use as context menu for header and header group cells.\n- `headerOpacityValue` {string|number|null} Sets the opacity value applied to column headers that have `headerOpacity: true`. Returns `null` when no value is set. The visual default of `0.2` is handled by the CSS fallback. Can also be set via the `header-opacity-value` attribute.\n- `hideHeaderCheckbox` {boolean} If true, the header checkbox will be hidden completely.\n- `id-column` {string} This setting will specify the name of the field which acts as the primary key for the data in the table. Some actions like saving row states across pages require this field to save the data back into the data set properly. Defaults to `id`.\n- `idColumn` {string} For saving the row state during sort this should be set to the id column in the data set. Defaults to `id`.\n- `keepFilterConditions` {boolean} Keeps the current filter conditions when new data is applied.\n- `listStyle` {boolean} Sets the style of the grid to list style for simple readonly lists.\n- `menuData` {Array<object>} Dataset to build context menu for body cells.\n- `menuId` {string} ID of the popupmenu to use as context menu for body cells.\n- `minHeight` {string} Sets the minimum height of the data grid. This is useful for having an area to show the empty message or the loading indicator. This can can be set as `250px` or `50vh` etc. Defaults to `350px` if not specified. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `height` {string} Sets the height of the data grid. This can be set as `400px` or `50vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `maxHeight` {string} Sets the maximum height of the data grid. This can be set as `600px` or `80vh` etc. Note: `vh` units are recommended over percentage values because percentages require the parent element to have an explicit height. Without a fixed parent height, the browser treats percentage heights as zero, causing the grid to collapse.\n- `width` {string} Sets the width of the data grid. This can be set as `800px` or `100%` etc.\n- `minWidth` {string} Sets the minimum width of the data grid. This can be set as `400px` or `50%` etc.\n- `maxWidth` {string} Sets the maximum width of the data grid. This can be set as `1200px` or `90%` etc.\n- `overflow` {string} Sets the overflow attribute for datagrid. Default is `auto`.\n- `rowHeight` {string | `'xxs'` | `'xs'` | `'sm'` | `'md'` | `'lg'`} Sets the height and padding of each row. In smaller row heights the font is lowered.\n- `rowNavigation` {boolean} If using row navigation, the row will be focused when navigating the data grid via clicks and keyboard events.\n- `rowSelection` {string|boolean} Set the row selection mode between false, 'single', 'multiple' and 'mixed\n- `saveActivePage` {boolean} If set the active page on the pager will be saved to local storage.\n- `saveColumns` {boolean} If set columns will be saved to local storage.\n- `saveFilter` {boolean} If set filter will be saved to local storage.\n- `savePageSize` {boolean} If set the page size on the pager will be saved to local storage.\n- `saveRowHeight` {boolean} If set the row height will be saved to local storage.\n- `saveSortOrder` {boolean} If set column sort order will be saved to local storage.\n- `saveUserSettings` {boolean} If set all settings will be saved to local storage.\n- `scrollMaxRows` {string|number} Sets maximum number of rows to render for virtual scrolling. Default max rows is 100.\n- `showHeaderExpander` {boolean} Set to show header expander icon for expandable and tree rows.\n- `suppressCaching` {boolean} If true, row and cell caching will be suppressed.\n- `suppressEmptyMessage` {boolean} Set to true to prevent display empty message.\n- `suppressRowClickSelection` {boolean} If using selection setting this will require clicking a checkbox or radio to select the row. Clicking other cells will not select the row.\n- `suppressRowDeactivation` {boolean} Set to true to prevent rows from being deactivated if clicked. i.e. once a row is activated, it remains activated until another row is activated in its place.\n- `suppressRowDeselection`  {boolean} Set to true to prevent rows from being deselected if click or space bar the row. i.e. once a row is selected, it remains selected until another row is selected in its place.\n- `suppressSelectAllEvents` {boolean} Set to true to suppress `beforerowselected` and `rowselected` events when using Ctrl+A to select all rows, improving performance with large datasets.\n- `suppressTooltips`  {boolean} Set to true to prevent display tooltips.\n- `treeGrid` {boolean} Indicates a tree grid will be used  in the data grid. See the tree grid section for more details.\n- `textSearchType` {string} Controls how keyword text search is processed. Can be 'default' or 'column-data'. Default performs the existing behavior using HTML text content of cells for keyword search. 'column-data' performs keyword search directly on the raw data bound to cells instead of formatted HTML content, providing better performance with large datasets at the cost of some search functionality like formatted value matching.\n- `unizqueId` {string} A unique identifier used when saving settings to local storage.\n- `virtualScroll` {boolean} When virtual scroll is used the grid can render many thousands of rows and only the rows visible in the scroll area are rendered for performance. This setting has limitations such as the rows need to be fixed size.\n\n## Column Settings (General)\n\n|Setting|Type|Description|\n|---|---|---|\n|`align` | {string} | Can be `left` or `right` or `center` to align both the cell and the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`attributes` | {Array<object>} | Adds custom attributes to each cell in the column. Each object can have `name` (attribute name), `value` (string or function receiving `{ rowIndex, rowData, columnId }`), `prefix` (optional), and `suffix` (optional). The final attribute value is built as `prefix-value-suffix`. See the `column-attributes` example. |\n|`cellSelectedCssPart` | {string} | Allows customization of a selected cell's background color.|\n|`cssPart` | {string} | Allows you to set the name of a css part that can be used to customize the cell's css. This can be a string or a function. See the columns-custom-css example. The default cssPart for cells is called `cell` and it also can be used for more global changes.  |\n|`disabled` | {boolean or Function} | If true the cell will be set to disabled color, indicating no editing.|\n|`editor` | {object} | Adds an editor to the column if editable is set on the grid. See editing section for more details.|\n|`excludeReadonlyStyling` | {boolean} | Determines whether to exclude the default readonly styling (disabled/greyed-out appearance) from a column when its readonly property is true. When set to true, the column will maintain its normal visual appearance while still being readonly. Defaults to false. |\n|`field` | {string} | The name of the field (column) in the data array attached to the grid for example `description`. This can also be nested in an object for example `children.name`. |\n|`filterAlign` | {string} | Can be `left` or `right` or `center` to control the alignment of just the filter row in the cell header. Left is the default so does not need to be specified. In RTL mode left is right and right is left. |\n|`filterButtonTooltip` | {string} | Let you set the header filter button tooltip content. |\n|`filterButtonTooltipCssPart` | {string} | Allows you to sets the filter button tooltip css part.|\n|`formatter`| {Function} | Controls how the data is rendered in the cell.|\n|`frozen` | {string} | Sets the column to be frozen on either left or right side by passing `left` or `right`. See the `columns-frozen` example for a working example. Frozen columns currently have some limitations to be addressed in the future. |\n|`headerAlign` | {string} | Can be `left` or `right` or `center` to align just the header. Left is the default and does not need to be specified. In RTL mode left is right and right is left. |\n|`headerIcon` | {string} | Allows you to set the name of the header icon. |\n|`headerIconTooltip` | {string} | Let you set the header icon tooltip content. |\n|`headerIconTooltipCssPart` | {string} | Allows you to sets the header icon tooltip css part.|\n|`headerTooltip` | {string} | Let you set the header title tooltip content. |\n|`headerTooltipCssPart` | {string} | Allows you to sets the header tooltip css part.|\n|`hideable` | {boolean} | If false, the column cannot be hidden. When the personalization dialog is open the field will appear disabled.|\n|`hidden` | {boolean} | Excludes the column from being added to the DOM, it can be shown in the personalization dialog.|\n|`id` | {string} | The unique id of the column. Each column in the grid should have some unique id.|\n|`maxWidth` | {number} | The maximum width used to prevent resizing a column above this size. |\n|`minWidth` | {number} | The minimum width used to prevent resizing a column below this size. |\n|`name` | `{string}` or `Array<IdsDataGridHeaderTextName>` | The text to show on the header. For multiline header can take an object with text and an emphasis option. See Multi line header example. |\n|`headerOpacity` | `{boolean}` | If true, applies the grid-level `headerOpacityValue` to this column header. The column header and filter row will appear faded and non-interactive. Used to indicate design-mode readonly columns.|\n|`personalizable` | {boolean} | If false the column will not be included in the personalize options setting list. Default is true.|\n|`readonly` | {boolean or Function} | If true the cell will be set to readonly color, indicating no editing.|\n|`reorderable` | {boolean} | If true the column can be dragged into another position with adjacent columns. When completed a `columnmoved` event will fire. See the `columns-reorderable` example for a working example. This currently does not work with grouped columns. |\n|`resizable` | {boolean} | If false the column will not be resizable, thus is a fixed size and can never be changed by the user by dragging the left and right edge.  When completed a `columnresized` event will fire. See the `columns-resizable` example for a working example. |\n|`rowspan` | {boolean} | If true, enables automatic rowspan calculation for consecutive rows with identical values in this column.|\n|`showHeaderExpander` | {boolean} | If true, an expand/collapse icon will appear on the column's header.|\n|`sortable` | {boolean} | If false, the column cannot be sorted. When completed a `sorted` event will fire.|\n|`tooltip` | {string or Function} | Let you set the tooltip content. |\n|`tooltipCssPart` | {string or Function} | Allows you to set the name of a tooltip css part that can be used to customize the tooltip css. This can be a string or a function. See the columns-custom-css example.|\n|`tooltipOptions` | {Object or Function} | Allows you to set the tooltip options. See the tooltip example. |\n|`useValueForSizing` | {boolean} | When width is 'max-content', controls text measurement: true uses raw values, false (default) uses formatted values. |\n|`width` | {number or string} | Sets the width of the column. See the [Column Sizing](#column-sizing) section for details. |\n\n## Column Settings (Specific)\n\n|Setting|Type|Description|\n|---|---|---|\n|`href` | {string or Function} | Used to create the href for hyperlink formatters. This can be a string or a function that can work dynamically. It can also replace `{{value}}` with the current value. |\n|`selected` | {Function} | Fired when an item linked by a menuId is selected when attached to button formatters. |\n|`menuId` | {string} | Used on button formatters to link a menu to the button via a css selector |\n|`text` | {string} | Used to create the txt value for hyperlink formatters if a hard coded link text is needed. |\n|`disabled` | {boolean or Function} | Sets the cell contents to disabled, can also use a callback to determine this dynamically. Only checkboxes, radios, buttons and link columns can be disabled at this time. Selection columns require disabled rows in order to not be clickable/selectable. |\n|`uppercase` | {boolean} | Transforms all the text in the cell contents to uppercase. See also filterOptions and editorOptions |\n|`exportable` | {boolean} | If set to true the column will not be included in the `exportToExcel` export |\n|`exportFormatter` | {Function} | A function that will run during export that can be used to transform values for the `exportToExcel` export. For example `exportFormatter: (value) => (value === true ? 'In Stock' : 'Out of Stock'`) |\n|`color` | {string or Function} | Returns the color to use in tag, rating, slider, stepChart, badge, color, icon formatter and icon formatters, can be a function if dynamic is needed. |\n|`icon` | {string or Function} | Returns the icon to use in alert formatter and icon formatter, can be a function if dynamic is needed. |\n|`text` | {string or Function} | Returns extra inner text in some formatters. |\n| `hyperlinkBehavior` | {string} | Sets the behavior of the hyperlink. Can be `default` which it toggles the selection of the row, `none` does nothing--no selection or deselection of the row, `no-deselect` clicking the hyperlink will not deselect a selected row, or `no-select` clicking the hyperlink does not select the row, but if the row is already selected, it will be deselected. |\n|`whiteSpace` | {string} | Sets the CSS white-space property on the cells. Possible values: `normal` (default wrapping), `nowrap` (no wrapping, shows ellipsis), `pre` (preserves whitespace and line breaks), `pre-line` (preserves line breaks only), `pre-wrap` (preserves whitespace and wraps), `break-spaces` (like pre-wrap but breaks at any space). When set to `pre` or `pre-wrap`, tooltips will also preserve multiple spaces. |\n|`singleLine` | {boolean} | When set to `true`, converts multi-line text to a single line by replacing newline characters with spaces. This is useful for displaying data that may contain line breaks in a compact, single-line format. Works with the text formatter and applies to both cell content and tooltips. |\n\n## Formatters\n\n|Formatter|Description|\n|---|---|\n|`text` | (Default) Formats the column value as a direct text element using toString in the grid cell. Undefined or Null values will be shown as empty.|\n|`password` | Formats the column value masking the string length with stars. Undefined or Null values will be shown as empty. This is good for private data. |\n|`rowNumber` | Formats the cell with a row number column that is shown 1 to n no matter what the sort order is. Supports optional row indicator icons via the `rowIndicatorConfig` column property, which uses semantic type names (`current`, `new`, `modified`, `marked-for-deletion`, `error`, `drill`). See the Row Indicators section below for details. |\n|`date` | Formats date data as a date string in the desired format, by default it will use `dateStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`time` | Formats date data as a time string in the desired format, by default it will use `timeStyle: 'short'` for other options you can pass them in with `column.formatOptions` |\n|`decimal` | Formats number data as a decimal string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`integer` | Formats number data as a integer string in the specified locale. For additional options you can pass them in with `column.formatOptions`. |\n|`selectionCheckbox` | Displays a checkbox column for selection when using `rowSelection=\"mixed\"` or `rowSelection=\"multiple\"`|\n|`selectionRadio` | Displays a checkbox column for selection when using `rowSelection=\"single\"` |\n| `button` | Displays an `ids-button`. Other column settings like `type` can be used to set the button type as can `icon` by set for icon only buttons. Use the `click` setting/function to get an callback handler. |\n| `hyperlink` | Displays an `ids-hyperlink`. Other column settings like `href` can be used to set the link href and `text` can be used to set the text to specific text. Use the `click` setting/function to get an callback handler. |\n| `checkbox` | Displays an `ids-checkbox`. The value will be checked depending on if the attached field is true or `\"true\"`. |\n| `dragger` | Displays a drag-icon that allows user to drag the row up or down to reorder its position in the datagrid. |\n| `badge` | Displays an `ids-badge`. The associated field will be placed in the badge. The `color` option can also be set to set the ids-badge color setting. |\n| `alert` | Displays `ids-alert` element, and the field value will appear in a tooltip. An `icon` option can be provided as an override.|\n| `color` | Displays `ids-color` element. If a `color` option is provided as an override, the field's value will appear in a tooltip. |\n| `icon` | Displays the field value as an `ids-icon`. An `icon` option can be provided as an override, and the field value will appear beside this `icon` override. A `size` option can also be provided. |\n| `favorite` | Displays the field value as a `star-filled` if true or `star-outlined` if false. A `size` option can be provided as an override. |\n| `tag` | Displays the field value as an `ids-tag`. A `color` option can be provided as an override. |\n| `textmask` | Displays sensitive text with partial masking. Shows a toggle button that allows users to reveal or hide the full text. The number of visible characters can be controlled with the `textMaskCharacter` column option. |\n| `textarea` | Displays multiline text without rendering an actual textarea input. Line breaks in the data are converted to HTML `<br>` tags for proper display. Because this formatter will auto height the rows it will not work with virtual scroll. |\n| `progress` | Displays the field value as an `ids-progress`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `rating` | Displays the field value as an `ids-rating`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `slider` | Displays the field value as an `ids-slider`. A `text` option can be provided to customize the label. A `color`, `max`, `min` and `type` option can be provided as overrides. |\n| `stepChart` | Displays the field value as an `ids-step-chart`. A `text` option can be provided to customize the label. A `color` and `max` option can be provided as overrides. |\n| `image` | Displays the field value as an `ids-image`. A `text` option can be provided to the `alt` and `title` attributes. |\n| `formatOptions` | A series of options to pass to the formatter. For example, `formatOptions: { format: 'MM/dd/yyyy' }`. The actual options will vary by formatter. |\n\n### Date Format Examples\n\nThe date formatter supports the following options which the IdsLocal also support.\n\nTo format as a string, use the following format to use the [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat) API. Doing it this way will use the current locale.\n\n```js\nformatOptions: {\n  hour: 'numeric',\n  minute: 'numeric',\n  second: 'numeric',\n  fractionalSecondDigits: 3\n}\n```\n\nTo format as a specific format, you can also the `format` option. This will not use the current locale.\n\n```js\nformatOptions: {\n format: 'M/d/yyyy HH:mm:ss'\n}\n```\n\nLegacy names dateFormat and pattern are deprecated but supported.\n\n```js\nformatOptions: {\n dateFormat: 'M/d/yyyy HH:mm:ss'\n}\n\n// Or\nformatOptions: {\n pattern: 'M/d/yyyy HH:mm:ss'\n}\n```\n\n### Deprecated Formatters (Deprecated from 4.x)\n\n- `Input` No longer suggested to use, use simple list instead or a Text Formatter.\n- `Status, Color` No longer used, but badges can be used.\n- `Placeholder` Can now be set on the column and used with other formatters\n- `Ellipsis` Is now always enabled.\n- `Readonly` Can now be set on the column and used with other formatters\n- `Drilldown` Use button formatter with an icon.\n- `Template` is now deprecated for performance reasons, use a custom formatter now.\n- `ClassRange` Use column cssClass function or string\n- `Autocomplete, Lookup, TargetedAchievement, ProcessIndicator, Spinbox, Fileupload, Dropdown, Colorpicker, Tree, SummaryRow, GroupFooterRow, GroupRow, Expander, Editor, Textarea, Actions, RowReorder` May be added later\n\n## Custom Formatters\n\nIt is possible to create your own custom formatter. The idea behind the formatter is it takes the cell value and does processing on it to return the correct markup for the cell. The simplest custom formatter would be this example.\n\n```js\ncolumns.push({\n  id: 'custom',\n  name: 'Custom',\n  field: 'price',\n  formatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n    const value = `Custom: ${rowData[columnData.field] || '0'}`;\n    return `<span class=\"text-ellipsis\">${value}</span>`;\n  }\n});\n```\n\nTo style a custom formatter you may need to add a css part for the element. For example:\n\n```js\nformatter: (rowData: Record<string, unknown>, columnData: Record<string, any>) => {\n  const value = `${rowData[columnData.field] || ''}`;\n  return `<a part=\"custom-link\" href=\"#\" class=\"text-ellipsis\">${escapeHTML(value)}</a>`;\n},\n```\n\nThen in the style sheet your add you can add styling for the css part.\n\n```css\nids-data-grid::part(custom-link) {\n  color: #da1217;\n}\n\nids-data-grid::part(custom-link):hover {\n  color: #6c080b;\n}\n```\n\nThe formatter is then linked via the column on the formatter setting. When the grid cell is rendered the formatter function is called and the following arguments are passed in.\n\n- `rowData` The current row's data from the data array.\n- `columnData` The column object with all of the column configuration for this cell.\n\n## Events\n\n- `activecellchanged` Fires when the active cell changes with the keyboard or by click. Returns `elem` (the cell element), `activeCell` (current active cell object), `previousActiveCell` (previous active cell element), and `reason` (string: 'keyboard' | 'method' | 'internal').\n- `sorted` Fires when the sort column is changed.\n- `selectionchanged` Fires any time the selection changes.\n- `activationchanged` Fires any time the active row changes.\n- `beforerowselected` Fires before each row is selected. You can veto the selection by returning false in the event response for example `e.detail.response(false);`\n- `rowselected` Fires for each row that is selected.\n- `beforerowdeselected` Fires before each row is deselected. You can veto the deselection by returning false in the event response for example `e.detail.response(false);`\n- `rowdeselected` Fires for each row that is deselected.\n- `rowactivated` Fires for each row that is activated.\n- `rowdeactivated` Fires for each row that is deactivated.\n- `rowclick` Fires for each row that is clicked.\n- `rowreorder` Fires when a row is reordered via drag and drop.\n- `dblclick` Fires each time double clicked on body cells or header cells. Based on where it clicked details can be capture like `type: 'body-cell'|'header-title'|'header-filter'` etc.\n- `celldblclick` Fires each time a body cell is double clicked. Returns `cell` (the cell element), `columnId`, `columnIndex`, `rowIndex`, `rowData`, `columnData`, and `fieldData`.\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n- `columnresized` Fires when a column is resized or setColumnWidth is called.\n- `beforecolumnresized` Fires before a column is resized. You can veto the resize by returning false in the event response.\n- `aftercolumnresized` Fires after a column is resized.\n- `columnmoved` Fires when a column is moved / reordered or moveColumn is called\n- `columnhidden` Fires when a column is hidden via the `setColumnVisible` API\n- `columnshown` Fires when a column is shown again via the `setColumnVisible` API\n- `beforetooltipshow` Fires before tooltip show, you can return false in the response to veto\n- `beforemenushow` Fires before context menu show, you can return false in the response to veto.\n- `menushow` Fires after context menu show.\n- `menuselected` Fires after context menu item selected.\n- `rowExpanded` Fires when a tree or expandable row is expanded\n- `rowCollapsed` Fires when a tree or expandable row is collapsed\n- `beforecelledit` Fires before a cell is being edited (before edit is started). Can be vetoed by returning false.\n- `celledit` Fires when a cell enters edit mode.\n- `endcelledit` Fires when cell editing ends.\n- `cancelcelledit` Fires when cell editing is cancelled.\n- `settingschanged` Fires after settings are changed in some way.\n- `scrollstart` Fires when data-grid reaches the topmost\n\n### beforerowappend Usage Example\n\nWhen `addNewAtEnd` is enabled, the grid automatically creates a new row when the user tabs past the last editable cell. The `beforerowappend` event fires before the row is created, allowing you to control whether and how the row is added. The `response()` callback supports both synchronous and asynchronous patterns.\n\n```js\nconst dataGrid = document.querySelector('#my-data-grid');\n\n// Prevent client-side row creation (e.g. server-side only)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(false);\n});\n\n// Allow default row creation\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(true);\n});\n\n// Provide custom data for the new row (synchronous)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response({\n    description: 'New Item',\n    book: 'Default Book',\n    price: 0\n  });\n});\n\n// Async: return a Promise (e.g. to fetch data from a server)\ndataGrid.addEventListener('beforerowappend', (e) => {\n  e.detail.response(\n    fetch('/api/new-row')\n      .then((res) => res.json())\n      .then((data) => data)       // resolve with custom data object\n      .catch(() => false)          // resolve with false to cancel on error\n  );\n});\n```\n\n### Row Indicators\n\nThe `rowNumber` formatter supports displaying an indicator icon to the left of the row number. This is useful for visually communicating row states such as new, modified, deleted, or error without relying on color alone.\n\nTo enable row indicators, configure the `rowIndicatorConfig` property on the `rowNumber` column. The `icon` column property should reference the field in your row data that stores the indicator type, and `rowIndicatorConfig` controls the indicator behavior and labels.\n\nThe following semantic indicator types are available via the `RowIndicatorTypes` enum:\n\n| Type | Value | Icon | Description |\n|------|-------|------|-------------|\n| `Current` | `'current'` | `play-filled` | Marks the currently active row |\n| `New` | `'new'` | `star-filled` | Indicates a newly added row |\n| `Modified` | `'modified'` | `diamond-filled` | Indicates an edited row |\n| `MarkedForDeletion` | `'marked-for-deletion'` | `rejected-solid` | Row is flagged for removal |\n| `Error` | `'error'` | `alert-alert` | Row has a validation error |\n| `Drill` | `'drill'` | `flag-filled` | Row is a drill-down target |\n\n#### Column Configuration\n\n```js\ncolumns.push({\n  id: 'rowNumber',\n  name: '#',\n  formatter: dataGrid.formatters.rowNumber,\n  icon: 'rowIndicator',\n  rowIndicatorConfig: {\n    activeRowIndicator: true,\n    indicatorField: 'rowIndicator',\n    iconLabel: {\n      new: 'New record',\n      modified: 'Modified',\n      'marked-for-deletion': 'Marked for deletion',\n      current: 'Current',\n      error: 'Error',\n      drill: 'Drill'\n    }\n  },\n  sortable: false,\n  readonly: true,\n  width: 90\n});\n```\n\nThe `rowIndicatorConfig` object accepts the following properties:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `indicatorField` | `string` | Name of the field in row data that holds the indicator type value |\n| `activeRowIndicator` | `boolean` | When `true`, shows a play icon at the end of the cell for the active row |\n| `iconLabel` | `Record<string, string>` | Map of indicator type values to accessible `aria-label` strings |\n\nYour row data should include the field referenced by `indicatorField` using the semantic type values:\n\n```json\n[\n  { \"rowIndicator\": \"new\", \"description\": \"New item\" },\n  { \"rowIndicator\": \"modified\", \"description\": \"Edited item\" },\n  { \"rowIndicator\": \"\", \"description\": \"No indicator\" }\n]\n```\n\nRows with an indicator value render an `ids-icon` with the `row-number-indicator` class. Rows without an indicator render a spacer element to keep row numbers aligned. The icon color is controlled by the `--ids-data-grid-row-indicator-color-icon` design token.\n\n#### Updating Row Indicators Programmatically\n\nUse `updateRowIndicator(rowIdx, indicator)` to programmatically update the indicator for a specific row. The second parameter is a `RowIndicatorSettings` object:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `rowIndicatorType` | `RowIndicatorTypes \\| '' \\| null` | The semantic indicator type to set, or empty string to clear |\n| `activeCell` | `boolean` | Whether to show the active row indicator icon |\n\n```js\n// Set a row as modified\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'modified'\n});\n\n// Set a row as new with active indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: 'new',\n  activeCell: true\n});\n\n// Clear the indicator\ndataGrid.updateRowIndicator(0, {\n  rowIndicatorType: ''\n});\n```\n\n## Methods\n\n- `setColumnWidth` Can be used to set the width of a column.\n- `setColumnHeaderOpacity(columnId, enable)` Toggles the header opacity state on a specific column without a full redraw. Pass `true` to dim the header or `false` to restore it to normal.\n- `setColumnHeaderText(columnId, text)` Can be used to quickly set the text of a column header.\n- `hideColumn(columnId)` Can be used to set the visibility of a column.\n- `showColumn(columnId)` Can be used to set the visibility of a column.\n- `setColumnVisible(columnId, visible)` Can be used to set the visibility of a column.\n- `setColumnReadonly(columnId, value)` Can be used to set a column as readonly or editable.\n- `setColumnDisabled(columnId, value)` Can be used to set a column as disabled or enabled.\n- `setColumnRequired(columnId, value)` Can be used to set a column as required or optional. When set to true, displays an asterisk (*) in the column header.\n- `setColumnValidation(columnId, validation)` Can be used to set validation rules on a column's editor. Pass a validation rule like 'required' or undefined to remove validation. When set to 'required', displays an asterisk (*) in the column header and enforces validation during editing.\n- `setActivateCell(cell, row)` Can be used to set focus of a cell.\n- `selectedRows` Lists the indexes of the currently selected rows.\n- `deSelectRow(index: number)` Deselects the row based on the index provided.\n- `selectRow(index: number)` Selects the row based on the index provided.\n- `saveSetting(setting: string)` Save the given setting to local storage.\n- `saveAllSettings` Save all user settings to local storage.\n- `savedSetting(setting: string)` Get saved given setting value from local storage.\n- `allSavedSettings` Get saved all user settings from local storage.\n- `clearSetting(setting: string, key?: string)` Clear the given saved setting from local storage.\n- `clearAllSettings(userKeys: unknown)` Clear saved all user settings from local storage.\n- `restoreSetting(setting: string, value?: unknown)` Restore the given saved setting from local storage.\n- `editFirstCell` Puts the first cell on the active row into edit mode.\n- `appendData(data: Record<string, unknown>)` Use this to add more data to the datagrid's existing dataset.  This will automatically render additional rows in the datagrid.\n- `addRow(data: Record<string, unknown>, index?: number)` Adds a new row at the specified index position. If no index is provided, the row is added at the end. Existing rows at and after the insertion point are shifted down.\n- `addRows(data: Array<Record<string, unknown>>, index?: number)` Adds multiple new rows starting at the specified index position. If no index is provided, rows are added at the end. Each row is inserted sequentially (index, index+1, index+2, etc.).\n- `removeRow(index: number)` Removed the provided row index from the dataset and visual datagrid\n- `clearRow(index: number)` Clears all values on the given row.\n- `commitCellEdit` Stops editing and commits the value in the active editor.\n- `cancelCellEdit` Stops editing and reverts the value in the active editor.\n- `resetDirtyCells` Clears all dirty cell indicators.\n- `dirtyCells` Gives a list of all currently dirty cells.\n- `exportToExcel(format: 'csv' | 'xlsx', filename: string, options?: { keepGridFormatting?: boolean, useCurrentFilter?: boolean })` Export datagrid data source to an excel file. Options include keepGridFormatting (default: true) to preserve grid formatting, and useCurrentFilter (default: true) to export only filtered data.\n- `collapseAll(triggerAllRowsEvent: boolean, triggerRowEvent: boolean)` Collapse all expandable or tree rows. Argument `triggerAllRowsEvent` defaults to true, when enabled `rowcollapsed` triggered with once with `allRows` detail param. Argument `triggerRowEvent` defaults to false, when enabled each individual collapsed row event will be triggered\n- `expandAll()` Expand all expandable or tree rows.\n- `toggleAll(opt: boolean)` Toggle collapse/expand all expandable or tree rows. `opt false`: will expand all, `opt: true`: will collapse all\n- `refreshRow` IdsDataGridRow method to refresh row element and its cells.\n- `refreshCell` IdsDataGridCell method to refresh cell element\n- `updateDataset(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row.\n- `updateDatasetAndRefresh(row: number, data: Record<string, unknonw>, isClear?: boolean)` Updates datasource for row and refreshes row/cells UI.\n- `updateData(value: string, refresh = true)` IdsDataGridCell method to update datasource on a specific cell.\n- `rowByIndex(rowIndex: number)` method to retrieve a specific row datagrid.\n- `updateRowIndicator(rowIdx: number, indicator: RowIndicatorSettings)` Updates the row indicator in the `rowNumber` column for the given row index. The `indicator` object accepts `rowIndicatorType` (a `RowIndicatorTypes` value or empty string to clear) and `activeCell` (boolean for active row icon). Only refreshes the affected cell, not the entire row.\n- `cellByIndex(rowIndex: number, columnIndex: number)` method to retrieve a specific cell from datagrid.\n- `cellByIndex(columnIndex: number)` IdsDataGridRow method to retrieve a specific cell from row.\n- `loadingIndicator.start() / loadingIndicator.stop()` The member `loadingIndicator` lets you get to the loading indictor in the data grid. Then you can start and stop it with `.start()/stop()`\n- `showPersonalizationDialog()` Show the dialog to select visible columns and reorder. The dialog can be customized by setting the `modalTemplate` property but by default will show you the available columns and let you drag and hide/show them as needed. In order to drag the column it should be `reorderable`. In order to hide/show the column it should be `hideable`\n- `applyFilter(conditions: Array<IdsDataGridFilterConditions>)` Apply given filter conditions to the data grid.\n- `clearFilter()` Clear all filter conditions.\n- `filterConditions` Get the current filter conditions (this is a getter not a method)\n- `closePopupFilters()` Manually closes any open filter-related popup elements (date pickers, dropdown menus) within the data grid.\n- `setRowState(rowIndex, stateName)` Sets the visual state of a row. Available states: 'row-new' (green), 'row-removed' (red), 'row-error' (red), 'row' (default).\n- `getDirtyCells()` Returns all dirty cells using `rowId` (from `datasource.primaryKey`) and `columnId` instead of positional indices. Each entry includes `rowId`, `columnId`, and `originalValue`. Requires `datasource.primaryKey` to be set.\n- `scrollRowIntoView(rowIndex: number, settings?: ScrollSettings)` Scrolls the given row into view (1-based, where 1 is the first row). Accepts an optional `settings` object with the following properties:\n  - `skipIfVisible` (boolean, default `false`) When true, skips scrolling if the row is already visible in the viewport.\n  - `blockOuterScroll` (boolean, default `false`) When true, uses `scrollTo` with a calculated top offset instead of `scrollIntoView`.\n- `setDirtyCells(dirtyCells)` Restores dirty cell states using `rowId` and `columnId`. Accepts an array of `{ rowId, columnId, originalValue }`. Applies dirty indicators to matching cells and updates are batched per row. Requires `datasource.primaryKey` to be set.\n- `getRowStates()` Returns all row states using `rowId` instead of indices. Each entry includes `rowId` and `stateName`. Requires `datasource.primaryKey` to be set.\n- `setRowStates(states)` Restores row states using `rowId`. Accepts an array of `{ rowId, stateName }`. Valid state names: `'row-new'`, `'row-warning'`, `'row-error'`, `'row-removed'`. Requires `datasource.primaryKey` to be set.\n\n## Filters\n\nData rows can be filter based on one or several criteria. Whole filter row can turned on/off by the api setting `filterable` and can be disabled by the api setting `filter-row-disabled`. The filter conditions can be applied thru the UI or programmatically. Each column can have its own filter type and turn on/off by columns setting.\n\n### Filter Columns Setting\n\nAll the filter settings can be passed thru columns data.\n\n|Setting|Type|Description|\n|---|---|---|\n|`filterType` | Function | Data grid built-in filter method, see the dedicated section below. |\n|`filterConditions` | Array | List of items to be use as operators in menu-button or options in dropdown. |\n|`filterFunction` | Function | User defined filter method, it must return a boolean. |\n|`filterOptions` | Object | Passes settings in for the filter component example: `label, placeholder, disabled, uppercase, maxlength` in addition to some more specific options. |\n|`filterOptions.customId` | String | Function | Allows you to pass in a fixed string for the input or trigger field id, can also take a function that passes in all the column info that you can use for processing. |\n|`filterOptions.browserAutocomplete` | String | Allows you to pass in the input browser-autocomplete attribute. |\n|`isChecked` | Function | User defined filter method, it must return a boolean. This method use along built-in `checkbox` only, when filter data value is not boolean type. |\n\n### Built-in Filter Methods\n\n|Method|Description|\n|---|---|\n|`text` | It filter as text comparison. Contains input and menu-button with list of default operators. |\n|`integer` | It filter as integer comparison. Contains input and menu-button with list of default operators. |\n|`decimal` | It filter as decimal comparison. Contains input and menu-button with list of default operators. |\n|`contents` | It filter as text comparison. Contains dropdown and auto generate list of items based on column data. |\n|`dropdown` | It filter as text comparison. Contains dropdown and must pass list of item by setting `filterConditions`. |\n|`checkbox` | It filter as boolean comparison. Contains menu-button with list of default operators. |\n|`date` | It filter as date comparison. Contains date-picker and menu-button with list of default operators. |\n|`time` | It filter as time comparison. Contains time-picker and menu-button with list of default operators. |\n\n### Custom Filter\n\nIf the built-in filters are not enough, creating a custom filter is an option. There are two parts you can create both parts custom or mix-match with built-in.\n\n1. `UI Only` In order to do custom UI part of filter, add as html markup thru a slot. It must use slot and column-id attributes for example: `<div slot=\"filter-n\" column-id=\"n\">...</div>` where n is the columnId same passed in the columns.\n1. `filterFunction` This is a user defined filter method which must return a boolean. It determines if a cell value should be considered as a valid filtered value.\n1. `disableClientFilter` This is an api setting to disable filter logic client side. It will set filter conditions and fire an event `filtered` which can listen for custom logic.\n\nThe entire list of filter conditions to select from:\n\n```js\nconst filterConditions = [\n  { value: 'contains', label: 'Contains', icon: 'filter-contains' },\n  { value: 'does-not-contain', label: 'Does Not Contain', icon: 'filter-does-not-contain' },\n  { value: 'equals', label: 'Equals', icon: 'filter-equals' },\n  { value: 'does-not-equal', label: 'Does Not Equal', icon: 'filter-does-not-equal' },\n  { value: 'is-empty', label: 'Is Empty', icon: 'filter-is-empty' },\n  { value: 'is-not-empty', label: 'Is Not Empty', icon: 'filter-is-not-empty' },\n  { value: 'ends-with', label: 'Ends With', icon: 'filter-end-with' },\n  { value: 'does-not-end-with', label: 'Does Not End With', icon: 'filter-does-not-end-with' },\n  { value: 'starts-with', label: 'Starts With', icon: 'filter-start-with' },\n  { value: 'does-not-start-with', label: 'Does Not Start With', icon: 'filter-does-not-start-with' },\n  { value: 'less-than', label: 'Less Than', icon: 'filter-less-than' },\n  { value: 'less-equals', label: 'Less Or Equals', icon: 'filter-less-equals' },\n  { value: 'greater-than', label: 'Greater Than', icon: 'filter-greater-than' },\n  { value: 'greater-equals', label: 'Greater Or Equals', icon: 'filter-greater-equals' },\n  { value: 'earlier-than', label: 'Earlier Than', icon: 'filter-less-than' },\n  { value: 'earlier-equals', label: 'Earlier Than Or Equals', icon: 'filter-less-equals' },\n  { value: 'later-than', label: 'Later Than', icon: 'filter-greater-than' },\n  { value: 'later-equals', label: 'Later Than Or Equals', icon: 'filter-greater-equals' },\n  { value: 'in-range', label: 'In Range', icon: 'filter-in-range' },\n  { value: 'selected-notselected', label: 'All', icon: 'filter-selected-notselected' },\n  { value: 'selected', label: 'Selected', icon: 'filter-selected' },\n  { value: 'not-selected', label: 'Not Selected', icon: 'filter-not-selected' }\n];\n```\n\n### Filter Code Examples\n\nBasic text filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nNo filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"false\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisabled filter row, will disabled all attached filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\" filter-row-disabled=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nHyperlink, integer, decimal, date and time filters\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'hyperlink',\n  name: 'Hyperlink',\n  field: 'description',\n  href: '#',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.hyperlink\n});\ncolumns.push({\n  id: 'integer',\n  name: 'Integer',\n  field: 'price',\n  filterType: dataGrid.filters.integer,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'decimal',\n  name: 'Decimal',\n  field: 'price',\n  filterType: dataGrid.filters.decimal,\n  formatter: dataGrid.formatters.decimal,\n  formatOptions: { locale: 'en-US' }\n});\ncolumns.push({\n  id: 'date',\n  name: 'Date',\n  field: 'publishDate',\n  filterType: dataGrid.filters.date,\n  formatter: dataGrid.formatters.date\n});\ncolumns.push({\n  id: 'time',\n  name: 'Time',\n  field: 'publishDate',\n  filterType: dataGrid.filters.time,\n  formatter: dataGrid.formatters.time\n});\n```\n\nSome filter options label, placeholder, disabled.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterOptions: {\n    label: 'Label text for description input',\n    placeholder: 'Placeholder text for description input',\n    disabled: true\n  }\n});\n```\n\nCustom operators items for menu-button.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'description',\n  name: 'Description',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text,\n  filterConditions: [{\n    value: 'contains',\n    label: 'Contains',\n    icon: 'filter-contains'\n  },\n  {\n    value: 'equals',\n    label: 'Equals',\n    icon: 'filter-equals',\n    selected: true\n  }]\n});\n```\n\nContents and dropdown type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'location',\n  name: 'Location',\n  field: 'location',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.contents,\n  filterOptions: {\n    notFilteredItem: { value: 'not-filtered', label: 'Not Filtered' }\n  }\n});\ncolumns.push({\n  id: 'useForEmployee',\n  name: 'NotFilterdItem (shown as blank)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\ncolumns.push({\n  id: 'useForEmployeeCustomNotFilterdItem',\n  name: 'NotFilterdItem (show as custom text)',\n  field: 'useForEmployee',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.dropdown,\n  filterConditions: [\n    { value: 'not-filtered', label: 'Not Filtered' },\n    { value: 'Yes', label: 'Yes' },\n    { value: 'No', label: 'No' }\n  ]\n});\n```\n\nCheckbox type filters.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'checkbox',\n  name: 'Checkbox',\n  field: 'inStock',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox\n});\ncolumns.push({\n  id: 'customCheckMethod',\n  name: 'Custom check method',\n  field: 'active',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.checkbox,\n  isChecked: (value) => value === 'Yes'\n});\n```\n\nCustom filter method.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n</ids-data-grid>\n```\n\n```js\n// Custom filter checking\nconst myCustomFilter = (opt) => {\n  const { operator, columnId, value } = opt.condition;\n  const val = {\n    condition: Number.parseInt(value, 10),\n    data: Number.parseInt(opt.data[columnId], 10)\n  };\n  let isMatch = false;\n  if (Number.isNaN(val.condition) || Number.isNaN(val.data)) return isMatch;\n\n  if (operator === 'equals') isMatch = (val.data === val.condition);\n  if (operator === 'greater-than') isMatch = (val.data > val.condition);\n  if (operator === 'greater-equals') isMatch = (val.data >= val.condition);\n  if (operator === 'less-than') isMatch = (val.data < val.condition);\n  if (operator === 'less-equals') isMatch = (val.data <= val.condition);\n\n  return isMatch;\n};\n\nconst columns = [];\ncolumns.push({\n  id: 'customFilterMethod',\n  name: 'Custom Filter Method',\n  field: 'price',\n  filterFunction: myCustomFilter,\n  formatter: dataGrid.formatters.integer,\n  formatOptions: { locale: 'en-US' }\n});\n```\n\nCustom filter UI part.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" filterable=\"true\">\n  <div slot=\"filter-description\" column-id=\"description\">\n    <ids-menu-button id=\"btn-filter-description\" icon=\"filter-greater-equals\" menu=\"menu-filter-description\" dropdown-icon>\n      <span class=\"audible\">Greater Than Or Equals</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"menu-filter-description\" target=\"#btn-filter-description\">\n      <ids-menu-group select=\"single\">\n        <ids-menu-item value=\"equals\" icon=\"filter-equals\">Equals</ids-menu-item>\n        <ids-menu-item value=\"greater-than\" icon=\"filter-greater-than\">Greater Than</ids-menu-item>\n        <ids-menu-item value=\"greater-equals\" icon=\"filter-greater-equals\" selected=\"true\">Greater Than Or Equals</ids-menu-item>\n        <ids-menu-item value=\"less-than\" icon=\"filter-less-than\">Less Than</ids-menu-item>\n        <ids-menu-item value=\"less-equals\" icon=\"filter-less-equals\">Less Than Or Equals</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n    <ids-input id=\"input-filter-description\" type=\"text\" size=\"full\" placeholder=\"Slotted description\" label=\"Slotted description input\">\n    </ids-input>\n  </div>\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n```\n\nDisable client filter\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" disable-client-filter=\"true\">\n</ids-data-grid>\n```\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  formatter: dataGrid.formatters.text,\n  filterType: dataGrid.filters.text\n});\n\ndataGrid.addEventListener('filtered', (e: any) => {\n  console.info('filtered:', e.detail);\n});\n```\n\n### Filter rows programmatically\n\n```js\n// Filter rows\nconst conditions = [{ columnId: 'description', operator: 'contains', value: '5' }];\ndataGrid.applyFilter(conditions);\n\n// Reset all filters\ndataGrid.applyFilter([]);\n\n// or\ndataGrid.clearFilter();\n\n// save and restore filter\nconst oldFilters = dataGrid.filterConditions();\ndataGrid.data = NEW_DATA;\ndataGrid.pageTotal = NEW_DATA.length;\ndataGrid.applyFilter(oldFilters);\n```\n\n### Filter Events\n\nThe following events are relevant to data-grid filters.\n\n- `filtered` Fires after a filter action occurs, clear or apply filter condition.\n- `filteroperatorchanged` Fires once a filter operator changed.\n- `filterrowopened` Fires after the filter row is opened by the user.\n- `filterrowclosed` Fires after the filter row is closed by the user.\n\n## Custom cell colors\n\nIn some cases, it may be desirable to customize the background color of cells.  This can be done with the `cssPart` column setting:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell'\n});\n```\n\nThe `cssPart` property is translated into a `part` attribute that is applied to every cell in the column.  In the event the color needs to be conditional based on the row index or other logic, a function can be used:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2')\n  // ...\n});\n```\n\nAfter this is defined, accompanying CSS can be written to target the parts `custom-cell`, `custom-cell-1`, and `custom-cell-2` to change background color or other CSS properties of the cell:\n\n```css\nids-data-grid::part(cell) {\n  background-color: #ebf9f1;\n}\n\nids-data-grid::part(cell-selected) {\n  background-color: #c9dad0;\n}\n```\n\n### Changing selected cell colors\n\nAnother column setting, `cellSelectedCssPart` can be used alongside `cssPart` to customize the selected color of the row in a similar way.  When using `mixed` selection, this color is also applied to activated rows:\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  cssPart: 'custom-cell',\n  cellSelectedCssPart: 'custom-cell-selected'\n});\n```\n\nThis column setting can also be a function, just like `cssPart`:\n\n```js\ncolumns.push({\n  // ...\n  cssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-1' : 'custom-cell-2'),\n  cellSelectedCssPart: (row: number) => ((row % 2 === 0) ? 'custom-cell-selected-1' : 'custom-cell-selected-2')\n  // ...\n});\n```\n\n## Tooltip Code Examples\n\nSet suppress tooltips to turn off.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\" suppress-tooltips>\n</ids-data-grid>\n```\n\nSet custom tooltip strings.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: 'This is a product Id',\n  headerTooltip: 'This is the product Id header title',\n  headerIconTooltip: 'This is product Id header icon',\n  filterButtonTooltip: 'This is the product Id filterButton'\n});\n```\n\nSet tooltip as callback.\n\n```js\nconst tooltipCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return `Text: ${text}<br/>Header Row: ${rowIndex}, Cell: ${columnIndex}`;\n  } else if (type === 'filter-button') {\n    return `Text: ${text}<br/>FilterButton Row: ${rowIndex}, Cell: ${columnIndex}`;\n  }\n  return `Text: ${text}<br/>for Row: ${rowIndex}, Cell: ${columnIndex}`;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltip: tooltipCallback\n});\n```\n\nSet tooltip custom options.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: {\n    placement: 'top',\n    headerPlacement: 'top',\n    headerIconPlacement: 'top',\n    filterButtonPlacement: 'bottom',\n    x: 0,\n    y: 10,\n    headerX: 0,\n    headerIconX: 0,\n    headerY: 10,\n    headerIconY: 10,\n    filterButtonX: 0,\n    filterButtonY: 22\n  }\n});\n```\n\nSet tooltip options as callback.\n\n```js\nconst tooltipOptionsCallback = (args: any): string => {\n  const { type, columnIndex, rowIndex, text } = args;\n\n  if (type === 'header-title') {\n    return { headerPlacement: 'top', headerX: 0, headerY: 10 };\n  } else if (type === 'header-icon') {\n    return { headerIconPlacement: 'top', headerIconX: 0, headerIconY: 10 };\n  } else if (type === 'filter-button') {\n    return { filterButtonPlacement: 'bottom', filterButtonX: 0, filterButtonY: 22 };\n  }\n  return { placement: 'top', x: 0, y: 10 };\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipOptions: tooltipOptionsCallback\n});\n```\n\nSet tooltip custom css.\n\n```js\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: 'custom-teal',\n  headerTooltipCssPart: 'custom-teal',\n  headerIconTooltipCssPart: 'custom-teal',\n  filterButtonTooltipCssPart: 'custom-teal'\n});\n```\n```css\n/* tooltip css part `custom-teal` */\nids-data-grid::part(custom-teal-tooltip-arrow-top)::after {\n  border-top-color: #2f8d8e;\n}\nids-data-grid::part(custom-teal-tooltip-popup) {\n  background-color: #2f8d8e;\n}\n```\n\nSet tooltip custom css as callback.\n\n```js\nconst tooltipCssPartCallback = (args: { type: string }): string => {\n  const { type } = args;\n  let cssPart = '';\n  // Set random css part each time, for `body-cell` tooltips\n  if (type === 'body-cell') {\n    const parts = ['blue', 'red'];\n    const randomIndex = Math.floor(Math.random() * parts.length);\n    cssPart = parts[randomIndex];\n  }\n  return cssPart;\n};\nconst columns = [];\ncolumns.push({\n  id: 'text',\n  name: 'Text',\n  field: 'description',\n  tooltipCssPart: tooltipCssPartCallback\n});\n```\n```css\n/* tooltip css part `blue` */\nids-data-grid::part(blue-tooltip-arrow-top)::after {\n  border-top-color: #0066d4;\n}\nids-data-grid::part(blue-tooltip-popup) {\n  background-color: #0066d4;\n}\n\n/* tooltip css part `red` */\nids-data-grid::part(red-tooltip-arrow-top)::after {\n  border-top-color: #c31014;\n}\nids-data-grid::part(red-tooltip-popup) {\n  background-color: #c31014;\n}\n```\n\n## Context Menu Code Examples\n\nThe context menus can be set via the dataset.\n\n### Context Menu Settings\n\n- `originalEvent` {MouseEvent} Available in the `beforemenushow` event at `e.detail.data.originalEvent`, providing access to the native browser MouseEvent. This allows you to get mouse coordinates (clientX, clientY) for custom menu positioning or control event propagation with stopPropagation() and preventDefault().\n\n```js\n// Access originalEvent in beforemenushow event\nconst dataGrid = document.querySelector('#data-grid-1');\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  const { originalEvent } = e.detail.data;\n  console.log('Mouse coordinates:', originalEvent.clientX, originalEvent.clientY);\n\n  // Optional: Control event propagation\n  originalEvent.stopPropagation();\n  originalEvent.preventDefault();\n});\n```\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n</ids-data-grid>\n```\n```js\n// Dataset for header cells context menu\nconst headerMenuData = {\n  id: 'grid-header-context menu',\n  contents: [{\n    id: 'header-actions-group',\n    items: [\n      { id: 'actions-split', value: 'actions-split', text: 'Split' },\n      { id: 'actions-sort', value: 'actions-sort', text: 'Sort' },\n    ]\n  }],\n};\n\n// Dataset for body cells context menu\nconst menuData = {\n  id: 'grid-context menu',\n  contents: [{\n    id: 'actions-group',\n    items: [\n      { id: 'item-1', value: 'item-1', text: 'Item One' },\n      { id: 'item-2', value: 'item-2', text: 'Item Two' },\n      { id: 'item-3', value: 'item-3', text: 'Item Three' }\n    ]\n  }],\n};\n\n// Set context menu data with data-grid\ndataGrid.menuData = menuData;\ndataGrid.headerMenuData = headerMenuData;\n\n// Set to return true/false in the response to veto before context menu show.\ndataGrid.addEventListener('beforemenushow', (e: any) => {\n  console.info('before context menu show', e.detail);\n  // e.detail.response(false);\n});\n\n// Set to watch after context menu show.\ndataGrid.addEventListener('menushow', (e: any) => {\n  console.info('After context menu show', e.detail);\n});\n\n// Set to watch after context menu item selected.\ndataGrid.addEventListener('menuselected', (e: any) => {\n  console.info('context menu item selected', e.detail);\n});\n```\n\nSet context menu thru Slot.\n\n```html\n<ids-data-grid id=\"data-grid-1\" label=\"Books\">\n  <!-- context menu header cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"header-context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n      <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n  <!-- context menu body cells -->\n  <ids-popup-menu trigger-type=\"custom\" slot=\"context menu\">\n    <ids-menu-group>\n      <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n      <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n      <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n      <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n    </ids-menu-group>\n  </ids-popup-menu>\n</ids-data-grid>\n```\n\nSet context menu thru ID.\n\n```html\n<ids-data-grid\n  header-menu-id=\"grid-header-context menu\"\n  menu-id=\"grid-context menu\"\n  id=\"data-grid-1\"\n  label=\"Books\"\n></ids-data-grid>\n\n<!-- context menu header cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-header-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"header-split\">Split</ids-menu-item>\n    <ids-menu-item value=\"header-sort\">Sort</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n\n<!-- context menu body cells -->\n<ids-popup-menu trigger-type=\"custom\" id=\"grid-context menu\">\n  <ids-menu-group>\n    <ids-menu-item value=\"item-1\">Item One</ids-menu-item>\n    <ids-menu-item value=\"item-2\">Item Two</ids-menu-item>\n    <ids-menu-item value=\"item-3\">Item Three</ids-menu-item>\n    <ids-menu-item value=\"item-4\">Item Four</ids-menu-item>\n  </ids-menu-group>\n</ids-popup-menu>\n```\n\n### Actions Menu Button\n\nThe column settings `menuId` and `selected` callback can be used to construct an actions button with a menu for easy handling. An example column setup would be:\n\n```js\ncolumns.push({\n  id: 'more',\n  name: 'Actions',\n  formatter: dataGrid.formatters.button,\n  icon: 'more',\n  type: 'icon',\n  align: 'center',\n  text: 'Actions',\n  width: 56,\n  menuId: 'actions-menu',\n  selected: (data: Record<string, unknown>, col: IdsDataGridColumn, e: CustomEvent) => {\n    console.info(`Item \"${e.detail.elem.text}\" was selected (id \"${e.detail.elem.id}\")`);\n  }\n});\n```\n\nThen just add an `<ids-popup-menu id=\"actions-menu\"></ids-popup-menu>` with any structure you like to the page and it will open when pressing the button. When an item is selected the callback will fire for `selected`\n\n## Empty Message Code Examples\n\nSet empty message thru slot (markup).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-slot\" label=\"Books\">\n  <ids-empty-message hidden icon=\"empty-search-data-new\" slot=\"empty-message\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">No Data</ids-text>\n    <ids-text label=\"true\" slot=\"description\">There is No data available.</ids-text>\n  </ids-empty-message>\n</ids-data-grid>\n```\n\nSet empty message thru settings (markup).\n\n```html\n<ids-data-grid\n  id=\"data-grid-em-thru-settings\"\n  label=\"Books\"\n  empty-message-icon=\"empty-error-loading-new\"\n  empty-message-label=\"No Data\"\n  empty-message-description=\"There is No data available.\"\n></ids-data-grid>\n```\n\nSet empty message thru settings (javascript).\n\n```html\n<ids-data-grid id=\"data-grid-em-thru-settings-js\" label=\"Books\">\n</ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-em-thru-settings-js');\ndataGrid.emptyMessageIcon = 'empty-error-loading-new';\ndataGrid.emptyMessageLabel = 'No Data';\ndataGrid.emptyMessageDescription = 'There is No data available.';\n```\n\n## Row Height Code Examples\n\nAs mentioned in the settings section you can change the row height by setting the rowHeight option.\n\n```html\n     <ids-data-grid id=\"data-grid-row-height\" row-height=\"md\"></ids-data-grid>\n```\n\nIts worth mentioning the characteristics and usage for each one.\n\nLarge (`row-height=\"lg\"`) - Row Height is 50. The default row height, header is 16px and body cells are 16px. 16px padding on cells and header. You should use this most of the time if there is plenty of room on the UI and to avoid the UI looking crowded.\nMedium (`row-height=\"md\"`) - Row Height is 40. Header is 16px and body cells are 16px. 12px padding on cells and header. If you need to see a few more rows but still want to avoid a crowded UI, this is the next best option.\nSmall (`row-height=\"sm\"`) - Row Height is 35. Header is 16px and body cells are 16px. 8px padding on cells and header. This is the smallest option that is recommended for readability and spacing.\nExtra Small (`row-height=\"xs\"`) - Row Height is 30. Header is 14px and body cells are 14px. 8px padding on cells and header. If you need a very compressed data grid with a lot of data you can use this option. But there is a trade off of bad readability and spacing.\nExtra Extra Small (`row-height=\"xxs\"`) - Row Height is 25. Header is 14px and body cells are 14px. 2px padding on cells and header. Avoid this option as it is very crowded but it is included for edge cases.\n\n## Hyperlink Formatter with Dropdown Editor\n\nThe DataGrid supports combining hyperlink formatters with dropdown editors, allowing cells to display as clickable links while still being editable. This is useful for scenarios where you want to show linked data that can also be modified through a dropdown interface.\n\n### Basic Usage\n\n```javascript\nconst column = {\n  id: 'currency',\n  name: 'Currency',\n  field: 'currency',\n  formatter: dataGrid.formatters.hyperlink,\n  href: '#currency-details',\n  click: (rowData, column, event) => {\n    console.log('Currency link clicked:', rowData.currency);\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'USD', label: 'USD', value: 'USD' },\n        { id: 'EUR', label: 'EUR', value: 'EUR' },\n        { id: 'JPY', label: 'JPY', value: 'JPY' }\n      ]\n    }\n  }\n};\n```\n\n### Interaction Behavior\n\nThe combined hyperlink + dropdown editor provides intuitive interaction patterns:\n\n- **Normal click on hyperlink**: Follows the hyperlink (calls click handler or navigates to href)\n- **Double-click on cell**: Opens the dropdown editor for editing\n- **Click on cell area outside hyperlink**: Opens the dropdown editor for editing\n- **Keyboard navigation (Enter)**: Follows the hyperlink\n\n### CSS Styling\n\nCells with both hyperlink formatter and dropdown editor automatically receive the `has-editor-dropdown` CSS class, which ensures the hyperlink only takes the width of its content, allowing users to click in empty cell areas to trigger editing.\n\n### Example with Dynamic Links\n\n```javascript\nconst column = {\n  id: 'product',\n  name: 'Product',\n  field: 'productCode',\n  formatter: dataGrid.formatters.hyperlink,\n  href: (rowData) => `/products/${rowData.productCode}`,\n  click: (rowData, column, event) => {\n    // Handle hyperlink click\n    window.open(`/products/${rowData.productCode}`, '_blank');\n  },\n  editor: {\n    type: 'dropdown',\n    editorSettings: {\n      options: [\n        { id: 'PROD001', label: 'Product A', value: 'PROD001' },\n        { id: 'PROD002', label: 'Product B', value: 'PROD002' }\n      ]\n    }\n  }\n};\n```\n\n### Accessibility\n\nThe feature maintains full keyboard accessibility:\n\n- Tab navigation works normally\n- Enter key follows hyperlinks\n- Screen readers announce both the hyperlink and editable nature of the cell\n\n## Column Reordering Code Examples\n\nColumns can be reordered by setting the `reorderable` property to `true` on individual columns. You can also restrict which columns can be moved by setting the `firstDraggableColumn` property on the data grid.\n\n```html\n<ids-data-grid id=\"data-grid-reorderable\" first-draggable-column=\"1\"></ids-data-grid>\n```\n\n```js\nconst dataGrid = document.querySelector('#data-grid-reorderable');\n\n// Set programmatically\ndataGrid.firstDraggableColumn = 2;\n\n// Configure columns with reorderable property\ndataGrid.columns = [\n  {\n    id: 'selectionCheckbox',\n    name: 'Selection',\n    sortable: false,\n    resizable: false,\n    formatter: dataGrid.formatters.selectionCheckbox,\n    align: 'center'\n  },\n  {\n    id: 'rowNumber',\n    name: '#',\n    formatter: dataGrid.formatters.rowNumber,\n    sortable: false,\n    readonly: true,\n    width: 65\n  },\n  {\n    id: 'description',\n    name: 'Description',\n    field: 'description',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  },\n  {\n    id: 'ledger',\n    name: 'Ledger',\n    field: 'ledger',\n    sortable: true,\n    resizable: true,\n    reorderable: true, // This column can be reordered\n    formatter: dataGrid.formatters.text\n  }\n];\n```\n\nIn this example, columns 0 and 1 (Selection and Row Number) are fixed and cannot be reordered because `firstDraggableColumn` is set to 2. Only columns at index 2 and higher can be moved.\n\n## Multiline Header Code Examples\n\nAs mentioned in the settings columns section you can have a two line header in two variations. The first variation is simply to use it as a way to extend the text over two lines. To do this setup the column like the following examples.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'with long description' },\n],\n```\n\nThe second way to setup the text so the second line is de-emphasized a use case might be to show a unit or related info thats not part of the above name.\n\n```js\nname: [\n  { text: 'Product Name' },\n  { text: 'String', emphasis: 'subtle' },\n],\n```\n\nTechnically this is also possible but not sure if there is a use case.\n\n```js\nname: [\n  { text: 'Something subtle', emphasis: 'subtle' },\n  { text: 'Name', emphasis: 'subtle' },\n],\n```\n\n## Cascading Dropdown Examples\n\nTo use cascading dropdown for data grid, target column should have a setting like this. Note that the setting is called editor.editorSettings.source.\n\n```js\ncolumns.push({\n    id: 'bookCurrency',\n    name: 'Currency',\n    field: 'bookCurrency',\n    resizable: true,\n    reorderable: true,\n    formatter: dataGrid.formatters.dropdown,\n    editor: {\n      type: 'dropdown',\n      editorSettings: {\n        dirtyTracker: true,\n        typeahead: true,\n        validate: 'required',\n        source: cascadeOptions,\n        options: [\n          {\n            id: '',\n            label: '',\n            value: ''\n          },\n          {\n            id: 'USD',\n            label: 'USD',\n            value: 'USD'\n          },\n          {\n            id: 'EUR',\n            label: 'EUR',\n            value: 'EUR'\n          },\n          {\n            id: 'JPY',\n            label: 'JPY',\n            value: 'JPY'\n          }\n        ]\n      }\n    },\n  });\n```\n\nNeed also to define the callback of editor.editorSettings.source. In the example above, the method name is called cascadeOptions.\nIn this cascadeOptions, the cell will check the previous cell value for validation of what should be available only in the dropdown option list.\nThis method is customizable and can define any rules the developer wants.\n\n```js\nconst cascadeOptions = async () => {\n  const parentNode = document?.querySelector('ids-data-grid')?.shadowRoot?.querySelector('.is-editing')?.parentElement;\n  const targetIndex: string = parentNode?.getAttribute('data-index') || '0';\n  const targetData = dataGrid.data[parseInt(targetIndex)];\n  const checkCurrency = (el: any) => {\n    if (el.id === '' || el.id === 'USD') return true;\n    if (el.country === targetData.country) return true;\n\n    return false;\n  };\n\n  const newOptions: any[] = masterCurrencyList.filter(checkCurrency);\n  return newOptions;\n};\n```\n\n## States and Variations\n\n**Rows**\n- Hover\n- Selected\n- Disabled\n- Readonly\n- Activated\n\n**Columns**\n- Focus\n- Hover\n- Sorted\n- Selected\n- Disabled\n- Filtered\n\n**Cells**\n- Hover (sometimes a cursor change)\n- Readonly\n- Focus\n- Checked/Not Checked (Checkboxes)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>The initial tab enters the grid with focus on the first cell of the first row, often a header. A second tab moves out of the grid to the next tab stop on the page. Once focus is established in the grid, a TAB into or a Shift Tab into the grid will return to the cell which last had focus. If in edit mode will finish editing and start editing the next cell.\n- <kbd>Shift + Tab</kbd> Moves the reverse of tab. If in edit mode will finish editing and start editing the previous cell.\n- <kbd>Left</kbd> and <kbd>Right</kbd> Move focus to the adjacent column's cell. There is no wrap at the end or beginning of columns.\n- <kbd>Shift + Left</kbd> and <kbd>Shift + Right</kbd> When focused on a column header, resizes the column width by decreasing or increasing it.\n- <kbd>Up</kbd> and <kbd>Down</kbd> Move focus to the adjacent row's cell. There is no wrap at the first or last row.\n- <kbd>Home</kbd> moves focus to the first cell of the current row. Note that this is `Fn+Left Arrow` on mac.\n- <kbd>End</kbd> moves focus to the last cell of the current row. Note that this is `Fn+Right Arrow` on mac.\n- <kbd>Page Up</kbd> moves focus to the first cell in the current column. Note that this is `Fn+Up Arrow` on mac.\n- <kbd>Page Down</kbd> moves focus to the last cell in the current column. Note that this is `Fn+Done Arrow` on mac.\n- <kbd>Space</kbd> Toggles selection the activate row. If suppressRowDeselection is set it will be ignored on deselect. If the cell contains an expandable element then the row will toggle the expanded state. If the cell contains a checkbox editor, will toggle the checkbox state.\n- <kbd>F2</kbd> toggles actionable mode. Pressing the <kbd>Tab</kbd> key while in actionable mode moves focus to the next actionable cell. While in actionable mode you can do things like type + enter. This will move you down a row when you hit enter. If the cell has a control that uses down arrow (like the drop downs or lookups that are editable). Then the user needs to hit enter to enable the edit mode on that cell.\n- <kbd>Triple Click</kbd> Not a keyboard shortcut, but if you have text in a cell that is overflowed a triple click will select all the text even the part that is invisible.\n- <kbd>Ctrl+A (PC) / Cmd+A (Mac)</kbd> If the grid is mixed or multi select this will select all rows.\n- <kbd>Shift + Click or Up/Down</kbd> Selects a range of rows.\n- <kbd>Enter</kbd> Activates edit mode on the cell if it is editable. There is also an \"auto edit detection\". If the user starts typing then edit mode will happen automatically without enter. If in edit mode already <kbd>Enter</kbd> will finish edit mode. If `editNextOnEnterPress` is enabled then editing will start on the same column in next row.\n- <kbd>Shift + Enter</kbd> Same as enter but if `editNextOnEnterPress` is enabled then editing will start on the same column in previous row.\n- <kbd>F2</kbd> Finish editing same as Enter. But if `editNextOnEnterPress` is enabled, will stay in same cell. `cancelEditMode` will fire.\n- <kbd>CMD/CTRL + Enter</kbd> Finish editing same as Enter.\n- <kbd>ESC</kbd> Revert to the previous value and cancel editing. `cancelEditMode` will fire.\n\n## Responsive Guidelines\n\n- By default, data grid grows depending on the amount of contents within and will scroll if necessary under the header. It stops growing when it reaches the size of the parent container.\n- `autoFit` property or `auto-fit` attribute can be set manually to make the data grid size fill and be responsive to the size of the screen, regardless of the amount of contents.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Counts have all new markup and classes.\n\n**4.x to 5.x**\n- Data grid has all new markup and a custom element but some similarly named options\n- Still uses same columns and data set options. Some column options enhanced and changed.\n- If using events events are now plain JS events for example: sorted, rendered\n- Some Api Functions have changed\n- If using properties/settings these are now attributes or as plain properties for example: data, virtual-scroll\n- Markup has changed to a custom element `<ids-data-grid></ids-data-grid>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- `Drill Down` Formatter is now covered by `Button` formatter with `icon=\"drilldown\"`\n- `textOverflow` setting is now by default\n- `rowNavigation` setting has replaced `cellNavigation`. Cell navigation is the default behavior.\n- `stretchColumn` is now more flexible and can be achieved by setting a column width to `minmax(130px, 4fr)`. I.E. some min width and a `fr` unit equal to the remaining number of columns (or similar variations).\n- split columns are not supported anymore but could be done with a custom formatter if needed\n- `frozenColumns` setting is now set on each column by adding `frozen: 'left'` or `frozen: 'right'` to the column definition.\n- Some events are renamed see the events section for more details, also the signature of the events has changed.\n- Custom formatter functions can now be any type of function and have a different signature.\n- The `expanded` column option for tree was renamed to `rowExpanded`.\n- The `expandrow/collapserow` events are renamed to `rowexpanded/rowcollapsed`\n- The `beforeentereditmode/entereditmode/exiteditmode` event is renamed to `beforecelledit/celledit/endcelledit/cancelcelledit`\n- The `actionablemode` feature has been replaced with simply tabbing to the next editable field when in edit mode.\n\n## Accessibility Guidelines\n\n1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and links and images of text has a contrast ratio of at least 4.5:1.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n- A datagrid in general including this one uses the following aria tags\n  - `aria-label` labels the enter table on the main table\n  - `aria-rowcount` lists the visible row count on the main table\n  - `aria-colindex` the index of each column on the column elements\n  - `aria-rwindex` the index of each row on the row elements\n  - `aria-setsize` for tree grid lists the number of elements in each level (group)\n  - `aria-level` the level of indentation\n  - `aria-posinset` the depth into each set\n  - `aria-expanded` on the row it indicates if the row is expanded (for tree and expandable row)\n  - `aria-sort` indicates the sort direction on the sortable columns\n  - `aria-checked` indicates if the element is checked on checkbox columns and headers\n- When using the keyboard to resize the columns the pattern slightly follows the [window splitter pattern](https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/#example) but is simplified to only use shift + left and right arrows.\n\n## Regional Considerations\n\nTitles and labels should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## IdsDataGridFilterManager\n\nThe IdsDataGridFilterManager is a singleton class that provides centralized management of all active data grid filter instances across the application. It enables coordinated control of filter popups and lifecycle management for multiple data grids.\n\n## Code Separation (For Developers)\n\nThe code is divided into several files. Here is a description of where everything is.\n\n- `ids-data-grid-cell.ts` creates a non-shadow root `ids-data-grid-cell`, and handles its own selection, and activation.\n- `ids-data-grid-cell.scss` contains all css related to `.ids-data-grid-cell` and its children\n- `ids-data-grid-contextmenu.ts` contains code in the form of export functions, that adds ability to get right click menus on headers and cells\n- `ids-data-grid-filter.scss` contains all css related to the filter row and its children\n- `ids-data-grid-filter.ts` contains code to implement the filtering functionality and its ui (some functions are in ids-data-source)\n- `ids-data-grid-formatters.ts` contains all formatter functions and some supporting code like data extraction\n- `ids-data-grid-header.ts` contains most header functionality, the header template, and code related to header actions like sort, reorder and selection.\n- `ids-data-grid-header.scss` contains all css related to `.ids-data-grid-header` and its children\n- `ids-data-grid-row.ts` contains most row functionality, the row template, and code related to row actions like expand, collapse, select, activate\n- `ids-data-grid-row.scss` contains all css related to `.ids-data-grid-row` and its children\n- `ids-data-grid-tooltip-mixin.js` contains a tooltip mixin that adds tooltip functionality to cells and headers, its different from `ids-tooltip-mixin` (more specific)\n- `ids-data-grid.js` contains all main data grid code, the api and settings and the main generator loop for the data grid\n- `ids-data-grid-filter-manager.ts` singleton class that manages all active data grid filter instances globally\n\n### Column Resize Events\n\nThe data grid provides three events for complete control over the column resize lifecycle:\n\n#### `beforecolumnresized`\nFires before a column resize operation starts (mouse drag or keyboard). Can be vetoed to prevent the resize.\n\n```js\ndataGrid.addEventListener('beforecolumnresized', (e) => {\n  console.info('Before resize:', e.detail.column.name, e.detail.width);\n\n  // Prevent resize for specific columns\n  if (e.detail.column.id === 'locked-column') {\n    e.detail.response(false); // Veto the resize\n  }\n});\n```\n\n#### `columnresized`\nFires continuously during a column resize operation (mouse drag). Use for live updates.\n\n```js\ndataGrid.addEventListener('columnresized', (e) => {\n  console.info('Resizing:', e.detail.column.name, e.detail.column.width);\n});\n```\n\n#### `aftercolumnresized`\nFires once when a column resize operation completes (mouse release or keyboard). Ideal for saving column widths.\n\n```js\ndataGrid.addEventListener('aftercolumnresized', (e) => {\n  console.info('Resize complete:', e.detail.column.name);\n  console.info('Start width:', e.detail.startWidth, 'Final width:', e.detail.width);\n\n  // Save to localStorage or database\n  saveColumnWidth(e.detail.column.id, e.detail.width);\n});\n```\n\n**Event Details:**\n- `beforecolumnresized`: `{ column, width, response(veto) }`\n- `columnresized`: `{ index, column, columns }`\n- `aftercolumnresized`: `{ column, width, startWidth, columns }`\n\n**Keyboard Support:** All events work with Shift+Arrow keys for keyboard-based column resizing.\n"}},{"name":"ids-data-label","attributes":[{"name":"mask-type","description":"Gets the current mask type","values":[]},{"name":"text-mask-character","description":"Sets the number of characters to reveal in masked text","values":[]},{"name":"masked","description":"Gets whether the text is currently masked","values":[]},{"name":"data-text","description":"Gets the description text element from the container.","values":[]},{"name":"font-weight","description":"Get the font weight for the data text","values":[]},{"name":"label","description":"Gets the label text from the attribute","values":[]},{"name":"show-colon","description":"Gets whether a colon is shown after the label","values":[]},{"name":"label-text","description":"Creates the HTML for the label text element with colon","values":[]}],"description":{"kind":"markdown","value":"# ids-data-label\n\n## Description\n\nThe ids-data-label is used to show a label and value for non-editable content.\n\n## Feature (With the Code Examples)\n\nShows a data label with one top label and one with a left label.\n\n```html\n<ids-data-label label=\"Shipping to\" label-position=\"left\">Los Angeles, California 90001 USA</ids-data-label>\n<ids-data-label label=\"Shipping to\">Los Angeles, California 90001 USA</ids-data-label>\n```\n\nShows a data label that shows only data text without label\n```html\n<ids-data-label>Los Angeles, California 90001 USA</ids-data-label>\n```\n\n## Class Hierarchy\n\n- IdsDataLabel\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Settings (Attributes)\n\n- `label` {string} Set label string\n- `font-weight` {string} Set data text font-weight, 'lighter' | 'bold' | 'semi-bold'\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `text-mask-character` {number} Specifies the number of characters to display unmasked at the end of the text content. Maximum value is 4 characters.\n- `mask-type` {'button-mask' | 'masked-only' | 'icon-mask'} Controls how sensitive text is displayed and revealed. Use `button-mask` to show a button with both icon and label, `icon-mask` to show only an icon button, or `masked-only` to display masked text without any reveal option.\n"}},{"name":"ids-date-picker-common","description":{"kind":"markdown","value":"# ids-date-picker\n\n## Description\n\nThe date picker supports date entry with input attributes (value, label, placeholder, disabled, readonly) and validation. See more [usage details](https://design.infor.com/components/components/datepicker).\n\n## Settings (Attributes)\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `colorVariant` {string} Sets the current color variant.\n- `compact` {boolean} Sets the component to be compact mode.\n- `fieldHeight` {string} Defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `value` {string|null} - Input value\n- `placeholder` {true|false} - Whether or not to show date format as input placeholder\n- `label` {string|null} - Input label\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `overflow` {string} Sets the overflow behavior for text content. When set to 'ellipsis', text will be truncated with ellipsis when it overflows the container.\n- `id` {string} - Input ID\n- `disabled` {true|false} - Whether or not the input should be disabled. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `hidden` {boolean} Hides the element from display\n- `readonly` {true|false} - Whether or not the input should be readonly. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `size` {`xs`|`sm`|`mm`|`md`|`lg`|`full`} - Size (width) of the field. Default is `sm`\n- `validate` {'required'|'date'|'rangeDate'|string} - Input validation rules\n- `validation-events` {string} - Input validation events, `change blur` as default\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `format` {'locale'|string|null} - Input date format, if not set defaults to locale calendar date format. Examples: `yyyy-MM-dd`, `d/M/yyyy`, `dd/MM/yyyy`\n- `is-calendar-toolbar` {true|false} - Whether or not the component is used in calendar toolbar. Uses text instead of input\n- `month` `{string|number|null}` - Specifies a month for the popup calendar (`ids-month-view` attribute)\n- `day` `{string|number|null}` - Specifies a day for the popup calendar (`ids-month-view` attribute)\n- `year` `{string|number|null}` - Specifies a year for the popup calendar (`ids-month-view` attribute)\n- `first-day-of-week` `{string|number|null}` - Specifies first day of the week for the popup calendar, if not set the information comes from the locale (`ids-month-view` attribute)\n- `show-today` `{true|false}` - Whether or not to show the today button in the popup calendar (`ids-month-view` attribute)\n- `expanded` `{true|false}` - When the date picker is month/year picker it specifies whether or not the picker is expanded\n- `legend` - Set array of legend items:\n  - `name` `{string}` - The name of the legend (required)\n  - `color` `{string}` - The color of the legend, either hex or IDS variable excluding `--ids-color-` part i.e. `green-60` (required)\n  - `dates` `{Array}` - Array of dates (either dates or dayOfWeek is required)\n  - `dayOfWeek` `{Array}` - Array of days of week where 0 is Sunday (either dates or dayOfWeek is required)\n- `use-range` `{true|false}` - Whether or not the component should be a range picker. If set without settings default settings will apply.\n- `rangeSettings` `{Object}` - Range selection settings:\n  - `start` `{string}` - start date of the range selection. Default is `null` not set\n  - `end` `{string}` - end date of the range selection. Default is `null` not set\n  - `separator` `{string}` - separator symbol for the input value i.e. `2/7/2018 - 2/22/2018` if separator is ` - `. Default is ` - `\n  - `minDays` `{number}` - minimum number of days to select. Default is `0` not set\n  - `maxDays` `{number}` - maximum number of days to select. Default is `0` not set\n  - `selectForward` `{boolean}` - Whether or not the selection should be in forward direction. Default is `false`\n  - `selectBackward` `{boolean}` - Whether or not the selection should be in backward direction. Default is `false`\n  - `includeDisabled` `{boolean}` - Whether or not the selection should include disabled dates visually\n  - `selectWeek` `{boolean}` - Whether or not the selection should include the whole week\n  - `collapseSameDates` `{boolean}` - When start and end dates are the same, displays as single date (e.g., \"2/7/2018\") instead of range format (e.g., \"2/7/2018 - 2/7/2018\"). Default is `false`\n- `disableSettings` `{Object}` - Disable dates settings:\n  - `dates` `{Array}` - Disable specific dates (in a format that can be converted to a date)\n  - `years` `{Array}` - Disable specific years\n  - `minDate` `{string}` - Disable up to a minimum date\n  - `maxDate` `{string}` - Disable up to a maximum date\n  - `dayOfWeek` `{Array}` - Disable a specific of days of the week 0-6\n  - `isEnable` `{boolean}` - Enables the disabled dates. Default is false\n- `mask` `{string}` - Use input masking based on the `format` attribute to guide the input towards typing the date in the correct format. For example `mask=\"date\"` will allow only numbers and `/` character to be typed in the input field field if the format is `dd/MM/yyyy`\n- `minute-interval` {number} Set time picker minutes dropdown options interval\n- `second-interval` {number} Set time picker seconds dropdown options interval\n- `use-current-time` {true|false} - Set whether or not to show current time in the time picker dropdowns\n- `show-picklist-year` `{true|false}` Whether or not to show a list of years in the picklist, default if true\n- `show-picklist-month` `{true|false}` Whether or not to show a list of months in the picklist, default is true\n- `show-picklist-week` `{true|false}` Whether or not to show week numbers in the picklist\n- `show-apply` `{true|false}` Whether or not to show an apply button in the calendar popup. When enabled, date selection requires clicking the apply button to confirm. Keyboard navigation (arrow keys, Enter, Space) remains functional for selecting dates\n- `today-shortcut` `{true|false}` Set whether or not to enable t as a shortcut key in the datepicker\n- `tooltip` {string | Boolean} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the overflow=\"ellipsis\" and tooltip=\"true\". You can also provide custom tooltip text as a string.\n\n## Getters\n\n- `dateRange` - Returns an object containing `start` and `end` Date objects matching the field's current date-range\n\n## Methods\n\n- `open()` - opens calendar popup\n- `close()` - closes calendar popup\n\n## Events\n\n- `dayselected` - Fires when a day is selected or range selection is completed\n- `expanded` - Fires when a month/year picker is opened/closed\n- Event listeners for input (trigger field) `blur`, `change`, `focus`, `select`, `keydown`, `keypress`, `keyup`, `click`, `dbclick`, `beforetriggerclicked`, `triggerclicked` events can be added to `input` component property:\n\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\ndatePicker.input.addEventListener('change');\n```\n- Event listeners for popup `show`, `hide` events can be added to `popup` property:\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\ndatePicker.popup.addEventListener('show');\ndatePicker.popup.addEventListener('hide');\n```\n\n## Themeable Parts\n\n- `container` allows you to further style the container element of the component\n- `trigger-field` allows you to further style the trigger container\n- `trigger-button` allows you to further style the trigger button\n- `icon` allows you to further style the icon in the trigger button\n- `input` allows you to further style the input element\n- `popup` allows you to further style the popup element\n- `footer` - allows you to further style the popup footer\n- `btn-clear` - allows you to further style the clear button\n- `btn-apply ` - allows you to further style the apply button\n\n## Features (With Code Examples)\n\nWith no settings. Showing empty input field with no label or placeholder.\nCalendar popup highlights current date, the first day of week is based on the locale calendar.\n\n```html\n<ids-date-picker></ids-date-picker>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-date-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-date-picker>\n<ids-date-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-date-picker>\n```\n\nFor text overflow with automatic tooltips, use the `overflow` and `tooltip` attributes together:\n\n```html\n<ids-date-picker\n  id=\"date-overflow\"\n  label=\"Date with Ellipsis and Auto Tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  value=\"3/4/2016\"\n  size=\"xs\">\n</ids-date-picker>\n```\n\nWith date form field settings. Required. Validation triggers on the input value change. Not tabbable.\n\n```html\n<ids-date-picker\n  id=\"date-field\"\n  label=\"Date Field\"\n  value=\"3/4/2016\"\n  placeholder=\"M/d/yyyy\"\n  format=\"locale\"\n  validate=\"required\"\n  validation-events=\"change\"\n  size=\"lg\"\n  tabbable=\"false\"\n></ids-date-picker>\n```\n\nWhen used in calendar toolbar.\n\n```html\n<ids-date-picker\n  is-calendar-toolbar=\"true\"\n  year=\"2021\"\n  month=\"10\"\n  day=\"15\"\n  show-today=\"false\"\n  first-day-of-week=\"1\"\n></ids-date-picker>\n```\n\nEnable range selection with default settings.\n\n```html\n<ids-date-picker\n  use-range=\"true\"\n></ids-date-picker>\n```\n\nEnable range selection with single date display when start and end are the same.\n\n```html\n<ids-date-picker\n  id=\"datepicker-collapse\"\n  use-range=\"true\"\n  label=\"Range - Single date display (when same)\"\n></ids-date-picker>\n```\n\n```js\nconst datePicker = document.querySelector('#datepicker-collapse');\ndatePicker.rangeSettings = {\n  collapseSameDates: true\n};\n```\n\nThe component can be controlled dynamically\n\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\n// Set legend\ndatePicker.legend = [\n  {\n    name: 'Public Holiday',\n    color: 'green-60',\n    dates: ['12/31/2021', '12/24/2021', '1/1/2022'],\n  },\n  { name: 'Weekends', color: 'orange-60', dayOfWeek: [0, 6] },\n  {\n    name: 'Other',\n    color: 'red-30',\n    dates: ['1/8/2022', '1/9/2022', '1/23/2022'],\n  },\n  {\n    name: 'Half Days',\n    color: 'purple-60',\n    dates: ['1/21/2022', '1/22/2022'],\n  },\n  {\n    name: 'Full Days',\n    color: '#1677ee',\n    dates: ['1/24/2022', '1/25/2022'],\n  }\n];\n\n// Unset legend\ndatePicker.legend = null;\n\n// Enable range selection and set range settings\ndatePicker.useRange = true;\ndatePicker.rangeSettings = {\n  start: '12/24/2021',\n  end: '1/25/2022'\n};\n\n// Disable range selection\ndatePicker.useRange = false;\n\n// Add disabled dates\ndatePicker.disableSettings = {\n  dates: ['2/7/2018', '2/9/2018', '2/10/2018', '2/11/2018'],\n  dayOfWeek: [0, 6],\n  minDate: '2/6/2018',\n  maxDate: '2/12/2018',\n  years: [2017, 2018],\n  isEnable: true\n}\n```\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> - becomes active by tabbing into it, if autoselect is on the text is selected.\n- <kbd>Shift + Tab</kbd> reverses the direction of the tab order. Once in the widget, a <kbd>Shift + Tab</kbd> will take the user to the previous focusable element in the tab order\n- <kbd>Up</kbd> and <kbd>Down</kbd> goes to the same day of the week in the previous or next week respectively. If the user advances past the end of the month they continue into the next or previous month as appropriate\n- <kbd>Left</kbd> Go to the previous day. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Right</kbd> Advances to the next day. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Control + Page Up</kbd> moves to the same date in the previous year\n- <kbd>Control + Page Down</kbd> moves to the same date in the next year\n- <kbd>Space</kbd>, in singleton mode, acts as a toggle either selecting or de-selecting the date. In contiguous mode, it behaves similar to selecting a range of text: <kbd>Space</kbd> selects the first date. <kbd>Shift + Arrows</kbd> add to the selection. Pressing <kbd>Space</kbd> again de-selects the previous selections and selects the current focused date. In non-contiguous mode, <kbd>Space</kbd> may be used to select multiple non-contiguous dates\n- <kbd>Home</kbd> moves to the first day of the current month\n- <kbd>End</kbd> moves to the last day of the current month\n- <kbd>Page Up</kbd> moves to the same date in the previous month\n- <kbd>Page Down</kbd> moves to the same date in the next month\n- <kbd>Enter</kbd> submits the form\n- <kbd>Escape</kbd>, in the case of a popup date picker, closes the widget without any action\n- <kbd>T</kbd> inserts today's date. Except for cases where date format includes wide/abbreviated months\n- <kbd>+</kbd> Is used to increment the day in the calendar. This is in addition to the <kbd>Right</kbd>. This works both when in the input field or when the calendar picker is open. If the date pattern contains a `-` in it then this key interferes with typing so this key shortcut is disabled.\n- <kbd>-</kbd>  Is used to increment the day in the calendar. This is in addition to the <kbd>Left</kbd>. This works both when in the input field or when the calendar picker is open. If the date pattern contains a `-` in it then this key interferes with typing so this key shortcut is disabled.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- This is a new component for 4.x\n\n**4.x to 5.x**\n- Listeners for input and popup events should be added to references `input` and `popup` now. See Events section.\n- `disable/readonly/tabbable` are now attributes not methods\n- If using events, events are now plain JS events for example: change\n- Markup has changed to a custom element `<ids-date-picker></ids-date-picker>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- Instead of `onOpenCalendar` callback there are `show`, `hide` popup plain JS events and a date for calendar can be set as date picker `year`, `month`, `day` settings when calendar popup is opened\n- To use date picker with time picker `format` attribute should contain time i.e. `M/d/yyyy hh:mm a`\n- Added week numbers option to the calendar picklist\n"}},{"name":"ids-date-picker-popup","attributes":[{"name":"expandable-area","values":[]},{"name":"month-view","values":[]},{"name":"month-year-picklist","values":[]},{"name":"timepicker","values":[]},{"name":"toolbar","values":[]},{"name":"button-set","values":[]},{"name":"trigger-field-input","values":[]},{"name":"currently-selected-picklist","values":[]},{"name":"#is-processing-today-btn","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"buttons","values":[]},{"name":"show-today","description":"Set whether or not month view today button should be show","values":[]},{"name":"on-locale-change","values":[]},{"name":"popup-btn-group-el","values":[]},{"name":"apply-btn-el","values":[]},{"name":"cancel-btn-el","values":[]},{"name":"today-btn-el","values":[]},{"name":"expanded","description":"Set whether or not the month/year picker should be expanded","values":[]},{"name":"minute-interval","description":"Set interval in minutes dropdown","values":[]},{"name":"second-interval","description":"Set interval in seconds dropdown","values":[]},{"name":"show-clear","description":"Set whether or not to show clear button in the calendar popup","values":[]},{"name":"show-cancel","description":"Set whether or not to show cancel button when the picker is expanded","values":[]},{"name":"show-apply","description":"Set whether or not to show cancel button when the picker is expanded","values":[]},{"name":"show-picklist-year","description":"Whether or not to show a list of years in the picklist","values":[]},{"name":"show-picklist-month","description":"Whether or not to show a list of months in the picklist","values":[]},{"name":"show-picklist-week","description":"Whether or not to show week numbers in the picklist","values":[]},{"name":"use-current-time","description":"Set whether or not to show current time in the time picker","values":[]},{"name":"value","description":"Set Date Picker Popup's stored value. Should parse a date from the value.","values":[]},{"name":"position-style","values":[]},{"name":"show-week-numbers","values":[]}],"description":{"kind":"markdown","value":"# ids-date-picker\n\n## Description\n\nThe date picker supports date entry with input attributes (value, label, placeholder, disabled, readonly) and validation. See more [usage details](https://design.infor.com/components/components/datepicker).\n\n## Settings (Attributes)\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `colorVariant` {string} Sets the current color variant.\n- `compact` {boolean} Sets the component to be compact mode.\n- `fieldHeight` {string} Defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `value` {string|null} - Input value\n- `placeholder` {true|false} - Whether or not to show date format as input placeholder\n- `label` {string|null} - Input label\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `overflow` {string} Sets the overflow behavior for text content. When set to 'ellipsis', text will be truncated with ellipsis when it overflows the container.\n- `id` {string} - Input ID\n- `disabled` {true|false} - Whether or not the input should be disabled. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `hidden` {boolean} Hides the element from display\n- `readonly` {true|false} - Whether or not the input should be readonly. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `size` {`xs`|`sm`|`mm`|`md`|`lg`|`full`} - Size (width) of the field. Default is `sm`\n- `validate` {'required'|'date'|'rangeDate'|string} - Input validation rules\n- `validation-events` {string} - Input validation events, `change blur` as default\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `format` {'locale'|string|null} - Input date format, if not set defaults to locale calendar date format. Examples: `yyyy-MM-dd`, `d/M/yyyy`, `dd/MM/yyyy`\n- `is-calendar-toolbar` {true|false} - Whether or not the component is used in calendar toolbar. Uses text instead of input\n- `month` `{string|number|null}` - Specifies a month for the popup calendar (`ids-month-view` attribute)\n- `day` `{string|number|null}` - Specifies a day for the popup calendar (`ids-month-view` attribute)\n- `year` `{string|number|null}` - Specifies a year for the popup calendar (`ids-month-view` attribute)\n- `first-day-of-week` `{string|number|null}` - Specifies first day of the week for the popup calendar, if not set the information comes from the locale (`ids-month-view` attribute)\n- `show-today` `{true|false}` - Whether or not to show the today button in the popup calendar (`ids-month-view` attribute)\n- `expanded` `{true|false}` - When the date picker is month/year picker it specifies whether or not the picker is expanded\n- `legend` - Set array of legend items:\n  - `name` `{string}` - The name of the legend (required)\n  - `color` `{string}` - The color of the legend, either hex or IDS variable excluding `--ids-color-` part i.e. `green-60` (required)\n  - `dates` `{Array}` - Array of dates (either dates or dayOfWeek is required)\n  - `dayOfWeek` `{Array}` - Array of days of week where 0 is Sunday (either dates or dayOfWeek is required)\n- `use-range` `{true|false}` - Whether or not the component should be a range picker. If set without settings default settings will apply.\n- `rangeSettings` `{Object}` - Range selection settings:\n  - `start` `{string}` - start date of the range selection. Default is `null` not set\n  - `end` `{string}` - end date of the range selection. Default is `null` not set\n  - `separator` `{string}` - separator symbol for the input value i.e. `2/7/2018 - 2/22/2018` if separator is ` - `. Default is ` - `\n  - `minDays` `{number}` - minimum number of days to select. Default is `0` not set\n  - `maxDays` `{number}` - maximum number of days to select. Default is `0` not set\n  - `selectForward` `{boolean}` - Whether or not the selection should be in forward direction. Default is `false`\n  - `selectBackward` `{boolean}` - Whether or not the selection should be in backward direction. Default is `false`\n  - `includeDisabled` `{boolean}` - Whether or not the selection should include disabled dates visually\n  - `selectWeek` `{boolean}` - Whether or not the selection should include the whole week\n  - `collapseSameDates` `{boolean}` - When start and end dates are the same, displays as single date (e.g., \"2/7/2018\") instead of range format (e.g., \"2/7/2018 - 2/7/2018\"). Default is `false`\n- `disableSettings` `{Object}` - Disable dates settings:\n  - `dates` `{Array}` - Disable specific dates (in a format that can be converted to a date)\n  - `years` `{Array}` - Disable specific years\n  - `minDate` `{string}` - Disable up to a minimum date\n  - `maxDate` `{string}` - Disable up to a maximum date\n  - `dayOfWeek` `{Array}` - Disable a specific of days of the week 0-6\n  - `isEnable` `{boolean}` - Enables the disabled dates. Default is false\n- `mask` `{string}` - Use input masking based on the `format` attribute to guide the input towards typing the date in the correct format. For example `mask=\"date\"` will allow only numbers and `/` character to be typed in the input field field if the format is `dd/MM/yyyy`\n- `minute-interval` {number} Set time picker minutes dropdown options interval\n- `second-interval` {number} Set time picker seconds dropdown options interval\n- `use-current-time` {true|false} - Set whether or not to show current time in the time picker dropdowns\n- `show-picklist-year` `{true|false}` Whether or not to show a list of years in the picklist, default if true\n- `show-picklist-month` `{true|false}` Whether or not to show a list of months in the picklist, default is true\n- `show-picklist-week` `{true|false}` Whether or not to show week numbers in the picklist\n- `show-apply` `{true|false}` Whether or not to show an apply button in the calendar popup. When enabled, date selection requires clicking the apply button to confirm. Keyboard navigation (arrow keys, Enter, Space) remains functional for selecting dates\n- `today-shortcut` `{true|false}` Set whether or not to enable t as a shortcut key in the datepicker\n- `tooltip` {string | Boolean} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the overflow=\"ellipsis\" and tooltip=\"true\". You can also provide custom tooltip text as a string.\n\n## Getters\n\n- `dateRange` - Returns an object containing `start` and `end` Date objects matching the field's current date-range\n\n## Methods\n\n- `open()` - opens calendar popup\n- `close()` - closes calendar popup\n\n## Events\n\n- `dayselected` - Fires when a day is selected or range selection is completed\n- `expanded` - Fires when a month/year picker is opened/closed\n- Event listeners for input (trigger field) `blur`, `change`, `focus`, `select`, `keydown`, `keypress`, `keyup`, `click`, `dbclick`, `beforetriggerclicked`, `triggerclicked` events can be added to `input` component property:\n\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\ndatePicker.input.addEventListener('change');\n```\n- Event listeners for popup `show`, `hide` events can be added to `popup` property:\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\ndatePicker.popup.addEventListener('show');\ndatePicker.popup.addEventListener('hide');\n```\n\n## Themeable Parts\n\n- `container` allows you to further style the container element of the component\n- `trigger-field` allows you to further style the trigger container\n- `trigger-button` allows you to further style the trigger button\n- `icon` allows you to further style the icon in the trigger button\n- `input` allows you to further style the input element\n- `popup` allows you to further style the popup element\n- `footer` - allows you to further style the popup footer\n- `btn-clear` - allows you to further style the clear button\n- `btn-apply ` - allows you to further style the apply button\n\n## Features (With Code Examples)\n\nWith no settings. Showing empty input field with no label or placeholder.\nCalendar popup highlights current date, the first day of week is based on the locale calendar.\n\n```html\n<ids-date-picker></ids-date-picker>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-date-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-date-picker>\n<ids-date-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-date-picker>\n```\n\nFor text overflow with automatic tooltips, use the `overflow` and `tooltip` attributes together:\n\n```html\n<ids-date-picker\n  id=\"date-overflow\"\n  label=\"Date with Ellipsis and Auto Tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  value=\"3/4/2016\"\n  size=\"xs\">\n</ids-date-picker>\n```\n\nWith date form field settings. Required. Validation triggers on the input value change. Not tabbable.\n\n```html\n<ids-date-picker\n  id=\"date-field\"\n  label=\"Date Field\"\n  value=\"3/4/2016\"\n  placeholder=\"M/d/yyyy\"\n  format=\"locale\"\n  validate=\"required\"\n  validation-events=\"change\"\n  size=\"lg\"\n  tabbable=\"false\"\n></ids-date-picker>\n```\n\nWhen used in calendar toolbar.\n\n```html\n<ids-date-picker\n  is-calendar-toolbar=\"true\"\n  year=\"2021\"\n  month=\"10\"\n  day=\"15\"\n  show-today=\"false\"\n  first-day-of-week=\"1\"\n></ids-date-picker>\n```\n\nEnable range selection with default settings.\n\n```html\n<ids-date-picker\n  use-range=\"true\"\n></ids-date-picker>\n```\n\nEnable range selection with single date display when start and end are the same.\n\n```html\n<ids-date-picker\n  id=\"datepicker-collapse\"\n  use-range=\"true\"\n  label=\"Range - Single date display (when same)\"\n></ids-date-picker>\n```\n\n```js\nconst datePicker = document.querySelector('#datepicker-collapse');\ndatePicker.rangeSettings = {\n  collapseSameDates: true\n};\n```\n\nThe component can be controlled dynamically\n\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\n// Set legend\ndatePicker.legend = [\n  {\n    name: 'Public Holiday',\n    color: 'green-60',\n    dates: ['12/31/2021', '12/24/2021', '1/1/2022'],\n  },\n  { name: 'Weekends', color: 'orange-60', dayOfWeek: [0, 6] },\n  {\n    name: 'Other',\n    color: 'red-30',\n    dates: ['1/8/2022', '1/9/2022', '1/23/2022'],\n  },\n  {\n    name: 'Half Days',\n    color: 'purple-60',\n    dates: ['1/21/2022', '1/22/2022'],\n  },\n  {\n    name: 'Full Days',\n    color: '#1677ee',\n    dates: ['1/24/2022', '1/25/2022'],\n  }\n];\n\n// Unset legend\ndatePicker.legend = null;\n\n// Enable range selection and set range settings\ndatePicker.useRange = true;\ndatePicker.rangeSettings = {\n  start: '12/24/2021',\n  end: '1/25/2022'\n};\n\n// Disable range selection\ndatePicker.useRange = false;\n\n// Add disabled dates\ndatePicker.disableSettings = {\n  dates: ['2/7/2018', '2/9/2018', '2/10/2018', '2/11/2018'],\n  dayOfWeek: [0, 6],\n  minDate: '2/6/2018',\n  maxDate: '2/12/2018',\n  years: [2017, 2018],\n  isEnable: true\n}\n```\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> - becomes active by tabbing into it, if autoselect is on the text is selected.\n- <kbd>Shift + Tab</kbd> reverses the direction of the tab order. Once in the widget, a <kbd>Shift + Tab</kbd> will take the user to the previous focusable element in the tab order\n- <kbd>Up</kbd> and <kbd>Down</kbd> goes to the same day of the week in the previous or next week respectively. If the user advances past the end of the month they continue into the next or previous month as appropriate\n- <kbd>Left</kbd> Go to the previous day. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Right</kbd> Advances to the next day. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Control + Page Up</kbd> moves to the same date in the previous year\n- <kbd>Control + Page Down</kbd> moves to the same date in the next year\n- <kbd>Space</kbd>, in singleton mode, acts as a toggle either selecting or de-selecting the date. In contiguous mode, it behaves similar to selecting a range of text: <kbd>Space</kbd> selects the first date. <kbd>Shift + Arrows</kbd> add to the selection. Pressing <kbd>Space</kbd> again de-selects the previous selections and selects the current focused date. In non-contiguous mode, <kbd>Space</kbd> may be used to select multiple non-contiguous dates\n- <kbd>Home</kbd> moves to the first day of the current month\n- <kbd>End</kbd> moves to the last day of the current month\n- <kbd>Page Up</kbd> moves to the same date in the previous month\n- <kbd>Page Down</kbd> moves to the same date in the next month\n- <kbd>Enter</kbd> submits the form\n- <kbd>Escape</kbd>, in the case of a popup date picker, closes the widget without any action\n- <kbd>T</kbd> inserts today's date. Except for cases where date format includes wide/abbreviated months\n- <kbd>+</kbd> Is used to increment the day in the calendar. This is in addition to the <kbd>Right</kbd>. This works both when in the input field or when the calendar picker is open. If the date pattern contains a `-` in it then this key interferes with typing so this key shortcut is disabled.\n- <kbd>-</kbd>  Is used to increment the day in the calendar. This is in addition to the <kbd>Left</kbd>. This works both when in the input field or when the calendar picker is open. If the date pattern contains a `-` in it then this key interferes with typing so this key shortcut is disabled.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- This is a new component for 4.x\n\n**4.x to 5.x**\n- Listeners for input and popup events should be added to references `input` and `popup` now. See Events section.\n- `disable/readonly/tabbable` are now attributes not methods\n- If using events, events are now plain JS events for example: change\n- Markup has changed to a custom element `<ids-date-picker></ids-date-picker>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- Instead of `onOpenCalendar` callback there are `show`, `hide` popup plain JS events and a date for calendar can be set as date picker `year`, `month`, `day` settings when calendar popup is opened\n- To use date picker with time picker `format` attribute should contain time i.e. `M/d/yyyy hh:mm a`\n- Added week numbers option to the calendar picklist\n"}},{"name":"ids-date-picker","attributes":[{"name":"#last-valid-range-value","values":[]},{"name":"#is-initializing","values":[]},{"name":"is-form-component","values":[]},{"name":"picker","values":[]},{"name":"trigger-button","values":[]},{"name":"trigger-field","values":[]},{"name":"color-variants","description":"List of available color variants for this component","values":[]},{"name":"popup","description":"Get reference to the IdsPopup component","values":[]},{"name":"on-locale-change","description":"Handle locale changes by updating format and settings","values":[]},{"name":"on-language-change","description":"Handle language changes by updating validation","values":[]},{"name":"date-range","description":"Get an object containing start and end Date objects matching the field's current date-range","values":[]},{"name":"has-focus","description":"Check if input, dropdown or the calendar toolbar has focus","values":[]},{"name":"value","description":"Set input value. Should parse a date from the value\nSet dropdown button text if the component is dropdown\nSet text if the component is used in calendar toolbar","values":[]},{"name":"utc-date-value","description":"Set utcDateValue for Date objects and ISO strings with UTC conversion","values":[]},{"name":"placeholder","description":"Set input placeholder","values":[]},{"name":"disabled","description":"Set trigger field disabled attribute","values":[]},{"name":"readonly","description":"Set trigger field readonly attribute","values":[]},{"name":"size","description":"Set the size (width) of input","values":[]},{"name":"tabbable","description":"Set trigger field tabbable attribute","values":[]},{"name":"validate","description":"Set trigger field/input validation","values":[]},{"name":"validation-events","description":"Set which input events to fire validation on","values":[]},{"name":"show-today","description":"Set whether or not month view today button should be show","values":[]},{"name":"margin-block-end","description":"Gets the margin-block-end token key","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"overflow","description":"Get the overflow behavior","values":[]},{"name":"tooltip","description":"Get the tooltip text or behavior","values":[]},{"name":"input","description":"Get reference to the IdsTriggerField","values":[]},{"name":"mask","description":"Enable/disable date mask for the input","values":[]},{"name":"minute-interval","description":"Set interval in minutes dropdown","values":[]},{"name":"second-interval","description":"Set interval in seconds dropdown","values":[]},{"name":"show-clear","description":"Set whether or not to show clear button in the calendar popup","values":[]},{"name":"show-cancel","description":"Set whether or not to show cancel button when the picker is expanded","values":[]},{"name":"show-apply","description":"Set whether or not to show cancel button when the picker is expanded","values":[]},{"name":"show-picklist-year","description":"Whether or not to show a list of years in the picklist","values":[]},{"name":"show-picklist-month","description":"Whether or not to show a list of months in the picklist","values":[]},{"name":"show-picklist-week","description":"Whether or not to show week numbers in the picklist","values":[]},{"name":"use-current-time","description":"Set whether or not to show current time in the time picker","values":[]},{"name":"show-week-numbers","description":"Get the show week numbers state","values":[]},{"name":"today-shortcut","description":"Get the today shortcut state","values":[]}],"description":{"kind":"markdown","value":"# ids-date-picker\n\n## Description\n\nThe date picker supports date entry with input attributes (value, label, placeholder, disabled, readonly) and validation. See more [usage details](https://design.infor.com/components/components/datepicker).\n\n## Settings (Attributes)\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `colorVariant` {string} Sets the current color variant.\n- `compact` {boolean} Sets the component to be compact mode.\n- `fieldHeight` {string} Defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `value` {string|null} - Input value\n- `placeholder` {true|false} - Whether or not to show date format as input placeholder\n- `label` {string|null} - Input label\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `overflow` {string} Sets the overflow behavior for text content. When set to 'ellipsis', text will be truncated with ellipsis when it overflows the container.\n- `id` {string} - Input ID\n- `disabled` {true|false} - Whether or not the input should be disabled. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `hidden` {boolean} Hides the element from display\n- `readonly` {true|false} - Whether or not the input should be readonly. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `size` {`xs`|`sm`|`mm`|`md`|`lg`|`full`} - Size (width) of the field. Default is `sm`\n- `validate` {'required'|'date'|'rangeDate'|string} - Input validation rules\n- `validation-events` {string} - Input validation events, `change blur` as default\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `format` {'locale'|string|null} - Input date format, if not set defaults to locale calendar date format. Examples: `yyyy-MM-dd`, `d/M/yyyy`, `dd/MM/yyyy`\n- `is-calendar-toolbar` {true|false} - Whether or not the component is used in calendar toolbar. Uses text instead of input\n- `month` `{string|number|null}` - Specifies a month for the popup calendar (`ids-month-view` attribute)\n- `day` `{string|number|null}` - Specifies a day for the popup calendar (`ids-month-view` attribute)\n- `year` `{string|number|null}` - Specifies a year for the popup calendar (`ids-month-view` attribute)\n- `first-day-of-week` `{string|number|null}` - Specifies first day of the week for the popup calendar, if not set the information comes from the locale (`ids-month-view` attribute)\n- `show-today` `{true|false}` - Whether or not to show the today button in the popup calendar (`ids-month-view` attribute)\n- `expanded` `{true|false}` - When the date picker is month/year picker it specifies whether or not the picker is expanded\n- `legend` - Set array of legend items:\n  - `name` `{string}` - The name of the legend (required)\n  - `color` `{string}` - The color of the legend, either hex or IDS variable excluding `--ids-color-` part i.e. `green-60` (required)\n  - `dates` `{Array}` - Array of dates (either dates or dayOfWeek is required)\n  - `dayOfWeek` `{Array}` - Array of days of week where 0 is Sunday (either dates or dayOfWeek is required)\n- `use-range` `{true|false}` - Whether or not the component should be a range picker. If set without settings default settings will apply.\n- `rangeSettings` `{Object}` - Range selection settings:\n  - `start` `{string}` - start date of the range selection. Default is `null` not set\n  - `end` `{string}` - end date of the range selection. Default is `null` not set\n  - `separator` `{string}` - separator symbol for the input value i.e. `2/7/2018 - 2/22/2018` if separator is ` - `. Default is ` - `\n  - `minDays` `{number}` - minimum number of days to select. Default is `0` not set\n  - `maxDays` `{number}` - maximum number of days to select. Default is `0` not set\n  - `selectForward` `{boolean}` - Whether or not the selection should be in forward direction. Default is `false`\n  - `selectBackward` `{boolean}` - Whether or not the selection should be in backward direction. Default is `false`\n  - `includeDisabled` `{boolean}` - Whether or not the selection should include disabled dates visually\n  - `selectWeek` `{boolean}` - Whether or not the selection should include the whole week\n  - `collapseSameDates` `{boolean}` - When start and end dates are the same, displays as single date (e.g., \"2/7/2018\") instead of range format (e.g., \"2/7/2018 - 2/7/2018\"). Default is `false`\n- `disableSettings` `{Object}` - Disable dates settings:\n  - `dates` `{Array}` - Disable specific dates (in a format that can be converted to a date)\n  - `years` `{Array}` - Disable specific years\n  - `minDate` `{string}` - Disable up to a minimum date\n  - `maxDate` `{string}` - Disable up to a maximum date\n  - `dayOfWeek` `{Array}` - Disable a specific of days of the week 0-6\n  - `isEnable` `{boolean}` - Enables the disabled dates. Default is false\n- `mask` `{string}` - Use input masking based on the `format` attribute to guide the input towards typing the date in the correct format. For example `mask=\"date\"` will allow only numbers and `/` character to be typed in the input field field if the format is `dd/MM/yyyy`\n- `minute-interval` {number} Set time picker minutes dropdown options interval\n- `second-interval` {number} Set time picker seconds dropdown options interval\n- `use-current-time` {true|false} - Set whether or not to show current time in the time picker dropdowns\n- `show-picklist-year` `{true|false}` Whether or not to show a list of years in the picklist, default if true\n- `show-picklist-month` `{true|false}` Whether or not to show a list of months in the picklist, default is true\n- `show-picklist-week` `{true|false}` Whether or not to show week numbers in the picklist\n- `show-apply` `{true|false}` Whether or not to show an apply button in the calendar popup. When enabled, date selection requires clicking the apply button to confirm. Keyboard navigation (arrow keys, Enter, Space) remains functional for selecting dates\n- `today-shortcut` `{true|false}` Set whether or not to enable t as a shortcut key in the datepicker\n- `tooltip` {string | Boolean} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the overflow=\"ellipsis\" and tooltip=\"true\". You can also provide custom tooltip text as a string.\n\n## Getters\n\n- `dateRange` - Returns an object containing `start` and `end` Date objects matching the field's current date-range\n\n## Methods\n\n- `open()` - opens calendar popup\n- `close()` - closes calendar popup\n\n## Events\n\n- `dayselected` - Fires when a day is selected or range selection is completed\n- `expanded` - Fires when a month/year picker is opened/closed\n- Event listeners for input (trigger field) `blur`, `change`, `focus`, `select`, `keydown`, `keypress`, `keyup`, `click`, `dbclick`, `beforetriggerclicked`, `triggerclicked` events can be added to `input` component property:\n\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\ndatePicker.input.addEventListener('change');\n```\n- Event listeners for popup `show`, `hide` events can be added to `popup` property:\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\ndatePicker.popup.addEventListener('show');\ndatePicker.popup.addEventListener('hide');\n```\n\n## Themeable Parts\n\n- `container` allows you to further style the container element of the component\n- `trigger-field` allows you to further style the trigger container\n- `trigger-button` allows you to further style the trigger button\n- `icon` allows you to further style the icon in the trigger button\n- `input` allows you to further style the input element\n- `popup` allows you to further style the popup element\n- `footer` - allows you to further style the popup footer\n- `btn-clear` - allows you to further style the clear button\n- `btn-apply ` - allows you to further style the apply button\n\n## Features (With Code Examples)\n\nWith no settings. Showing empty input field with no label or placeholder.\nCalendar popup highlights current date, the first day of week is based on the locale calendar.\n\n```html\n<ids-date-picker></ids-date-picker>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-date-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-date-picker>\n<ids-date-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-date-picker>\n```\n\nFor text overflow with automatic tooltips, use the `overflow` and `tooltip` attributes together:\n\n```html\n<ids-date-picker\n  id=\"date-overflow\"\n  label=\"Date with Ellipsis and Auto Tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  value=\"3/4/2016\"\n  size=\"xs\">\n</ids-date-picker>\n```\n\nWith date form field settings. Required. Validation triggers on the input value change. Not tabbable.\n\n```html\n<ids-date-picker\n  id=\"date-field\"\n  label=\"Date Field\"\n  value=\"3/4/2016\"\n  placeholder=\"M/d/yyyy\"\n  format=\"locale\"\n  validate=\"required\"\n  validation-events=\"change\"\n  size=\"lg\"\n  tabbable=\"false\"\n></ids-date-picker>\n```\n\nWhen used in calendar toolbar.\n\n```html\n<ids-date-picker\n  is-calendar-toolbar=\"true\"\n  year=\"2021\"\n  month=\"10\"\n  day=\"15\"\n  show-today=\"false\"\n  first-day-of-week=\"1\"\n></ids-date-picker>\n```\n\nEnable range selection with default settings.\n\n```html\n<ids-date-picker\n  use-range=\"true\"\n></ids-date-picker>\n```\n\nEnable range selection with single date display when start and end are the same.\n\n```html\n<ids-date-picker\n  id=\"datepicker-collapse\"\n  use-range=\"true\"\n  label=\"Range - Single date display (when same)\"\n></ids-date-picker>\n```\n\n```js\nconst datePicker = document.querySelector('#datepicker-collapse');\ndatePicker.rangeSettings = {\n  collapseSameDates: true\n};\n```\n\nThe component can be controlled dynamically\n\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\n// Set legend\ndatePicker.legend = [\n  {\n    name: 'Public Holiday',\n    color: 'green-60',\n    dates: ['12/31/2021', '12/24/2021', '1/1/2022'],\n  },\n  { name: 'Weekends', color: 'orange-60', dayOfWeek: [0, 6] },\n  {\n    name: 'Other',\n    color: 'red-30',\n    dates: ['1/8/2022', '1/9/2022', '1/23/2022'],\n  },\n  {\n    name: 'Half Days',\n    color: 'purple-60',\n    dates: ['1/21/2022', '1/22/2022'],\n  },\n  {\n    name: 'Full Days',\n    color: '#1677ee',\n    dates: ['1/24/2022', '1/25/2022'],\n  }\n];\n\n// Unset legend\ndatePicker.legend = null;\n\n// Enable range selection and set range settings\ndatePicker.useRange = true;\ndatePicker.rangeSettings = {\n  start: '12/24/2021',\n  end: '1/25/2022'\n};\n\n// Disable range selection\ndatePicker.useRange = false;\n\n// Add disabled dates\ndatePicker.disableSettings = {\n  dates: ['2/7/2018', '2/9/2018', '2/10/2018', '2/11/2018'],\n  dayOfWeek: [0, 6],\n  minDate: '2/6/2018',\n  maxDate: '2/12/2018',\n  years: [2017, 2018],\n  isEnable: true\n}\n```\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> - becomes active by tabbing into it, if autoselect is on the text is selected.\n- <kbd>Shift + Tab</kbd> reverses the direction of the tab order. Once in the widget, a <kbd>Shift + Tab</kbd> will take the user to the previous focusable element in the tab order\n- <kbd>Up</kbd> and <kbd>Down</kbd> goes to the same day of the week in the previous or next week respectively. If the user advances past the end of the month they continue into the next or previous month as appropriate\n- <kbd>Left</kbd> Go to the previous day. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Right</kbd> Advances to the next day. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Control + Page Up</kbd> moves to the same date in the previous year\n- <kbd>Control + Page Down</kbd> moves to the same date in the next year\n- <kbd>Space</kbd>, in singleton mode, acts as a toggle either selecting or de-selecting the date. In contiguous mode, it behaves similar to selecting a range of text: <kbd>Space</kbd> selects the first date. <kbd>Shift + Arrows</kbd> add to the selection. Pressing <kbd>Space</kbd> again de-selects the previous selections and selects the current focused date. In non-contiguous mode, <kbd>Space</kbd> may be used to select multiple non-contiguous dates\n- <kbd>Home</kbd> moves to the first day of the current month\n- <kbd>End</kbd> moves to the last day of the current month\n- <kbd>Page Up</kbd> moves to the same date in the previous month\n- <kbd>Page Down</kbd> moves to the same date in the next month\n- <kbd>Enter</kbd> submits the form\n- <kbd>Escape</kbd>, in the case of a popup date picker, closes the widget without any action\n- <kbd>T</kbd> inserts today's date. Except for cases where date format includes wide/abbreviated months\n- <kbd>+</kbd> Is used to increment the day in the calendar. This is in addition to the <kbd>Right</kbd>. This works both when in the input field or when the calendar picker is open. If the date pattern contains a `-` in it then this key interferes with typing so this key shortcut is disabled.\n- <kbd>-</kbd>  Is used to increment the day in the calendar. This is in addition to the <kbd>Left</kbd>. This works both when in the input field or when the calendar picker is open. If the date pattern contains a `-` in it then this key interferes with typing so this key shortcut is disabled.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- This is a new component for 4.x\n\n**4.x to 5.x**\n- Listeners for input and popup events should be added to references `input` and `popup` now. See Events section.\n- `disable/readonly/tabbable` are now attributes not methods\n- If using events, events are now plain JS events for example: change\n- Markup has changed to a custom element `<ids-date-picker></ids-date-picker>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- Instead of `onOpenCalendar` callback there are `show`, `hide` popup plain JS events and a date for calendar can be set as date picker `year`, `month`, `day` settings when calendar popup is opened\n- To use date picker with time picker `format` attribute should contain time i.e. `M/d/yyyy hh:mm a`\n- Added week numbers option to the calendar picklist\n"}},{"name":"ids-month-year-picklist","attributes":[{"name":"disabled","description":"Set trigger field disabled attribute","values":[]},{"name":"show-picklist-year","description":"Whether or not to show a list of years in the picklist","values":[]},{"name":"show-picklist-month","description":"Whether or not to show a list of months in the picklist","values":[]},{"name":"show-picklist-week","description":"Whether or not to show week numbers in the picklist","values":[]},{"name":"on-locale-change","description":"Handle locale changes by refreshing picklist content","values":[]},{"name":"visible","description":"Set the visible state of the picklist","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-date-picker\n\n## Description\n\nThe date picker supports date entry with input attributes (value, label, placeholder, disabled, readonly) and validation. See more [usage details](https://design.infor.com/components/components/datepicker).\n\n## Settings (Attributes)\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `colorVariant` {string} Sets the current color variant.\n- `compact` {boolean} Sets the component to be compact mode.\n- `fieldHeight` {string} Defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `value` {string|null} - Input value\n- `placeholder` {true|false} - Whether or not to show date format as input placeholder\n- `label` {string|null} - Input label\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `overflow` {string} Sets the overflow behavior for text content. When set to 'ellipsis', text will be truncated with ellipsis when it overflows the container.\n- `id` {string} - Input ID\n- `disabled` {true|false} - Whether or not the input should be disabled. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `hidden` {boolean} Hides the element from display\n- `readonly` {true|false} - Whether or not the input should be readonly. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `size` {`xs`|`sm`|`mm`|`md`|`lg`|`full`} - Size (width) of the field. Default is `sm`\n- `validate` {'required'|'date'|'rangeDate'|string} - Input validation rules\n- `validation-events` {string} - Input validation events, `change blur` as default\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `format` {'locale'|string|null} - Input date format, if not set defaults to locale calendar date format. Examples: `yyyy-MM-dd`, `d/M/yyyy`, `dd/MM/yyyy`\n- `is-calendar-toolbar` {true|false} - Whether or not the component is used in calendar toolbar. Uses text instead of input\n- `month` `{string|number|null}` - Specifies a month for the popup calendar (`ids-month-view` attribute)\n- `day` `{string|number|null}` - Specifies a day for the popup calendar (`ids-month-view` attribute)\n- `year` `{string|number|null}` - Specifies a year for the popup calendar (`ids-month-view` attribute)\n- `first-day-of-week` `{string|number|null}` - Specifies first day of the week for the popup calendar, if not set the information comes from the locale (`ids-month-view` attribute)\n- `show-today` `{true|false}` - Whether or not to show the today button in the popup calendar (`ids-month-view` attribute)\n- `expanded` `{true|false}` - When the date picker is month/year picker it specifies whether or not the picker is expanded\n- `legend` - Set array of legend items:\n  - `name` `{string}` - The name of the legend (required)\n  - `color` `{string}` - The color of the legend, either hex or IDS variable excluding `--ids-color-` part i.e. `green-60` (required)\n  - `dates` `{Array}` - Array of dates (either dates or dayOfWeek is required)\n  - `dayOfWeek` `{Array}` - Array of days of week where 0 is Sunday (either dates or dayOfWeek is required)\n- `use-range` `{true|false}` - Whether or not the component should be a range picker. If set without settings default settings will apply.\n- `rangeSettings` `{Object}` - Range selection settings:\n  - `start` `{string}` - start date of the range selection. Default is `null` not set\n  - `end` `{string}` - end date of the range selection. Default is `null` not set\n  - `separator` `{string}` - separator symbol for the input value i.e. `2/7/2018 - 2/22/2018` if separator is ` - `. Default is ` - `\n  - `minDays` `{number}` - minimum number of days to select. Default is `0` not set\n  - `maxDays` `{number}` - maximum number of days to select. Default is `0` not set\n  - `selectForward` `{boolean}` - Whether or not the selection should be in forward direction. Default is `false`\n  - `selectBackward` `{boolean}` - Whether or not the selection should be in backward direction. Default is `false`\n  - `includeDisabled` `{boolean}` - Whether or not the selection should include disabled dates visually\n  - `selectWeek` `{boolean}` - Whether or not the selection should include the whole week\n  - `collapseSameDates` `{boolean}` - When start and end dates are the same, displays as single date (e.g., \"2/7/2018\") instead of range format (e.g., \"2/7/2018 - 2/7/2018\"). Default is `false`\n- `disableSettings` `{Object}` - Disable dates settings:\n  - `dates` `{Array}` - Disable specific dates (in a format that can be converted to a date)\n  - `years` `{Array}` - Disable specific years\n  - `minDate` `{string}` - Disable up to a minimum date\n  - `maxDate` `{string}` - Disable up to a maximum date\n  - `dayOfWeek` `{Array}` - Disable a specific of days of the week 0-6\n  - `isEnable` `{boolean}` - Enables the disabled dates. Default is false\n- `mask` `{string}` - Use input masking based on the `format` attribute to guide the input towards typing the date in the correct format. For example `mask=\"date\"` will allow only numbers and `/` character to be typed in the input field field if the format is `dd/MM/yyyy`\n- `minute-interval` {number} Set time picker minutes dropdown options interval\n- `second-interval` {number} Set time picker seconds dropdown options interval\n- `use-current-time` {true|false} - Set whether or not to show current time in the time picker dropdowns\n- `show-picklist-year` `{true|false}` Whether or not to show a list of years in the picklist, default if true\n- `show-picklist-month` `{true|false}` Whether or not to show a list of months in the picklist, default is true\n- `show-picklist-week` `{true|false}` Whether or not to show week numbers in the picklist\n- `show-apply` `{true|false}` Whether or not to show an apply button in the calendar popup. When enabled, date selection requires clicking the apply button to confirm. Keyboard navigation (arrow keys, Enter, Space) remains functional for selecting dates\n- `today-shortcut` `{true|false}` Set whether or not to enable t as a shortcut key in the datepicker\n- `tooltip` {string | Boolean} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the overflow=\"ellipsis\" and tooltip=\"true\". You can also provide custom tooltip text as a string.\n\n## Getters\n\n- `dateRange` - Returns an object containing `start` and `end` Date objects matching the field's current date-range\n\n## Methods\n\n- `open()` - opens calendar popup\n- `close()` - closes calendar popup\n\n## Events\n\n- `dayselected` - Fires when a day is selected or range selection is completed\n- `expanded` - Fires when a month/year picker is opened/closed\n- Event listeners for input (trigger field) `blur`, `change`, `focus`, `select`, `keydown`, `keypress`, `keyup`, `click`, `dbclick`, `beforetriggerclicked`, `triggerclicked` events can be added to `input` component property:\n\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\ndatePicker.input.addEventListener('change');\n```\n- Event listeners for popup `show`, `hide` events can be added to `popup` property:\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\ndatePicker.popup.addEventListener('show');\ndatePicker.popup.addEventListener('hide');\n```\n\n## Themeable Parts\n\n- `container` allows you to further style the container element of the component\n- `trigger-field` allows you to further style the trigger container\n- `trigger-button` allows you to further style the trigger button\n- `icon` allows you to further style the icon in the trigger button\n- `input` allows you to further style the input element\n- `popup` allows you to further style the popup element\n- `footer` - allows you to further style the popup footer\n- `btn-clear` - allows you to further style the clear button\n- `btn-apply ` - allows you to further style the apply button\n\n## Features (With Code Examples)\n\nWith no settings. Showing empty input field with no label or placeholder.\nCalendar popup highlights current date, the first day of week is based on the locale calendar.\n\n```html\n<ids-date-picker></ids-date-picker>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-date-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-date-picker>\n<ids-date-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-date-picker>\n```\n\nFor text overflow with automatic tooltips, use the `overflow` and `tooltip` attributes together:\n\n```html\n<ids-date-picker\n  id=\"date-overflow\"\n  label=\"Date with Ellipsis and Auto Tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  value=\"3/4/2016\"\n  size=\"xs\">\n</ids-date-picker>\n```\n\nWith date form field settings. Required. Validation triggers on the input value change. Not tabbable.\n\n```html\n<ids-date-picker\n  id=\"date-field\"\n  label=\"Date Field\"\n  value=\"3/4/2016\"\n  placeholder=\"M/d/yyyy\"\n  format=\"locale\"\n  validate=\"required\"\n  validation-events=\"change\"\n  size=\"lg\"\n  tabbable=\"false\"\n></ids-date-picker>\n```\n\nWhen used in calendar toolbar.\n\n```html\n<ids-date-picker\n  is-calendar-toolbar=\"true\"\n  year=\"2021\"\n  month=\"10\"\n  day=\"15\"\n  show-today=\"false\"\n  first-day-of-week=\"1\"\n></ids-date-picker>\n```\n\nEnable range selection with default settings.\n\n```html\n<ids-date-picker\n  use-range=\"true\"\n></ids-date-picker>\n```\n\nEnable range selection with single date display when start and end are the same.\n\n```html\n<ids-date-picker\n  id=\"datepicker-collapse\"\n  use-range=\"true\"\n  label=\"Range - Single date display (when same)\"\n></ids-date-picker>\n```\n\n```js\nconst datePicker = document.querySelector('#datepicker-collapse');\ndatePicker.rangeSettings = {\n  collapseSameDates: true\n};\n```\n\nThe component can be controlled dynamically\n\n```js\nconst datePicker = document.querySelector('ids-date-picker');\n\n// Set legend\ndatePicker.legend = [\n  {\n    name: 'Public Holiday',\n    color: 'green-60',\n    dates: ['12/31/2021', '12/24/2021', '1/1/2022'],\n  },\n  { name: 'Weekends', color: 'orange-60', dayOfWeek: [0, 6] },\n  {\n    name: 'Other',\n    color: 'red-30',\n    dates: ['1/8/2022', '1/9/2022', '1/23/2022'],\n  },\n  {\n    name: 'Half Days',\n    color: 'purple-60',\n    dates: ['1/21/2022', '1/22/2022'],\n  },\n  {\n    name: 'Full Days',\n    color: '#1677ee',\n    dates: ['1/24/2022', '1/25/2022'],\n  }\n];\n\n// Unset legend\ndatePicker.legend = null;\n\n// Enable range selection and set range settings\ndatePicker.useRange = true;\ndatePicker.rangeSettings = {\n  start: '12/24/2021',\n  end: '1/25/2022'\n};\n\n// Disable range selection\ndatePicker.useRange = false;\n\n// Add disabled dates\ndatePicker.disableSettings = {\n  dates: ['2/7/2018', '2/9/2018', '2/10/2018', '2/11/2018'],\n  dayOfWeek: [0, 6],\n  minDate: '2/6/2018',\n  maxDate: '2/12/2018',\n  years: [2017, 2018],\n  isEnable: true\n}\n```\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> - becomes active by tabbing into it, if autoselect is on the text is selected.\n- <kbd>Shift + Tab</kbd> reverses the direction of the tab order. Once in the widget, a <kbd>Shift + Tab</kbd> will take the user to the previous focusable element in the tab order\n- <kbd>Up</kbd> and <kbd>Down</kbd> goes to the same day of the week in the previous or next week respectively. If the user advances past the end of the month they continue into the next or previous month as appropriate\n- <kbd>Left</kbd> Go to the previous day. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Right</kbd> Advances to the next day. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Control + Page Up</kbd> moves to the same date in the previous year\n- <kbd>Control + Page Down</kbd> moves to the same date in the next year\n- <kbd>Space</kbd>, in singleton mode, acts as a toggle either selecting or de-selecting the date. In contiguous mode, it behaves similar to selecting a range of text: <kbd>Space</kbd> selects the first date. <kbd>Shift + Arrows</kbd> add to the selection. Pressing <kbd>Space</kbd> again de-selects the previous selections and selects the current focused date. In non-contiguous mode, <kbd>Space</kbd> may be used to select multiple non-contiguous dates\n- <kbd>Home</kbd> moves to the first day of the current month\n- <kbd>End</kbd> moves to the last day of the current month\n- <kbd>Page Up</kbd> moves to the same date in the previous month\n- <kbd>Page Down</kbd> moves to the same date in the next month\n- <kbd>Enter</kbd> submits the form\n- <kbd>Escape</kbd>, in the case of a popup date picker, closes the widget without any action\n- <kbd>T</kbd> inserts today's date. Except for cases where date format includes wide/abbreviated months\n- <kbd>+</kbd> Is used to increment the day in the calendar. This is in addition to the <kbd>Right</kbd>. This works both when in the input field or when the calendar picker is open. If the date pattern contains a `-` in it then this key interferes with typing so this key shortcut is disabled.\n- <kbd>-</kbd>  Is used to increment the day in the calendar. This is in addition to the <kbd>Left</kbd>. This works both when in the input field or when the calendar picker is open. If the date pattern contains a `-` in it then this key interferes with typing so this key shortcut is disabled.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- This is a new component for 4.x\n\n**4.x to 5.x**\n- Listeners for input and popup events should be added to references `input` and `popup` now. See Events section.\n- `disable/readonly/tabbable` are now attributes not methods\n- If using events, events are now plain JS events for example: change\n- Markup has changed to a custom element `<ids-date-picker></ids-date-picker>`\n- Can now be imported as a single JS file and used with encapsulated styles\n- Instead of `onOpenCalendar` callback there are `show`, `hide` popup plain JS events and a date for calendar can be set as date picker `year`, `month`, `day` settings when calendar popup is opened\n- To use date picker with time picker `format` attribute should contain time i.e. `M/d/yyyy hh:mm a`\n- Added week numbers option to the calendar picklist\n"}},{"name":"ids-draggable","attributes":[{"name":"#relative-bounds","values":[]},{"name":"axis","description":"Get the axis that the draggable content will be moving along","values":[]},{"name":"parent-containment","description":"Get whether the draggable should be limited in range by its parent element","values":[]},{"name":"position-style","description":"Get the current position style","values":[]},{"name":"disabled","description":"Get whether draggable functionality is disabled","values":[]},{"name":"handle","description":"Get the query selector for the optional handle","values":[]},{"name":"#update-handle-elem","values":[]},{"name":"min-transform-x","description":"Get the minimum transform X value","values":[]},{"name":"max-transform-x","description":"Get the maximum transform X value","values":[]},{"name":"min-transform-y","description":"Get the minimum transform Y value","values":[]},{"name":"max-transform-y","description":"Set the maximum transform Y value","values":[]},{"name":"#update-transform","description":"update the transform with respect to containment\nand min/max transform bounds","values":[]},{"name":"on-mouse-move","description":"called on mouse move; transforms element for\ntransition offset and updates cursor overlay\nelement as necessary","values":[]},{"name":"on-touch-move","description":"called on touch move; transforms element for\ntransition offset","values":[]},{"name":"on-mouse-up","description":"Mouse up event handler","values":[]},{"name":"on-touch-end","description":"Touch end event handler","values":[]},{"name":"is-dragging","description":"Get whether this element is currently being dragged","values":[]},{"name":"#handle-elem","description":"Element that is currently draggable;\nif \"handle\" becomes it possibly becomes the selected element.\n\nOtherwise it defaults to the overall draggable container (this)","values":[]},{"name":"#parent-rect","description":"First measurable parent's rectangle\nwhen a drag is initiated","values":[]},{"name":"#drag-start-mouse-point","description":"The point where we start dragging on the mouse\nto delta from for current tracking.","values":[]},{"name":"#drag-start-offset","description":"The transform translation point applied at\nthe time of a dragstart in order to calculate\ndelta during drag","values":[]},{"name":"#drag-start-rect","description":"The bounding rectangle of this component at the\ntime of a dragstart offset by translate (so\nits original position in the div on start of drag)","values":[]},{"name":"#xform-bounds","description":"Rectangle bounds that transform is limited to if drag\nis bounded by parent","values":[]},{"name":"#cursor-el","description":"Element which provides cursor for mouse when\ndragging after mousedown event since we can\nbind to X/Y axes and there's no way to override\nthe behavior","values":[]},{"name":"relative-bounds","description":"Get the relative bounds","values":[]}],"description":{"kind":"markdown","value":"# Ids Draggable\n\n## Description\n\nA container which limits and tracks the dragging of an HTML Element along a specific axis or within the bounds of it's parent element. Supports both mouse and touch interactions for desktop and mobile devices.\n\n## Use Cases\n\nA draggable would be used in the case where you may have a pane splitter (e.g. in `ids-splitter`, internally), or a list that is meant to be dragged along a specific axis. It may also be used in many cases where we have a canvas or pane that should be resized (in one or two dimensions).\n\nIt does not currently support drag/drop targets in the current iteration, but in the future this component may be used for moving items.\n\n## Features (With Code Examples)\n\nA draggable component with no bounds to where it is moved.\n```html\n <ids-draggable>\n  <div class=\"ids-draggable-demo-box\">\n    <ids-text>Drag Me</ids-text>\n  </div>\n</ids-draggable>\n```\n\nA draggable component along the X axis (e.g. drags horizontally).\n```html\n<ids-draggable axis=\"x\">\n  <div class=\"ids-draggable-demo-box\">\n    <ids-text>Horizontally Draggable</ids-text>\n  </div>\n</ids-draggable>\n```\n\nA draggable component along the Y axis (e.g. drags vertically).\n```html\n<ids-draggable axis=\"y\">\n  <div class=\"ids-draggable-demo-box\">\n    <ids-text>Vertically Draggable</ids-text>\n  </div>\n</ids-draggable>\n```\n\nA draggable component which can be dragged either horizontally or vertically\nbut is contained by it's first non zero-width/height parent (can also work for non-`<div>`, but cannot be a controlled `ids-layout-grid-cell`).\n```html\n<div>\n <ids-draggable parent-containment>\n    <div class=\"ids-draggable-demo-box\">\n      <ids-text>Vertically Draggable</ids-text></div>\n  </ids-draggable>\n</div>\n```\n\nA draggable component which is draggable only by a specific handle on the tab (note: a draggable component currently has a limitation of one handle element, even if the class matches multiple handles).\n```html\n<div>\n <ids-draggable handle=\".drag-handle\">\n    <div class=\"ids-draggable-demo-box\">\n      <ids-icon\n        class=\"drag-handle\"\n        icon=\"drag\"\n        size=\"large\"\n      ></ids-icon>\n      <ids-text>\n        All-content drags, but only .drag-handle is draggable\n      </ids-text>\n    </div>\n  </ids-draggable>\n</div>\n```\n\n## Settings and Attributes\n\n- `parent-containment` {boolean} Flags this draggable as having drag range being contained only within the first/closest inner parent of the content with a measurable width or height.\n- `is-draggable` {boolean} Whether or not the `ids-draggable` and content is being dragged.\n- `disabled` {boolean}\n- `axis?` {'x' | 'y'}   The axis that the draggable content will be moving along (e.g. X => horizontal, Y => vertical); By default, not defined and supports both axes.\n- `handle?` {string} A query selector representing an optional handle that can be used to drag the content of the draggable.\n- `min-transform-x` {number} The minimum offset/x-transform/translate the draggable can be translated/dragged on the DOM.\n- `max-transform-x` {number} The maximum offset/x-transform/translate the draggable can be placed from its position on the DOM.\n- `min-transform-y` {number} The minimum offset/y-transform/translate the draggable can be placed from it's position on the DOM.\n- `max-transform-y` {number} The maximum offset/y-transform/translate the draggable can be from it's position on the DOM.\n\n## Mobile Support\n\nThe component now fully supports touch events for mobile devices:\n\n- Touch events (`touchstart`, `touchmove`, `touchend`) are handled alongside mouse events\n- Dragging works on both desktop and mobile devices\n- The same constraints (axis, parent containment, etc.) apply to both mouse and touch interactions\n- Events triggered (`dragstart`, `drag`, `dragend`) include touch-specific information when triggered by touch events\n\n## Accessibility\n\n- Wherever possible, it would be worth adding some visual indicator that content is dragged (this can be done using the `is-dragging` attribute or listening on `dragstart` and `dragend` events).\n- if you have text that should be readable, where a minimum width or height is needed, or if it affects presentation, but sure to set reasonable `{min|max}-xform-{x|y}` attributes to restrict the amount of offset on a draggable.\n- It is good to keep in mind that draggable content may present issues for people with visual impairments, and so things such as scrollability and typical keyboard\nnavigation should all function as normal in the case where a user is browsing content that may have resize handles or other draggability aspects.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- The 3.X project had two drag components. This replaces both. The Arrange is new\n\n**4.x to 5.x**\n\n- Markup and API fully changed\n- Markup has changed to a custom element that wraps draggable content; `<ids-draggable>content</ids-draggable>`.\n- Bounding drag movement to a specific axis is done by passing the axis attribute as `x` or `y`.\n- The Draggable can be contained to the first measurable parent's rectangle bounds by adding the\nflag `parent-container`.\n- A handle within the draggable content can be set by using the attribute `handle` as a query selector e.g. `handle=\".custom-handle-class\"`.\n- Draggable events to listen for are now `dragstart`, `drag`, and `dragend`.\n- Can now be imported as a single JS file and used with encapsulated styles\n- `ids-draggable` replaces `drag`\n- `ids-swapabble` replaces `arrange`\n- Uses HTML 5 drag drop now\n- Added support for touch events to enable mobile drag functionality\n"}},{"name":"ids-drawer-attributes","description":{"kind":"markdown","value":"# Ids Drawer\n\nThe Ids Drawer component creates a fixed area on the edge of the browser viewport that can be used for roll-out navigation or actions, such as those present on [Application Menus](../ids-app-menu/README.md) or [Action Sheets](../ids-action-sheet/README.md).\n\n## Attributes and Properties\n\n- `edge` defines which edge of the viewport the Drawer will appear from.  Can be `start` (left) or `bottom`\n- `hidden` {boolean} Hides the element from display\n- `type` sets the display type of the Drawer.  It can be styled as an `app-menu` or `action-sheet`.\n- `visible` if true, the Drawer is rolled out from its specified edge\n\n## Features (With Code Examples)\n\nDrawers can be defined simply by their edge:\n\n```html\n<ids-drawer id=\"my-drawer\" edge=\"start\">\n    <ids-text>This is my Drawer content</ids-text>\n</ids-drawer>\n\n<!-- or -->\n\n<ids-drawer id=\"my-drawer\" edge=\"bottom\">\n    <ids-text>This is my Bottom Drawer content</ids-text>\n</ids-drawer>\n```\n\nThey can also take on a `type` for styling.  Drawers are foundational components that are intended to be built-upon for other purposes.  It's recommended that you extend the IdsDrawer and either add a built-in type, or define your own custom styles for the Drawer. if you intend on using your own custom styles, leave this attribute off:\n\n```html\n<ids-drawer id=\"my-drawer\" edge=\"start\" type=\"app-menu\">\n    <ids-text>This is my App-menu-styled Drawer content</ids-text>\n</ids-drawer>\n```\n\nDrawers can be displayed from their corresponding edge using the `visible` attribute:\n\n```html\n<ids-drawer id=\"my-drawer\" edge=\"start\" type=\"app-menu\" visible>\n    <ids-text>This is my Displayed, App-menu-styled Drawer content</ids-text>\n</ids-drawer>\n```\n\n...or by using Javascript properties and methods:\n\n```js\nconst drawer = document.querySelector('#my-drawer');\ndrawer.visible = true;\n\n// ...or\ndrawer.show();\n\n// later on, after use\ndrawer.hide();\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\nIn the 4.x IDS Components there was no Drawer component.  This component represents part of the functionality provided by the 4.x Application Menu, and has been made more general to be shared.\n"}},{"name":"ids-drawer","attributes":[{"name":"edge","values":[]},{"name":"target","values":[]},{"name":"has-trigger-events","description":"Describes whether or not this drawer has trigger events","values":[]},{"name":"type","values":[]},{"name":"visible","values":[]},{"name":"vetoable-event-types","values":[]}],"description":{"kind":"markdown","value":"# Ids Drawer\n\nThe Ids Drawer component creates a fixed area on the edge of the browser viewport that can be used for roll-out navigation or actions, such as those present on [Application Menus](../ids-app-menu/README.md) or [Action Sheets](../ids-action-sheet/README.md).\n\n## Attributes and Properties\n\n- `edge` defines which edge of the viewport the Drawer will appear from.  Can be `start` (left) or `bottom`\n- `hidden` {boolean} Hides the element from display\n- `type` sets the display type of the Drawer.  It can be styled as an `app-menu` or `action-sheet`.\n- `visible` if true, the Drawer is rolled out from its specified edge\n\n## Features (With Code Examples)\n\nDrawers can be defined simply by their edge:\n\n```html\n<ids-drawer id=\"my-drawer\" edge=\"start\">\n    <ids-text>This is my Drawer content</ids-text>\n</ids-drawer>\n\n<!-- or -->\n\n<ids-drawer id=\"my-drawer\" edge=\"bottom\">\n    <ids-text>This is my Bottom Drawer content</ids-text>\n</ids-drawer>\n```\n\nThey can also take on a `type` for styling.  Drawers are foundational components that are intended to be built-upon for other purposes.  It's recommended that you extend the IdsDrawer and either add a built-in type, or define your own custom styles for the Drawer. if you intend on using your own custom styles, leave this attribute off:\n\n```html\n<ids-drawer id=\"my-drawer\" edge=\"start\" type=\"app-menu\">\n    <ids-text>This is my App-menu-styled Drawer content</ids-text>\n</ids-drawer>\n```\n\nDrawers can be displayed from their corresponding edge using the `visible` attribute:\n\n```html\n<ids-drawer id=\"my-drawer\" edge=\"start\" type=\"app-menu\" visible>\n    <ids-text>This is my Displayed, App-menu-styled Drawer content</ids-text>\n</ids-drawer>\n```\n\n...or by using Javascript properties and methods:\n\n```js\nconst drawer = document.querySelector('#my-drawer');\ndrawer.visible = true;\n\n// ...or\ndrawer.show();\n\n// later on, after use\ndrawer.hide();\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\nIn the 4.x IDS Components there was no Drawer component.  This component represents part of the functionality provided by the 4.x Application Menu, and has been made more general to be shared.\n"}},{"name":"ids-dropdown-attributes-mixin","attributes":[{"name":"allow-blank","description":"Gets allow-blank value","values":[]},{"name":"clearable","description":"When set the value can be cleared with Backspace/Delete","values":[]},{"name":"clearable-text","description":"When set the blank option will have a text","values":[]},{"name":"description","description":"Gets the description text(s) for the dropdown","values":[]},{"name":"dropdown-icon","values":[]},{"name":"size","description":"Set the dropdown size","values":[]},{"name":"show-list-item-icon","description":"Set the element's ability to display an optional icon in front of the text","values":[]}],"description":{"kind":"markdown","value":"# ids-dropdown\n\n## Description\n\nThe ids-dropdown is similar to a `<select>` HTML element, with advanced selection and filtering features. See more [usage details](https://design.infor.com/components/components/dropdown).\n\n## Terminology\n\n- **Dropdown** The UX element that lives in the page and is actionable, activating the list\n- **Dropdown List** The UX element that contains and places the list within the page\n- **List Box**: The UX element that wraps the items in the dropdown\n- **List Box Option**: UX elements representing dropdown options, contained by the List Box\n\n## Features (With Code Examples)\n\nDropdown elements should be defined with `id` and `value` attributes. The value should match one of the `value` attributes contained by one of its `ids-list-box-option` elements.  When your application renders, the referenced value will cause the corresponding `ids-list-box-option` to appear selected:\n\n```html\n<ids-dropdown id=\"dropdown-2\" label=\"Readonly Dropdown\" value=\"opt3\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\">Option Six</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo show icons in the dropdown list, add an `ids-icon` and `span` to each list box `ids-list-box-option`.\n\n```html\n<ids-dropdown id=\"dropdown-5\" label=\"Dropdown with Icons\" value=\"opt2\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\">\n      <ids-icon icon=\"user-profile\"></ids-icon>\n      <span>Option One</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\">\n      <ids-icon icon=\"project\"></ids-icon>\n      <span>Option Two</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\">\n      <ids-icon icon=\"purchasing\"></ids-icon>\n      <span>Option Three</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\">\n      <ids-icon icon=\"quality\"></ids-icon>\n      <span>Option Four</span></ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\">\n      <ids-icon icon=\"rocket\"></ids-icon>\n      <span>Option Five</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\">\n      <ids-icon icon=\"roles\"></ids-icon>\n      <span>Option Six</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo show color swatch in the dropdown list, add an `ids-color` and `span` to each list box `ids-list-box-option`.\n\n```html\n<ids-dropdown id=\"dropdown-11\" label=\"Dropdown with color swatches\" show-list-item-icon=\"true\" value=\"blue\">\n  <ids-list-box>\n    <ids-list-box-option value=\"red\">\n      <ids-color color=\"--ids-color-red-70\"></ids-color>\n      <span>Red</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"orange\">\n      <ids-color color=\"--ids-color-orange-70\"></ids-color>\n      <span>Orange</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"#C2A1F1\">\n      <ids-color hex=\"#C2A1F1\"></ids-color>\n      <span>#C2A1F1</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"#3B1470\">\n      <ids-color hex=\"#3B1470\"></ids-color>\n      <span>#3B1470</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nShow tooltips on the dropdown container or options. By setting it on `ids-dropdown`, you will see the tooltip on hover for the closed dropdown. If set on the options, the tooltip will display the selected item.\n\n```html\n<ids-dropdown id=\"dropdown-6\" label=\"Dropdown with Tooltips\" tooltip=\"Additional Info\" value=\"opt2\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\" tooltip=\"Additional Info on Option One\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\" tooltip=\"Additional Info on Option Two\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\" tooltip=\"Additional Info on Option Three\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\" tooltip=\"Additional Info on Option Four\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\" tooltip=\"Additional Info on Option Five\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\" tooltip=\"Additional Info on Option Six\">Option Six</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nFor text overflow with automatic tooltips, use the `overflow` and `tooltip` attributes together:\n\n```html\n<ids-dropdown\n  id=\"dropdown-overflow\"\n  label=\"Dropdown with Ellipsis and Auto Tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  value=\"opt1\"\n  size=\"xs\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">This is a very long option text that will be truncated with ellipsis</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Another long option that demonstrates overflow behavior</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\">Short option</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nUse the `text-align` attribute to control the alignment of the selected value in the input field. This is useful for numeric or character-sorted fields that require right-aligned display:\n\n```html\n<!-- Default (start) alignment -->\n<ids-dropdown id=\"dropdown-start\" label=\"Start text alignment (default)\" value=\"opt1\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Center alignment -->\n<ids-dropdown id=\"dropdown-center\" label=\"Center text alignment\" value=\"opt1\" text-align=\"center\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- End (right) alignment — useful for numeric fields -->\n<ids-dropdown id=\"dropdown-end\" label=\"End text alignment\" value=\"opt1\" text-align=\"end\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nYou can also set it programmatically:\n\n```js\nconst dropdown = document.querySelector('#dropdown-end');\ndropdown.textAlign = 'end';\n```\n\nSometimes you might want to load the dropdown with Ajax. To do this setup the initial html. in order for the selected element to show. This must be pre-populated.\n\n```html\n<ids-dropdown id=\"dropdown-7\" label=\"Dropdown Using Ajax\" value=\"ak\">\n  <ids-list-box>\n    <ids-list-box-option value=\"ak\" id=\"ak\">Alaska</ids-list-box-option>\n </ids-list-box>\n</ids-dropdown>\n```\n\nFor the JS part set the `beforeShow` callback to an async function that returns a promise.\n\n```js\n// Use the asynchronous `beforeshow` callback to load contents\nconst dropdownAsync = document.querySelector('#dropdown-7');\n\ndropdownAsync.beforeShow = async function beforeShow() {\n  const url = '/data/states.json';\n  const res = await fetch(url);\n  const data = await res.json();\n  return data;\n};\n```\n\nThe promise should resolve and return data with id, value and label info.\n\n```js\n{\n  \"id\": \"AS\",\n  \"value\": \"AS\",\n  \"label\": \"American Samoa\"\n}\n```\n\nYou can also load options into a dropdown via the `data` setter.\n```js\n  const ur = '/data/states.json';\n  const res = await fetch(url);\n  dropdown.data = await res.json();\n  dropdown.value = 'CA';\n```\n\nFor groups you should add `group-label` attribute to `ids-list-box-option` to indicate group start, all group items should be below.\n\n```html\n<ids-dropdown id=\"dropdown-groups\" label=\"Dropdown With Groups\" value=\"opt3\">\n  <ids-list-box>\n    <ids-list-box-option group-label>Group 1</ids-list-box-option>\n    <ids-list-box-option value=\"opt1group1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2group1\">Option Two</ids-list-box-option>\n    <ids-list-box-option group-label>Group 2</ids-list-box-option>\n    <ids-list-box-option value=\"opt1group2\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2group2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo add a descriptive text at the bottom of the dropdown list that explains usage or restrictions, use the `description` attribute. This creates a non-selectable option that appears at the bottom of the list:\n\n```html\n<ids-dropdown\n  id=\"dropdown-description\"\n  label=\"Select a priority level\"\n  value=\"medium\"\n  description=\"Choose the priority level that best matches the urgency of your task\">\n  <ids-list-box>\n    <ids-list-box-option value=\"low\">Low Priority</ids-list-box-option>\n    <ids-list-box-option value=\"medium\">Medium Priority</ids-list-box-option>\n    <ids-list-box-option value=\"high\">High Priority</ids-list-box-option>\n    <ids-list-box-option value=\"urgent\">Urgent Priority</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nFor multiple descriptions, you can set them programmatically:\n\n```js\nconst dropdown = document.querySelector('#dropdown-multiple-descriptions');\ndropdown.description = [\n  'Refine search for more options',\n  'Maximum 5 items can be selected'\n];\n```\n\nIn some situations, it may be preferable to separate the IdsDropdownList element from its in-page parent element.  This can be done using the `list` attribute, and simply referencing the dropdown list by its `id` attribute.  This might be necessary for reasons such as breaking out of CSS stacking context.  Note that in this situation, it's necessary to also manually define the event handling and [Popup Interactions](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-popup-interactions-mixin/ids-popup-interactions-mixin.ts) that cause the IdsDropdownList to activate, making this ideal for custom IdsDropdown configurations:\n\n```html\n<ids-dropdown id=\"dropdown-1\" list=\"separate-list\" label=\"Dropdown (list is adjacent)\" value=\"blank\" dirty-tracker=\"true\" allow-blank=\"true\"></ids-dropdown>\n<ids-dropdown-list id=\"separate-list\">\n  <ids-list-box>\n    <ids-list-box-option value=\"blank\" id=\"blank\"><span></span></ids-list-box-option>\n    <ids-list-box-option value=\"opt1\" id=\"opt1-d8\"><span>Option One</span></ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2-d8\"><span>Option Two</span></ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown-list>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-dropdown label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n<ids-dropdown label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nControl auto-sizing behavior with the `auto-size` and `input-auto-size` attributes:\n\n```html\n<!-- Both input and popup resize based on content (default behavior when auto-size is true) -->\n<ids-dropdown label=\"Auto-size both input and popup\" auto-size=\"true\" input-auto-size=\"true\">\n  <ids-list-box>\n    <ids-list-box-option value=\"short\">Short</ids-list-box-option>\n    <ids-list-box-option value=\"long\">Very Long Option Text That Expands Both Input and Popup</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Fixed input size, only popup resizes -->\n<ids-dropdown label=\"Fixed input, auto-size popup\" auto-size=\"true\" input-auto-size=\"false\">\n  <ids-list-box>\n    <ids-list-box-option value=\"short\">Short</ids-list-box-option>\n    <ids-list-box-option value=\"long\">Very Long Option Text That Only Expands Popup</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Multi-column with fixed input size -->\n<ids-dropdown label=\"Multi-column with fixed input\" multi-column=\"true\" auto-size=\"true\" input-auto-size=\"false\">\n  <ids-list-box>\n    <ids-list-box-option value=\"en-US\">\n      <span>en-US</span>\n      <span>English (United States)</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"de-DE\">\n      <span>de-DE</span>\n      <span>German (Germany)</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\n### Dynamic Multicolumn Feature\n\nThe dynamic multicolumn feature allows dropdown options to display multiple data fields in a structured column layout. This feature automatically detects when to enable multicolumn mode and formats the display accordingly.\n\n#### Activation\n\nThe multicolumn feature requires `multi-column=\"true\"` to be set on the ids-dropdown component. There are two ways to use it:\n\n1. **Auto-detection mode**: When `columns` is not set, the feature automatically detects `\\n` (newline) characters in option labels and splits them into columns\n2. **Configured mode**: When `columns` is set, the feature uses the specified column configuration to display data properties\n\n#### Configuration\n\nUse the `columns` property to define which data properties should be displayed:\n\n```typescript\ndropdown.columns = [\n  { field: 'code', label: 'Code' },\n  { field: 'name', label: 'Name' }\n];\n\ndropdown.data = [\n  { value: 'EUR', code: 'EUR', name: 'Euro' },\n  { value: 'USD', code: 'USD', name: 'US Dollar' }\n];\n```\n\n#### Example Usage\n\n```html\n<ids-dropdown id=\"currency-dropdown\" multi-column=\"true\">\n  <ids-list-box>\n    <!-- Options dynamically generated based on data and columns -->\n  </ids-list-box>\n</ids-dropdown>\n```\n\n```typescript\nconst dropdown = document.querySelector('#currency-dropdown');\ndropdown.columns = [{ field: 'code', label: 'Code' }, { field: 'name', label: 'Name' }];\ndropdown.data = [{ value: 'EUR', code: 'EUR', name: 'Euro' }];\n```\n\n#### Display Behavior\n\n- Selected values are formatted as \"Code - Name\" (e.g., \"EUR - Euro\")\n- The `showValue` property controls whether to display raw value or formatted text\n- CSS class `.multi-column` is added to the list-box container\n- Auto-detection works with newline characters (`\\n`) for backward compatibility\n\n## Settings\n\n- `allowBlank` {boolean} Sets whether option list should include 'blank' option. To reset the value to blank, use `value='' | 'blank' | undefined | null`.\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `colorVariant` {string} set the current color variant.\n- `combobox` {boolean} Enables combobox mode, allowing users to type custom values not in the predefined list. When enabled:\n  - Click the input field to type custom text\n  - Click the dropdown button to open the options list\n  - Accepts both predefined options and custom user input\n- `compact` {boolean} sets the component to be compact mode.\n- `dirtyTracker` {boolean} Sets the dirty tracking feature on to indicate a changed\n- `disabled` {boolean} Sets dropdown to disabled\n- `errorTracker` {boolean} Replaces the standard validation error message with a compact error indicator icon inside the field. The full error message is shown as a tooltip on hover. See [Ids Error Tracker Mixin](../../mixins/ids-error-tracker-mixin/README.md) for more information.\n- `fieldHeight` {string} defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `hidden` {boolean} Hides the element from display\n- `label` {string} Sets the label text\n- `language` {string} Sets the language for RTL and inner labels\n- `labelRequired` {boolean} Sets the validation required indicator on label text, it's default to `true`\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `list` {string} ID selector used to reference/connect to an external IdsDropdownList component (used in some scenarios like IdsDataGrid filters)\n- `multi-column` {boolean} - If set to true, will make a two column on the dropdown to accommodate two spans.\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `offset-container` {string} CSS Selector for container element from which a dropdown list with position-style `fixed` should adjust itself from. Such as when a parent container has `container-type: size`, which affects the popup's fixed position calculation.\n- `overflow` {string} Sets the overflow behavior for text content. When set to 'ellipsis', text will be truncated with ellipsis when it overflows the container.\n- `placeholder` {string} Sets the placeholder text\n- `size` {`'sm' | 'md' | 'lg' | 'full' | string`} Sets the size (width)\n- `readonly` {boolean} Sets to readonly state\n- `tabbable` {boolean} When set to true, allows the dropdown and its trigger button to be included in the tab order. By default (false), the trigger button is not tabbable. Enable this for accessibility when keyboard navigation to the trigger button is required. Applies to both the dropdown input and trigger button elements\n- `text-align` {`'start' | 'center' | 'end'`} Sets the text alignment of the selected value displayed in the input field. Defaults to `start`. Use `end` for right-aligned display (e.g., numeric fields), `center` for centered display.\n- `auto-size` {boolean} Sets whether the dropdown should auto-size based on content (default: false)\n- `input-auto-size` {boolean} Sets whether the input field should auto-size when auto-size is enabled (default: true). When false, only the popup expands to fit content while the input remains fixed size\n- `validate` {'required' | string} Sets the validation routine to use\n- `validationEvents` {'blur' | string} Sets the validation events to use\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `value` {string | null | undefined} Sets option to the matching option by the `value` attribute\n- `valueResetTracking` {string | null | undefined} Sets the value option but reset dirty in one step\n- `id` {string} Sets the `id` attribute\n- `tooltip` {string | boolean} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the overflow=\"ellipsis\" and tooltip=\"true\". You can also provide custom tooltip text as a string.\n- `selectedIndex` {number} Sets the the selected option by index\n- `typeahead` {boolean} - Enable/disable typeahead functionality (true by default)\n- `clearable` {boolean} - Whether or not the value can be cleared with Backspace/Delete (false by default)\n- `clearable-text` {string} - Sets the blank option custom text. The text will not be added to the input when the option is selected\n- `description` {string|string[]} - Sets descriptive text that appears as non-selectable options at the bottom of the dropdown list. Can be a single string or array of strings for multiple descriptions. Useful for explaining usage instructions or restrictions\n- `show-loading-indicator` {boolean} - Whether or not to show loading indicator (replaces trigger button). Defaults to false.\n- `show-list-item-icon` {boolean} - If set to true and `<ids-icon>` elements are in the markup. Then icons will be shown next to the text in the dropdown list.\n- `show-value` {boolean} - If set to true, then the text displayed as selected will be the value.\n- `skip-sanitize` {boolean} - If set to true, HTML content in option values and labels will not be sanitized, allowing raw HTML to be displayed. Use with caution as this can introduce XSS vulnerabilities if user input is not properly validated.\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `columns` {IdsDropdownColumn[]} Array of column configuration objects for multicolumn layout. Each object should have `field` and `label` properties\n- `maxColumns` {number} Maximum number of columns to display (default: 10, max: 20)\n\n## Events\n\n- `change` Fires when an option is selected / changed\n- `focus` Fires at the time the dropdown is focused\n- `selected` Fires when a value is selected\n- `focus` Fires when the field gets focus\n- `selected` Fires when a value is selected\n- Some event listeners for popup `show`, `hide` events can be added to `popup` property\n\n```js\nconst dropdown = document.querySelector('ids-dropdown');\n\ndropdown.popup.addEventListener('show');\ndropdown.popup.addEventListener('hide');\n```\n\n## Methods\n\n- `beforeShow` {Promise<string>} An async function that fires as the dropdown is opening allowing you to set contents\n- `afterShow` {Function} A callback that fires after the dropdown is shown, which is useful for capturing state (e.g., selectedIndex) when the options become available.\n- `toggle` {void} Toggles the dropdown list open/closed state\n- `open` {void} Opens the dropdown list\n- `close` {void} Closes the dropdown list\n- `options` {Array<HTMLElement>} Returns the currently available options\n- `selectedOption` {HTMLElement} Returns the selected option DOM element\n- `selectedIndex` {number} Sets the the selected option by index\n\n## Themeable Parts\n\n- `trigger-field` - allows you to further style  the trigger field container\n- `input` - allows you to further style  the input in the trigger field container\n- `trigger-button` - allows you to further style the trigger field button\n- `icon` - allows you to further style the trigger field icon\n- `popup` - allows you to further style the dropdown popup\n\n## States and Variations\n\n- Valid/Invalid\n- Required\n- Readonly\n- Open/Closed\n- Disabled\n- Dirty\n- Error Tracker\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: Moves focus into and out of the dropdown input. If the list is open, this will select the currently highlighted option, close the list, and move to the next focusable element\n- <kbd>Alt + Down Arrow / Down Arrow</kbd>: Opens the dropdown list and moves focus to the selected option. If nothing is selected, then focus moves to the first option in the list. If the combobox is not editable nothing will happen.\n- <kbd>Enter</kbd>: Selects the currently highlighted item in the list, updates the input field, highlights the selected item in the dropdown list, closes the dropdown list, and returns focus to the input field.\n- <kbd>Space</kbd>: When dropdown is open, selects the currently highlighted option. When input field is focused, allows normal typing without triggering selection\n- <kbd>Escape</kbd>: Closes the dropdown list, returns focus to the edit field, and does not change the current selection.\n- <kbd>Up/Down Arrow</kbd>: Navigates through options in the dropdown list\n- <kbd>AnyKey</kbd>: Typing a letter opens the list and filters to the items that start with that letter\n\n## Responsive Guidelines\n\n- The dropdown `<input>` should size to the parent container and the `<label>` should remain on the top.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Dropdown have all new markup and classes.\n\n**4.x to 5.x**\n- The dropdown component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-dropdown></ids-dropdown>`\n- If using events, events are now plain JS events (change event when changed)\n- API is significantly different\n- No longer uses a select element\n\n## Designs\n\n[Design Specs 4.5](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n[Design Specs 4.6](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\nThe dropdown list has been coded to act similar to the [aria readonly combobox](http://whatsock.com/Templates/Comboboxes/Native%20Inputs,%20Editable%20and%20Readonly/index.htm). With some variations due to having to deal with shadowDom.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The dropdown icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-dropdown-common","description":{"kind":"markdown","value":"# ids-dropdown\n\n## Description\n\nThe ids-dropdown is similar to a `<select>` HTML element, with advanced selection and filtering features. See more [usage details](https://design.infor.com/components/components/dropdown).\n\n## Terminology\n\n- **Dropdown** The UX element that lives in the page and is actionable, activating the list\n- **Dropdown List** The UX element that contains and places the list within the page\n- **List Box**: The UX element that wraps the items in the dropdown\n- **List Box Option**: UX elements representing dropdown options, contained by the List Box\n\n## Features (With Code Examples)\n\nDropdown elements should be defined with `id` and `value` attributes. The value should match one of the `value` attributes contained by one of its `ids-list-box-option` elements.  When your application renders, the referenced value will cause the corresponding `ids-list-box-option` to appear selected:\n\n```html\n<ids-dropdown id=\"dropdown-2\" label=\"Readonly Dropdown\" value=\"opt3\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\">Option Six</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo show icons in the dropdown list, add an `ids-icon` and `span` to each list box `ids-list-box-option`.\n\n```html\n<ids-dropdown id=\"dropdown-5\" label=\"Dropdown with Icons\" value=\"opt2\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\">\n      <ids-icon icon=\"user-profile\"></ids-icon>\n      <span>Option One</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\">\n      <ids-icon icon=\"project\"></ids-icon>\n      <span>Option Two</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\">\n      <ids-icon icon=\"purchasing\"></ids-icon>\n      <span>Option Three</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\">\n      <ids-icon icon=\"quality\"></ids-icon>\n      <span>Option Four</span></ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\">\n      <ids-icon icon=\"rocket\"></ids-icon>\n      <span>Option Five</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\">\n      <ids-icon icon=\"roles\"></ids-icon>\n      <span>Option Six</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo show color swatch in the dropdown list, add an `ids-color` and `span` to each list box `ids-list-box-option`.\n\n```html\n<ids-dropdown id=\"dropdown-11\" label=\"Dropdown with color swatches\" show-list-item-icon=\"true\" value=\"blue\">\n  <ids-list-box>\n    <ids-list-box-option value=\"red\">\n      <ids-color color=\"--ids-color-red-70\"></ids-color>\n      <span>Red</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"orange\">\n      <ids-color color=\"--ids-color-orange-70\"></ids-color>\n      <span>Orange</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"#C2A1F1\">\n      <ids-color hex=\"#C2A1F1\"></ids-color>\n      <span>#C2A1F1</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"#3B1470\">\n      <ids-color hex=\"#3B1470\"></ids-color>\n      <span>#3B1470</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nShow tooltips on the dropdown container or options. By setting it on `ids-dropdown`, you will see the tooltip on hover for the closed dropdown. If set on the options, the tooltip will display the selected item.\n\n```html\n<ids-dropdown id=\"dropdown-6\" label=\"Dropdown with Tooltips\" tooltip=\"Additional Info\" value=\"opt2\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\" tooltip=\"Additional Info on Option One\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\" tooltip=\"Additional Info on Option Two\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\" tooltip=\"Additional Info on Option Three\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\" tooltip=\"Additional Info on Option Four\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\" tooltip=\"Additional Info on Option Five\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\" tooltip=\"Additional Info on Option Six\">Option Six</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nFor text overflow with automatic tooltips, use the `overflow` and `tooltip` attributes together:\n\n```html\n<ids-dropdown\n  id=\"dropdown-overflow\"\n  label=\"Dropdown with Ellipsis and Auto Tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  value=\"opt1\"\n  size=\"xs\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">This is a very long option text that will be truncated with ellipsis</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Another long option that demonstrates overflow behavior</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\">Short option</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nUse the `text-align` attribute to control the alignment of the selected value in the input field. This is useful for numeric or character-sorted fields that require right-aligned display:\n\n```html\n<!-- Default (start) alignment -->\n<ids-dropdown id=\"dropdown-start\" label=\"Start text alignment (default)\" value=\"opt1\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Center alignment -->\n<ids-dropdown id=\"dropdown-center\" label=\"Center text alignment\" value=\"opt1\" text-align=\"center\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- End (right) alignment — useful for numeric fields -->\n<ids-dropdown id=\"dropdown-end\" label=\"End text alignment\" value=\"opt1\" text-align=\"end\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nYou can also set it programmatically:\n\n```js\nconst dropdown = document.querySelector('#dropdown-end');\ndropdown.textAlign = 'end';\n```\n\nSometimes you might want to load the dropdown with Ajax. To do this setup the initial html. in order for the selected element to show. This must be pre-populated.\n\n```html\n<ids-dropdown id=\"dropdown-7\" label=\"Dropdown Using Ajax\" value=\"ak\">\n  <ids-list-box>\n    <ids-list-box-option value=\"ak\" id=\"ak\">Alaska</ids-list-box-option>\n </ids-list-box>\n</ids-dropdown>\n```\n\nFor the JS part set the `beforeShow` callback to an async function that returns a promise.\n\n```js\n// Use the asynchronous `beforeshow` callback to load contents\nconst dropdownAsync = document.querySelector('#dropdown-7');\n\ndropdownAsync.beforeShow = async function beforeShow() {\n  const url = '/data/states.json';\n  const res = await fetch(url);\n  const data = await res.json();\n  return data;\n};\n```\n\nThe promise should resolve and return data with id, value and label info.\n\n```js\n{\n  \"id\": \"AS\",\n  \"value\": \"AS\",\n  \"label\": \"American Samoa\"\n}\n```\n\nYou can also load options into a dropdown via the `data` setter.\n```js\n  const ur = '/data/states.json';\n  const res = await fetch(url);\n  dropdown.data = await res.json();\n  dropdown.value = 'CA';\n```\n\nFor groups you should add `group-label` attribute to `ids-list-box-option` to indicate group start, all group items should be below.\n\n```html\n<ids-dropdown id=\"dropdown-groups\" label=\"Dropdown With Groups\" value=\"opt3\">\n  <ids-list-box>\n    <ids-list-box-option group-label>Group 1</ids-list-box-option>\n    <ids-list-box-option value=\"opt1group1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2group1\">Option Two</ids-list-box-option>\n    <ids-list-box-option group-label>Group 2</ids-list-box-option>\n    <ids-list-box-option value=\"opt1group2\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2group2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo add a descriptive text at the bottom of the dropdown list that explains usage or restrictions, use the `description` attribute. This creates a non-selectable option that appears at the bottom of the list:\n\n```html\n<ids-dropdown\n  id=\"dropdown-description\"\n  label=\"Select a priority level\"\n  value=\"medium\"\n  description=\"Choose the priority level that best matches the urgency of your task\">\n  <ids-list-box>\n    <ids-list-box-option value=\"low\">Low Priority</ids-list-box-option>\n    <ids-list-box-option value=\"medium\">Medium Priority</ids-list-box-option>\n    <ids-list-box-option value=\"high\">High Priority</ids-list-box-option>\n    <ids-list-box-option value=\"urgent\">Urgent Priority</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nFor multiple descriptions, you can set them programmatically:\n\n```js\nconst dropdown = document.querySelector('#dropdown-multiple-descriptions');\ndropdown.description = [\n  'Refine search for more options',\n  'Maximum 5 items can be selected'\n];\n```\n\nIn some situations, it may be preferable to separate the IdsDropdownList element from its in-page parent element.  This can be done using the `list` attribute, and simply referencing the dropdown list by its `id` attribute.  This might be necessary for reasons such as breaking out of CSS stacking context.  Note that in this situation, it's necessary to also manually define the event handling and [Popup Interactions](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-popup-interactions-mixin/ids-popup-interactions-mixin.ts) that cause the IdsDropdownList to activate, making this ideal for custom IdsDropdown configurations:\n\n```html\n<ids-dropdown id=\"dropdown-1\" list=\"separate-list\" label=\"Dropdown (list is adjacent)\" value=\"blank\" dirty-tracker=\"true\" allow-blank=\"true\"></ids-dropdown>\n<ids-dropdown-list id=\"separate-list\">\n  <ids-list-box>\n    <ids-list-box-option value=\"blank\" id=\"blank\"><span></span></ids-list-box-option>\n    <ids-list-box-option value=\"opt1\" id=\"opt1-d8\"><span>Option One</span></ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2-d8\"><span>Option Two</span></ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown-list>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-dropdown label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n<ids-dropdown label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nControl auto-sizing behavior with the `auto-size` and `input-auto-size` attributes:\n\n```html\n<!-- Both input and popup resize based on content (default behavior when auto-size is true) -->\n<ids-dropdown label=\"Auto-size both input and popup\" auto-size=\"true\" input-auto-size=\"true\">\n  <ids-list-box>\n    <ids-list-box-option value=\"short\">Short</ids-list-box-option>\n    <ids-list-box-option value=\"long\">Very Long Option Text That Expands Both Input and Popup</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Fixed input size, only popup resizes -->\n<ids-dropdown label=\"Fixed input, auto-size popup\" auto-size=\"true\" input-auto-size=\"false\">\n  <ids-list-box>\n    <ids-list-box-option value=\"short\">Short</ids-list-box-option>\n    <ids-list-box-option value=\"long\">Very Long Option Text That Only Expands Popup</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Multi-column with fixed input size -->\n<ids-dropdown label=\"Multi-column with fixed input\" multi-column=\"true\" auto-size=\"true\" input-auto-size=\"false\">\n  <ids-list-box>\n    <ids-list-box-option value=\"en-US\">\n      <span>en-US</span>\n      <span>English (United States)</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"de-DE\">\n      <span>de-DE</span>\n      <span>German (Germany)</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\n### Dynamic Multicolumn Feature\n\nThe dynamic multicolumn feature allows dropdown options to display multiple data fields in a structured column layout. This feature automatically detects when to enable multicolumn mode and formats the display accordingly.\n\n#### Activation\n\nThe multicolumn feature requires `multi-column=\"true\"` to be set on the ids-dropdown component. There are two ways to use it:\n\n1. **Auto-detection mode**: When `columns` is not set, the feature automatically detects `\\n` (newline) characters in option labels and splits them into columns\n2. **Configured mode**: When `columns` is set, the feature uses the specified column configuration to display data properties\n\n#### Configuration\n\nUse the `columns` property to define which data properties should be displayed:\n\n```typescript\ndropdown.columns = [\n  { field: 'code', label: 'Code' },\n  { field: 'name', label: 'Name' }\n];\n\ndropdown.data = [\n  { value: 'EUR', code: 'EUR', name: 'Euro' },\n  { value: 'USD', code: 'USD', name: 'US Dollar' }\n];\n```\n\n#### Example Usage\n\n```html\n<ids-dropdown id=\"currency-dropdown\" multi-column=\"true\">\n  <ids-list-box>\n    <!-- Options dynamically generated based on data and columns -->\n  </ids-list-box>\n</ids-dropdown>\n```\n\n```typescript\nconst dropdown = document.querySelector('#currency-dropdown');\ndropdown.columns = [{ field: 'code', label: 'Code' }, { field: 'name', label: 'Name' }];\ndropdown.data = [{ value: 'EUR', code: 'EUR', name: 'Euro' }];\n```\n\n#### Display Behavior\n\n- Selected values are formatted as \"Code - Name\" (e.g., \"EUR - Euro\")\n- The `showValue` property controls whether to display raw value or formatted text\n- CSS class `.multi-column` is added to the list-box container\n- Auto-detection works with newline characters (`\\n`) for backward compatibility\n\n## Settings\n\n- `allowBlank` {boolean} Sets whether option list should include 'blank' option. To reset the value to blank, use `value='' | 'blank' | undefined | null`.\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `colorVariant` {string} set the current color variant.\n- `combobox` {boolean} Enables combobox mode, allowing users to type custom values not in the predefined list. When enabled:\n  - Click the input field to type custom text\n  - Click the dropdown button to open the options list\n  - Accepts both predefined options and custom user input\n- `compact` {boolean} sets the component to be compact mode.\n- `dirtyTracker` {boolean} Sets the dirty tracking feature on to indicate a changed\n- `disabled` {boolean} Sets dropdown to disabled\n- `errorTracker` {boolean} Replaces the standard validation error message with a compact error indicator icon inside the field. The full error message is shown as a tooltip on hover. See [Ids Error Tracker Mixin](../../mixins/ids-error-tracker-mixin/README.md) for more information.\n- `fieldHeight` {string} defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `hidden` {boolean} Hides the element from display\n- `label` {string} Sets the label text\n- `language` {string} Sets the language for RTL and inner labels\n- `labelRequired` {boolean} Sets the validation required indicator on label text, it's default to `true`\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `list` {string} ID selector used to reference/connect to an external IdsDropdownList component (used in some scenarios like IdsDataGrid filters)\n- `multi-column` {boolean} - If set to true, will make a two column on the dropdown to accommodate two spans.\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `offset-container` {string} CSS Selector for container element from which a dropdown list with position-style `fixed` should adjust itself from. Such as when a parent container has `container-type: size`, which affects the popup's fixed position calculation.\n- `overflow` {string} Sets the overflow behavior for text content. When set to 'ellipsis', text will be truncated with ellipsis when it overflows the container.\n- `placeholder` {string} Sets the placeholder text\n- `size` {`'sm' | 'md' | 'lg' | 'full' | string`} Sets the size (width)\n- `readonly` {boolean} Sets to readonly state\n- `tabbable` {boolean} When set to true, allows the dropdown and its trigger button to be included in the tab order. By default (false), the trigger button is not tabbable. Enable this for accessibility when keyboard navigation to the trigger button is required. Applies to both the dropdown input and trigger button elements\n- `text-align` {`'start' | 'center' | 'end'`} Sets the text alignment of the selected value displayed in the input field. Defaults to `start`. Use `end` for right-aligned display (e.g., numeric fields), `center` for centered display.\n- `auto-size` {boolean} Sets whether the dropdown should auto-size based on content (default: false)\n- `input-auto-size` {boolean} Sets whether the input field should auto-size when auto-size is enabled (default: true). When false, only the popup expands to fit content while the input remains fixed size\n- `validate` {'required' | string} Sets the validation routine to use\n- `validationEvents` {'blur' | string} Sets the validation events to use\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `value` {string | null | undefined} Sets option to the matching option by the `value` attribute\n- `valueResetTracking` {string | null | undefined} Sets the value option but reset dirty in one step\n- `id` {string} Sets the `id` attribute\n- `tooltip` {string | boolean} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the overflow=\"ellipsis\" and tooltip=\"true\". You can also provide custom tooltip text as a string.\n- `selectedIndex` {number} Sets the the selected option by index\n- `typeahead` {boolean} - Enable/disable typeahead functionality (true by default)\n- `clearable` {boolean} - Whether or not the value can be cleared with Backspace/Delete (false by default)\n- `clearable-text` {string} - Sets the blank option custom text. The text will not be added to the input when the option is selected\n- `description` {string|string[]} - Sets descriptive text that appears as non-selectable options at the bottom of the dropdown list. Can be a single string or array of strings for multiple descriptions. Useful for explaining usage instructions or restrictions\n- `show-loading-indicator` {boolean} - Whether or not to show loading indicator (replaces trigger button). Defaults to false.\n- `show-list-item-icon` {boolean} - If set to true and `<ids-icon>` elements are in the markup. Then icons will be shown next to the text in the dropdown list.\n- `show-value` {boolean} - If set to true, then the text displayed as selected will be the value.\n- `skip-sanitize` {boolean} - If set to true, HTML content in option values and labels will not be sanitized, allowing raw HTML to be displayed. Use with caution as this can introduce XSS vulnerabilities if user input is not properly validated.\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `columns` {IdsDropdownColumn[]} Array of column configuration objects for multicolumn layout. Each object should have `field` and `label` properties\n- `maxColumns` {number} Maximum number of columns to display (default: 10, max: 20)\n\n## Events\n\n- `change` Fires when an option is selected / changed\n- `focus` Fires at the time the dropdown is focused\n- `selected` Fires when a value is selected\n- `focus` Fires when the field gets focus\n- `selected` Fires when a value is selected\n- Some event listeners for popup `show`, `hide` events can be added to `popup` property\n\n```js\nconst dropdown = document.querySelector('ids-dropdown');\n\ndropdown.popup.addEventListener('show');\ndropdown.popup.addEventListener('hide');\n```\n\n## Methods\n\n- `beforeShow` {Promise<string>} An async function that fires as the dropdown is opening allowing you to set contents\n- `afterShow` {Function} A callback that fires after the dropdown is shown, which is useful for capturing state (e.g., selectedIndex) when the options become available.\n- `toggle` {void} Toggles the dropdown list open/closed state\n- `open` {void} Opens the dropdown list\n- `close` {void} Closes the dropdown list\n- `options` {Array<HTMLElement>} Returns the currently available options\n- `selectedOption` {HTMLElement} Returns the selected option DOM element\n- `selectedIndex` {number} Sets the the selected option by index\n\n## Themeable Parts\n\n- `trigger-field` - allows you to further style  the trigger field container\n- `input` - allows you to further style  the input in the trigger field container\n- `trigger-button` - allows you to further style the trigger field button\n- `icon` - allows you to further style the trigger field icon\n- `popup` - allows you to further style the dropdown popup\n\n## States and Variations\n\n- Valid/Invalid\n- Required\n- Readonly\n- Open/Closed\n- Disabled\n- Dirty\n- Error Tracker\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: Moves focus into and out of the dropdown input. If the list is open, this will select the currently highlighted option, close the list, and move to the next focusable element\n- <kbd>Alt + Down Arrow / Down Arrow</kbd>: Opens the dropdown list and moves focus to the selected option. If nothing is selected, then focus moves to the first option in the list. If the combobox is not editable nothing will happen.\n- <kbd>Enter</kbd>: Selects the currently highlighted item in the list, updates the input field, highlights the selected item in the dropdown list, closes the dropdown list, and returns focus to the input field.\n- <kbd>Space</kbd>: When dropdown is open, selects the currently highlighted option. When input field is focused, allows normal typing without triggering selection\n- <kbd>Escape</kbd>: Closes the dropdown list, returns focus to the edit field, and does not change the current selection.\n- <kbd>Up/Down Arrow</kbd>: Navigates through options in the dropdown list\n- <kbd>AnyKey</kbd>: Typing a letter opens the list and filters to the items that start with that letter\n\n## Responsive Guidelines\n\n- The dropdown `<input>` should size to the parent container and the `<label>` should remain on the top.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Dropdown have all new markup and classes.\n\n**4.x to 5.x**\n- The dropdown component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-dropdown></ids-dropdown>`\n- If using events, events are now plain JS events (change event when changed)\n- API is significantly different\n- No longer uses a select element\n\n## Designs\n\n[Design Specs 4.5](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n[Design Specs 4.6](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\nThe dropdown list has been coded to act similar to the [aria readonly combobox](http://whatsock.com/Templates/Comboboxes/Native%20Inputs,%20Editable%20and%20Readonly/index.htm). With some variations due to having to deal with shadowDom.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The dropdown icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-dropdown-list","attributes":[{"name":"mobile-viewport-padding","values":[]},{"name":"is-multi-select","values":[]},{"name":"list-box","values":[]},{"name":"last-hovered","values":[]},{"name":"original-tooltips","values":[]},{"name":"dropdown-resize-observer","values":[]},{"name":"color-variants","description":"List of available color variants for this component","values":[]},{"name":"is-multiselect-datagrid-editor","values":[]},{"name":"dropdown-el","values":[]},{"name":"locale-api","values":[]},{"name":"initial-y","values":[]},{"name":"original-column-width","values":[]},{"name":"resized-column-id","values":[]},{"name":"options","description":"Returns the currently available options","values":[]},{"name":"selected-option","description":"Returns the selected Listbox option based on the Dropdown's value.","values":[]},{"name":"selected","description":"Returns the currently-selected Listbox option\n(may be different from the Dropdown's value because of user input)","values":[]},{"name":"typeahead","description":"Get the typeahead attribute","values":[]},{"name":"position-style","values":[]},{"name":"value","description":"Set the value of the dropdown using the value/id attribute if present","values":[]},{"name":"auto-size","description":"Set the auto-size of input","values":[]}],"description":{"kind":"markdown","value":"# ids-dropdown\n\n## Description\n\nThe ids-dropdown is similar to a `<select>` HTML element, with advanced selection and filtering features. See more [usage details](https://design.infor.com/components/components/dropdown).\n\n## Terminology\n\n- **Dropdown** The UX element that lives in the page and is actionable, activating the list\n- **Dropdown List** The UX element that contains and places the list within the page\n- **List Box**: The UX element that wraps the items in the dropdown\n- **List Box Option**: UX elements representing dropdown options, contained by the List Box\n\n## Features (With Code Examples)\n\nDropdown elements should be defined with `id` and `value` attributes. The value should match one of the `value` attributes contained by one of its `ids-list-box-option` elements.  When your application renders, the referenced value will cause the corresponding `ids-list-box-option` to appear selected:\n\n```html\n<ids-dropdown id=\"dropdown-2\" label=\"Readonly Dropdown\" value=\"opt3\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\">Option Six</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo show icons in the dropdown list, add an `ids-icon` and `span` to each list box `ids-list-box-option`.\n\n```html\n<ids-dropdown id=\"dropdown-5\" label=\"Dropdown with Icons\" value=\"opt2\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\">\n      <ids-icon icon=\"user-profile\"></ids-icon>\n      <span>Option One</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\">\n      <ids-icon icon=\"project\"></ids-icon>\n      <span>Option Two</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\">\n      <ids-icon icon=\"purchasing\"></ids-icon>\n      <span>Option Three</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\">\n      <ids-icon icon=\"quality\"></ids-icon>\n      <span>Option Four</span></ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\">\n      <ids-icon icon=\"rocket\"></ids-icon>\n      <span>Option Five</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\">\n      <ids-icon icon=\"roles\"></ids-icon>\n      <span>Option Six</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo show color swatch in the dropdown list, add an `ids-color` and `span` to each list box `ids-list-box-option`.\n\n```html\n<ids-dropdown id=\"dropdown-11\" label=\"Dropdown with color swatches\" show-list-item-icon=\"true\" value=\"blue\">\n  <ids-list-box>\n    <ids-list-box-option value=\"red\">\n      <ids-color color=\"--ids-color-red-70\"></ids-color>\n      <span>Red</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"orange\">\n      <ids-color color=\"--ids-color-orange-70\"></ids-color>\n      <span>Orange</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"#C2A1F1\">\n      <ids-color hex=\"#C2A1F1\"></ids-color>\n      <span>#C2A1F1</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"#3B1470\">\n      <ids-color hex=\"#3B1470\"></ids-color>\n      <span>#3B1470</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nShow tooltips on the dropdown container or options. By setting it on `ids-dropdown`, you will see the tooltip on hover for the closed dropdown. If set on the options, the tooltip will display the selected item.\n\n```html\n<ids-dropdown id=\"dropdown-6\" label=\"Dropdown with Tooltips\" tooltip=\"Additional Info\" value=\"opt2\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\" tooltip=\"Additional Info on Option One\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\" tooltip=\"Additional Info on Option Two\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\" tooltip=\"Additional Info on Option Three\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\" tooltip=\"Additional Info on Option Four\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\" tooltip=\"Additional Info on Option Five\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\" tooltip=\"Additional Info on Option Six\">Option Six</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nFor text overflow with automatic tooltips, use the `overflow` and `tooltip` attributes together:\n\n```html\n<ids-dropdown\n  id=\"dropdown-overflow\"\n  label=\"Dropdown with Ellipsis and Auto Tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  value=\"opt1\"\n  size=\"xs\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">This is a very long option text that will be truncated with ellipsis</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Another long option that demonstrates overflow behavior</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\">Short option</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nUse the `text-align` attribute to control the alignment of the selected value in the input field. This is useful for numeric or character-sorted fields that require right-aligned display:\n\n```html\n<!-- Default (start) alignment -->\n<ids-dropdown id=\"dropdown-start\" label=\"Start text alignment (default)\" value=\"opt1\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Center alignment -->\n<ids-dropdown id=\"dropdown-center\" label=\"Center text alignment\" value=\"opt1\" text-align=\"center\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- End (right) alignment — useful for numeric fields -->\n<ids-dropdown id=\"dropdown-end\" label=\"End text alignment\" value=\"opt1\" text-align=\"end\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nYou can also set it programmatically:\n\n```js\nconst dropdown = document.querySelector('#dropdown-end');\ndropdown.textAlign = 'end';\n```\n\nSometimes you might want to load the dropdown with Ajax. To do this setup the initial html. in order for the selected element to show. This must be pre-populated.\n\n```html\n<ids-dropdown id=\"dropdown-7\" label=\"Dropdown Using Ajax\" value=\"ak\">\n  <ids-list-box>\n    <ids-list-box-option value=\"ak\" id=\"ak\">Alaska</ids-list-box-option>\n </ids-list-box>\n</ids-dropdown>\n```\n\nFor the JS part set the `beforeShow` callback to an async function that returns a promise.\n\n```js\n// Use the asynchronous `beforeshow` callback to load contents\nconst dropdownAsync = document.querySelector('#dropdown-7');\n\ndropdownAsync.beforeShow = async function beforeShow() {\n  const url = '/data/states.json';\n  const res = await fetch(url);\n  const data = await res.json();\n  return data;\n};\n```\n\nThe promise should resolve and return data with id, value and label info.\n\n```js\n{\n  \"id\": \"AS\",\n  \"value\": \"AS\",\n  \"label\": \"American Samoa\"\n}\n```\n\nYou can also load options into a dropdown via the `data` setter.\n```js\n  const ur = '/data/states.json';\n  const res = await fetch(url);\n  dropdown.data = await res.json();\n  dropdown.value = 'CA';\n```\n\nFor groups you should add `group-label` attribute to `ids-list-box-option` to indicate group start, all group items should be below.\n\n```html\n<ids-dropdown id=\"dropdown-groups\" label=\"Dropdown With Groups\" value=\"opt3\">\n  <ids-list-box>\n    <ids-list-box-option group-label>Group 1</ids-list-box-option>\n    <ids-list-box-option value=\"opt1group1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2group1\">Option Two</ids-list-box-option>\n    <ids-list-box-option group-label>Group 2</ids-list-box-option>\n    <ids-list-box-option value=\"opt1group2\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2group2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo add a descriptive text at the bottom of the dropdown list that explains usage or restrictions, use the `description` attribute. This creates a non-selectable option that appears at the bottom of the list:\n\n```html\n<ids-dropdown\n  id=\"dropdown-description\"\n  label=\"Select a priority level\"\n  value=\"medium\"\n  description=\"Choose the priority level that best matches the urgency of your task\">\n  <ids-list-box>\n    <ids-list-box-option value=\"low\">Low Priority</ids-list-box-option>\n    <ids-list-box-option value=\"medium\">Medium Priority</ids-list-box-option>\n    <ids-list-box-option value=\"high\">High Priority</ids-list-box-option>\n    <ids-list-box-option value=\"urgent\">Urgent Priority</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nFor multiple descriptions, you can set them programmatically:\n\n```js\nconst dropdown = document.querySelector('#dropdown-multiple-descriptions');\ndropdown.description = [\n  'Refine search for more options',\n  'Maximum 5 items can be selected'\n];\n```\n\nIn some situations, it may be preferable to separate the IdsDropdownList element from its in-page parent element.  This can be done using the `list` attribute, and simply referencing the dropdown list by its `id` attribute.  This might be necessary for reasons such as breaking out of CSS stacking context.  Note that in this situation, it's necessary to also manually define the event handling and [Popup Interactions](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-popup-interactions-mixin/ids-popup-interactions-mixin.ts) that cause the IdsDropdownList to activate, making this ideal for custom IdsDropdown configurations:\n\n```html\n<ids-dropdown id=\"dropdown-1\" list=\"separate-list\" label=\"Dropdown (list is adjacent)\" value=\"blank\" dirty-tracker=\"true\" allow-blank=\"true\"></ids-dropdown>\n<ids-dropdown-list id=\"separate-list\">\n  <ids-list-box>\n    <ids-list-box-option value=\"blank\" id=\"blank\"><span></span></ids-list-box-option>\n    <ids-list-box-option value=\"opt1\" id=\"opt1-d8\"><span>Option One</span></ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2-d8\"><span>Option Two</span></ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown-list>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-dropdown label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n<ids-dropdown label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nControl auto-sizing behavior with the `auto-size` and `input-auto-size` attributes:\n\n```html\n<!-- Both input and popup resize based on content (default behavior when auto-size is true) -->\n<ids-dropdown label=\"Auto-size both input and popup\" auto-size=\"true\" input-auto-size=\"true\">\n  <ids-list-box>\n    <ids-list-box-option value=\"short\">Short</ids-list-box-option>\n    <ids-list-box-option value=\"long\">Very Long Option Text That Expands Both Input and Popup</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Fixed input size, only popup resizes -->\n<ids-dropdown label=\"Fixed input, auto-size popup\" auto-size=\"true\" input-auto-size=\"false\">\n  <ids-list-box>\n    <ids-list-box-option value=\"short\">Short</ids-list-box-option>\n    <ids-list-box-option value=\"long\">Very Long Option Text That Only Expands Popup</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Multi-column with fixed input size -->\n<ids-dropdown label=\"Multi-column with fixed input\" multi-column=\"true\" auto-size=\"true\" input-auto-size=\"false\">\n  <ids-list-box>\n    <ids-list-box-option value=\"en-US\">\n      <span>en-US</span>\n      <span>English (United States)</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"de-DE\">\n      <span>de-DE</span>\n      <span>German (Germany)</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\n### Dynamic Multicolumn Feature\n\nThe dynamic multicolumn feature allows dropdown options to display multiple data fields in a structured column layout. This feature automatically detects when to enable multicolumn mode and formats the display accordingly.\n\n#### Activation\n\nThe multicolumn feature requires `multi-column=\"true\"` to be set on the ids-dropdown component. There are two ways to use it:\n\n1. **Auto-detection mode**: When `columns` is not set, the feature automatically detects `\\n` (newline) characters in option labels and splits them into columns\n2. **Configured mode**: When `columns` is set, the feature uses the specified column configuration to display data properties\n\n#### Configuration\n\nUse the `columns` property to define which data properties should be displayed:\n\n```typescript\ndropdown.columns = [\n  { field: 'code', label: 'Code' },\n  { field: 'name', label: 'Name' }\n];\n\ndropdown.data = [\n  { value: 'EUR', code: 'EUR', name: 'Euro' },\n  { value: 'USD', code: 'USD', name: 'US Dollar' }\n];\n```\n\n#### Example Usage\n\n```html\n<ids-dropdown id=\"currency-dropdown\" multi-column=\"true\">\n  <ids-list-box>\n    <!-- Options dynamically generated based on data and columns -->\n  </ids-list-box>\n</ids-dropdown>\n```\n\n```typescript\nconst dropdown = document.querySelector('#currency-dropdown');\ndropdown.columns = [{ field: 'code', label: 'Code' }, { field: 'name', label: 'Name' }];\ndropdown.data = [{ value: 'EUR', code: 'EUR', name: 'Euro' }];\n```\n\n#### Display Behavior\n\n- Selected values are formatted as \"Code - Name\" (e.g., \"EUR - Euro\")\n- The `showValue` property controls whether to display raw value or formatted text\n- CSS class `.multi-column` is added to the list-box container\n- Auto-detection works with newline characters (`\\n`) for backward compatibility\n\n## Settings\n\n- `allowBlank` {boolean} Sets whether option list should include 'blank' option. To reset the value to blank, use `value='' | 'blank' | undefined | null`.\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `colorVariant` {string} set the current color variant.\n- `combobox` {boolean} Enables combobox mode, allowing users to type custom values not in the predefined list. When enabled:\n  - Click the input field to type custom text\n  - Click the dropdown button to open the options list\n  - Accepts both predefined options and custom user input\n- `compact` {boolean} sets the component to be compact mode.\n- `dirtyTracker` {boolean} Sets the dirty tracking feature on to indicate a changed\n- `disabled` {boolean} Sets dropdown to disabled\n- `errorTracker` {boolean} Replaces the standard validation error message with a compact error indicator icon inside the field. The full error message is shown as a tooltip on hover. See [Ids Error Tracker Mixin](../../mixins/ids-error-tracker-mixin/README.md) for more information.\n- `fieldHeight` {string} defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `hidden` {boolean} Hides the element from display\n- `label` {string} Sets the label text\n- `language` {string} Sets the language for RTL and inner labels\n- `labelRequired` {boolean} Sets the validation required indicator on label text, it's default to `true`\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `list` {string} ID selector used to reference/connect to an external IdsDropdownList component (used in some scenarios like IdsDataGrid filters)\n- `multi-column` {boolean} - If set to true, will make a two column on the dropdown to accommodate two spans.\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `offset-container` {string} CSS Selector for container element from which a dropdown list with position-style `fixed` should adjust itself from. Such as when a parent container has `container-type: size`, which affects the popup's fixed position calculation.\n- `overflow` {string} Sets the overflow behavior for text content. When set to 'ellipsis', text will be truncated with ellipsis when it overflows the container.\n- `placeholder` {string} Sets the placeholder text\n- `size` {`'sm' | 'md' | 'lg' | 'full' | string`} Sets the size (width)\n- `readonly` {boolean} Sets to readonly state\n- `tabbable` {boolean} When set to true, allows the dropdown and its trigger button to be included in the tab order. By default (false), the trigger button is not tabbable. Enable this for accessibility when keyboard navigation to the trigger button is required. Applies to both the dropdown input and trigger button elements\n- `text-align` {`'start' | 'center' | 'end'`} Sets the text alignment of the selected value displayed in the input field. Defaults to `start`. Use `end` for right-aligned display (e.g., numeric fields), `center` for centered display.\n- `auto-size` {boolean} Sets whether the dropdown should auto-size based on content (default: false)\n- `input-auto-size` {boolean} Sets whether the input field should auto-size when auto-size is enabled (default: true). When false, only the popup expands to fit content while the input remains fixed size\n- `validate` {'required' | string} Sets the validation routine to use\n- `validationEvents` {'blur' | string} Sets the validation events to use\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `value` {string | null | undefined} Sets option to the matching option by the `value` attribute\n- `valueResetTracking` {string | null | undefined} Sets the value option but reset dirty in one step\n- `id` {string} Sets the `id` attribute\n- `tooltip` {string | boolean} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the overflow=\"ellipsis\" and tooltip=\"true\". You can also provide custom tooltip text as a string.\n- `selectedIndex` {number} Sets the the selected option by index\n- `typeahead` {boolean} - Enable/disable typeahead functionality (true by default)\n- `clearable` {boolean} - Whether or not the value can be cleared with Backspace/Delete (false by default)\n- `clearable-text` {string} - Sets the blank option custom text. The text will not be added to the input when the option is selected\n- `description` {string|string[]} - Sets descriptive text that appears as non-selectable options at the bottom of the dropdown list. Can be a single string or array of strings for multiple descriptions. Useful for explaining usage instructions or restrictions\n- `show-loading-indicator` {boolean} - Whether or not to show loading indicator (replaces trigger button). Defaults to false.\n- `show-list-item-icon` {boolean} - If set to true and `<ids-icon>` elements are in the markup. Then icons will be shown next to the text in the dropdown list.\n- `show-value` {boolean} - If set to true, then the text displayed as selected will be the value.\n- `skip-sanitize` {boolean} - If set to true, HTML content in option values and labels will not be sanitized, allowing raw HTML to be displayed. Use with caution as this can introduce XSS vulnerabilities if user input is not properly validated.\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `columns` {IdsDropdownColumn[]} Array of column configuration objects for multicolumn layout. Each object should have `field` and `label` properties\n- `maxColumns` {number} Maximum number of columns to display (default: 10, max: 20)\n\n## Events\n\n- `change` Fires when an option is selected / changed\n- `focus` Fires at the time the dropdown is focused\n- `selected` Fires when a value is selected\n- `focus` Fires when the field gets focus\n- `selected` Fires when a value is selected\n- Some event listeners for popup `show`, `hide` events can be added to `popup` property\n\n```js\nconst dropdown = document.querySelector('ids-dropdown');\n\ndropdown.popup.addEventListener('show');\ndropdown.popup.addEventListener('hide');\n```\n\n## Methods\n\n- `beforeShow` {Promise<string>} An async function that fires as the dropdown is opening allowing you to set contents\n- `afterShow` {Function} A callback that fires after the dropdown is shown, which is useful for capturing state (e.g., selectedIndex) when the options become available.\n- `toggle` {void} Toggles the dropdown list open/closed state\n- `open` {void} Opens the dropdown list\n- `close` {void} Closes the dropdown list\n- `options` {Array<HTMLElement>} Returns the currently available options\n- `selectedOption` {HTMLElement} Returns the selected option DOM element\n- `selectedIndex` {number} Sets the the selected option by index\n\n## Themeable Parts\n\n- `trigger-field` - allows you to further style  the trigger field container\n- `input` - allows you to further style  the input in the trigger field container\n- `trigger-button` - allows you to further style the trigger field button\n- `icon` - allows you to further style the trigger field icon\n- `popup` - allows you to further style the dropdown popup\n\n## States and Variations\n\n- Valid/Invalid\n- Required\n- Readonly\n- Open/Closed\n- Disabled\n- Dirty\n- Error Tracker\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: Moves focus into and out of the dropdown input. If the list is open, this will select the currently highlighted option, close the list, and move to the next focusable element\n- <kbd>Alt + Down Arrow / Down Arrow</kbd>: Opens the dropdown list and moves focus to the selected option. If nothing is selected, then focus moves to the first option in the list. If the combobox is not editable nothing will happen.\n- <kbd>Enter</kbd>: Selects the currently highlighted item in the list, updates the input field, highlights the selected item in the dropdown list, closes the dropdown list, and returns focus to the input field.\n- <kbd>Space</kbd>: When dropdown is open, selects the currently highlighted option. When input field is focused, allows normal typing without triggering selection\n- <kbd>Escape</kbd>: Closes the dropdown list, returns focus to the edit field, and does not change the current selection.\n- <kbd>Up/Down Arrow</kbd>: Navigates through options in the dropdown list\n- <kbd>AnyKey</kbd>: Typing a letter opens the list and filters to the items that start with that letter\n\n## Responsive Guidelines\n\n- The dropdown `<input>` should size to the parent container and the `<label>` should remain on the top.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Dropdown have all new markup and classes.\n\n**4.x to 5.x**\n- The dropdown component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-dropdown></ids-dropdown>`\n- If using events, events are now plain JS events (change event when changed)\n- API is significantly different\n- No longer uses a select element\n\n## Designs\n\n[Design Specs 4.5](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n[Design Specs 4.6](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\nThe dropdown list has been coded to act similar to the [aria readonly combobox](http://whatsock.com/Templates/Comboboxes/Native%20Inputs,%20Editable%20and%20Readonly/index.htm). With some variations due to having to deal with shadowDom.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The dropdown icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-dropdown","attributes":[{"name":"is-form-component","values":[]},{"name":"dropdown-list","values":[]},{"name":"trigger","values":[]},{"name":"list-box","values":[]},{"name":"label-clicked","values":[]},{"name":"label-el","values":[]},{"name":"opened-by-keyboard","description":"Sets to true when a keyboard operation opens the dropdown (prevents extraneous event triggering)","values":[]},{"name":"closed-by-keyboard","description":"Sets to true when a keyboard operation closes the dropdown (prevents extraneous event triggering)","values":[]},{"name":"initial-value-set","values":[]},{"name":"selected-ui-row-index","description":"UI row index of the selected option, reliable even with duplicate values","values":[]},{"name":"has-selected","description":"Sets to true when processing the selection of the user","values":[]},{"name":"initial-selected-index","description":"Stores the initial selectedIndex when dropdown opens (for Escape key restoration)","values":[]},{"name":"is-canceling-selection","description":"Flag to prevent overwriting selectedIndex during cancel operations","values":[]},{"name":"selected-option-data","description":"Selected option tracking for duplicate value handling","values":[]},{"name":"options-data","values":[]},{"name":"columns-data","values":[]},{"name":"max-columns-value","values":[]},{"name":"#is-multi-select","values":[]},{"name":"typeahead-input","values":[]},{"name":"value-before-search","values":[]},{"name":"no-results-selected","values":[]},{"name":"has-icons","description":"Check if dropdown options contain icons","values":[]},{"name":"has-avatar","description":"Check if dropdown options contain avatars","values":[]},{"name":"color-variants","description":"List of available color variants for this component","values":[]},{"name":"text-align","description":"Gets the text alignment of the displayed value","values":[]},{"name":"allow-blank","description":"Gets allow-blank value","values":[]},{"name":"input","description":"Get the input element","values":[]},{"name":"popup","description":"Get the popup element","values":[]},{"name":"multi-column","description":"Get whether the dropdown displays options in multiple columns","values":[]},{"name":"show-value","description":"Get whether to show the value instead of the label text","values":[]},{"name":"value-reset-tracking","description":"Set the value of the dropdown and reset dirty tracking","values":[]},{"name":"value","description":"Get the current value of the dropdown","values":[]},{"name":"auto-size","description":"Get the auto-size setting","values":[]},{"name":"input-auto-size","description":"Get the input-auto-size setting","values":[]},{"name":"list-box-position-style","description":"Get the positioning style of the listbox popup","values":[]},{"name":"option-values","description":"Get all available option-values for the dropdown","values":[]},{"name":"labels","description":"Get all available labels of the dropdown","values":[]},{"name":"selected-option","description":"Get the selected Listbox option based on the Dropdown's value","values":[]},{"name":"selected","description":"Get the currently-selected Listbox option","values":[]},{"name":"selected-index","description":"Get the selected option index","values":[]},{"name":"options","description":"Get the currently available options","values":[]},{"name":"readonly","description":"Get the readonly state","values":[]},{"name":"disabled","description":"Get the disabled state","values":[]},{"name":"max-height","description":"Set the max height value","values":[]},{"name":"disable-tooltip","description":"Get whether tooltip is disabled","values":[]},{"name":"overflow","description":"Get the overflow behavior","values":[]},{"name":"tooltip","description":"Get the tooltip text or behavior","values":[]},{"name":"dropdown-icon-el","description":"Get the currently-displayed IdsIcon in the trigger field","values":[]},{"name":"dropdown-color-swatch","description":"Get the dropdown color swatch","values":[]},{"name":"#search-value","values":[]},{"name":"no-search","description":"Get the no search state","values":[]},{"name":"combo-box","description":"Get the combobox state","values":[]},{"name":"combo-search","description":"Get the combo search function","values":[]},{"name":"after-show","description":"Get the afterShow function","values":[]},{"name":"before-show","description":"Get the before show function","values":[]},{"name":"data","description":"Get the dropdown options data","values":[]},{"name":"columns","description":"Get the dropdown columns configuration","values":[]},{"name":"max-columns","description":"Get the maximum number of columns","values":[]},{"name":"on-language-change","description":"Handle language changes by updating ARIA attributes","values":[]},{"name":"#is-first-render","description":"Flag to track initial render state for combobox value synchronization","values":[]},{"name":"validate","description":"Get the validate attribute","values":[]},{"name":"required","description":"Get the required state","values":[]},{"name":"validation-events","description":"Get the validation events","values":[]},{"name":"offset-container","description":"Get the offset container","values":[]},{"name":"list","description":"Get the list attribute","values":[]},{"name":"margin-block-end","description":"Gets the margin-block-end token key","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"typeahead","description":"Get the typeahead attribute","values":[]},{"name":"show-no-results","description":"Get the show no results state","values":[]},{"name":"placeholder","description":"Get the placeholder attribute","values":[]},{"name":"show-loading-indicator","description":"Get the show loading indicator state","values":[]},{"name":"tabbable","description":"Gets whether the dropdown can be tabbed to","values":[]},{"name":"search-field","description":"Get the search field element","values":[]},{"name":"skip-sanitize","description":"Gets whether HTML sanitization should be skipped for labels","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-dropdown\n\n## Description\n\nThe ids-dropdown is similar to a `<select>` HTML element, with advanced selection and filtering features. See more [usage details](https://design.infor.com/components/components/dropdown).\n\n## Terminology\n\n- **Dropdown** The UX element that lives in the page and is actionable, activating the list\n- **Dropdown List** The UX element that contains and places the list within the page\n- **List Box**: The UX element that wraps the items in the dropdown\n- **List Box Option**: UX elements representing dropdown options, contained by the List Box\n\n## Features (With Code Examples)\n\nDropdown elements should be defined with `id` and `value` attributes. The value should match one of the `value` attributes contained by one of its `ids-list-box-option` elements.  When your application renders, the referenced value will cause the corresponding `ids-list-box-option` to appear selected:\n\n```html\n<ids-dropdown id=\"dropdown-2\" label=\"Readonly Dropdown\" value=\"opt3\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\">Option Six</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo show icons in the dropdown list, add an `ids-icon` and `span` to each list box `ids-list-box-option`.\n\n```html\n<ids-dropdown id=\"dropdown-5\" label=\"Dropdown with Icons\" value=\"opt2\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\">\n      <ids-icon icon=\"user-profile\"></ids-icon>\n      <span>Option One</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\">\n      <ids-icon icon=\"project\"></ids-icon>\n      <span>Option Two</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\">\n      <ids-icon icon=\"purchasing\"></ids-icon>\n      <span>Option Three</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\">\n      <ids-icon icon=\"quality\"></ids-icon>\n      <span>Option Four</span></ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\">\n      <ids-icon icon=\"rocket\"></ids-icon>\n      <span>Option Five</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\">\n      <ids-icon icon=\"roles\"></ids-icon>\n      <span>Option Six</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo show color swatch in the dropdown list, add an `ids-color` and `span` to each list box `ids-list-box-option`.\n\n```html\n<ids-dropdown id=\"dropdown-11\" label=\"Dropdown with color swatches\" show-list-item-icon=\"true\" value=\"blue\">\n  <ids-list-box>\n    <ids-list-box-option value=\"red\">\n      <ids-color color=\"--ids-color-red-70\"></ids-color>\n      <span>Red</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"orange\">\n      <ids-color color=\"--ids-color-orange-70\"></ids-color>\n      <span>Orange</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"#C2A1F1\">\n      <ids-color hex=\"#C2A1F1\"></ids-color>\n      <span>#C2A1F1</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"#3B1470\">\n      <ids-color hex=\"#3B1470\"></ids-color>\n      <span>#3B1470</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nShow tooltips on the dropdown container or options. By setting it on `ids-dropdown`, you will see the tooltip on hover for the closed dropdown. If set on the options, the tooltip will display the selected item.\n\n```html\n<ids-dropdown id=\"dropdown-6\" label=\"Dropdown with Tooltips\" tooltip=\"Additional Info\" value=\"opt2\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\" tooltip=\"Additional Info on Option One\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\" tooltip=\"Additional Info on Option Two\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\" tooltip=\"Additional Info on Option Three\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\" tooltip=\"Additional Info on Option Four\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\" tooltip=\"Additional Info on Option Five\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\" tooltip=\"Additional Info on Option Six\">Option Six</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nFor text overflow with automatic tooltips, use the `overflow` and `tooltip` attributes together:\n\n```html\n<ids-dropdown\n  id=\"dropdown-overflow\"\n  label=\"Dropdown with Ellipsis and Auto Tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  value=\"opt1\"\n  size=\"xs\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">This is a very long option text that will be truncated with ellipsis</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Another long option that demonstrates overflow behavior</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\">Short option</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nUse the `text-align` attribute to control the alignment of the selected value in the input field. This is useful for numeric or character-sorted fields that require right-aligned display:\n\n```html\n<!-- Default (start) alignment -->\n<ids-dropdown id=\"dropdown-start\" label=\"Start text alignment (default)\" value=\"opt1\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Center alignment -->\n<ids-dropdown id=\"dropdown-center\" label=\"Center text alignment\" value=\"opt1\" text-align=\"center\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- End (right) alignment — useful for numeric fields -->\n<ids-dropdown id=\"dropdown-end\" label=\"End text alignment\" value=\"opt1\" text-align=\"end\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option one</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nYou can also set it programmatically:\n\n```js\nconst dropdown = document.querySelector('#dropdown-end');\ndropdown.textAlign = 'end';\n```\n\nSometimes you might want to load the dropdown with Ajax. To do this setup the initial html. in order for the selected element to show. This must be pre-populated.\n\n```html\n<ids-dropdown id=\"dropdown-7\" label=\"Dropdown Using Ajax\" value=\"ak\">\n  <ids-list-box>\n    <ids-list-box-option value=\"ak\" id=\"ak\">Alaska</ids-list-box-option>\n </ids-list-box>\n</ids-dropdown>\n```\n\nFor the JS part set the `beforeShow` callback to an async function that returns a promise.\n\n```js\n// Use the asynchronous `beforeshow` callback to load contents\nconst dropdownAsync = document.querySelector('#dropdown-7');\n\ndropdownAsync.beforeShow = async function beforeShow() {\n  const url = '/data/states.json';\n  const res = await fetch(url);\n  const data = await res.json();\n  return data;\n};\n```\n\nThe promise should resolve and return data with id, value and label info.\n\n```js\n{\n  \"id\": \"AS\",\n  \"value\": \"AS\",\n  \"label\": \"American Samoa\"\n}\n```\n\nYou can also load options into a dropdown via the `data` setter.\n```js\n  const ur = '/data/states.json';\n  const res = await fetch(url);\n  dropdown.data = await res.json();\n  dropdown.value = 'CA';\n```\n\nFor groups you should add `group-label` attribute to `ids-list-box-option` to indicate group start, all group items should be below.\n\n```html\n<ids-dropdown id=\"dropdown-groups\" label=\"Dropdown With Groups\" value=\"opt3\">\n  <ids-list-box>\n    <ids-list-box-option group-label>Group 1</ids-list-box-option>\n    <ids-list-box-option value=\"opt1group1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2group1\">Option Two</ids-list-box-option>\n    <ids-list-box-option group-label>Group 2</ids-list-box-option>\n    <ids-list-box-option value=\"opt1group2\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2group2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nTo add a descriptive text at the bottom of the dropdown list that explains usage or restrictions, use the `description` attribute. This creates a non-selectable option that appears at the bottom of the list:\n\n```html\n<ids-dropdown\n  id=\"dropdown-description\"\n  label=\"Select a priority level\"\n  value=\"medium\"\n  description=\"Choose the priority level that best matches the urgency of your task\">\n  <ids-list-box>\n    <ids-list-box-option value=\"low\">Low Priority</ids-list-box-option>\n    <ids-list-box-option value=\"medium\">Medium Priority</ids-list-box-option>\n    <ids-list-box-option value=\"high\">High Priority</ids-list-box-option>\n    <ids-list-box-option value=\"urgent\">Urgent Priority</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nFor multiple descriptions, you can set them programmatically:\n\n```js\nconst dropdown = document.querySelector('#dropdown-multiple-descriptions');\ndropdown.description = [\n  'Refine search for more options',\n  'Maximum 5 items can be selected'\n];\n```\n\nIn some situations, it may be preferable to separate the IdsDropdownList element from its in-page parent element.  This can be done using the `list` attribute, and simply referencing the dropdown list by its `id` attribute.  This might be necessary for reasons such as breaking out of CSS stacking context.  Note that in this situation, it's necessary to also manually define the event handling and [Popup Interactions](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-popup-interactions-mixin/ids-popup-interactions-mixin.ts) that cause the IdsDropdownList to activate, making this ideal for custom IdsDropdown configurations:\n\n```html\n<ids-dropdown id=\"dropdown-1\" list=\"separate-list\" label=\"Dropdown (list is adjacent)\" value=\"blank\" dirty-tracker=\"true\" allow-blank=\"true\"></ids-dropdown>\n<ids-dropdown-list id=\"separate-list\">\n  <ids-list-box>\n    <ids-list-box-option value=\"blank\" id=\"blank\"><span></span></ids-list-box-option>\n    <ids-list-box-option value=\"opt1\" id=\"opt1-d8\"><span>Option One</span></ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2-d8\"><span>Option Two</span></ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown-list>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-dropdown label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n<ids-dropdown label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\">Option Two</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\nControl auto-sizing behavior with the `auto-size` and `input-auto-size` attributes:\n\n```html\n<!-- Both input and popup resize based on content (default behavior when auto-size is true) -->\n<ids-dropdown label=\"Auto-size both input and popup\" auto-size=\"true\" input-auto-size=\"true\">\n  <ids-list-box>\n    <ids-list-box-option value=\"short\">Short</ids-list-box-option>\n    <ids-list-box-option value=\"long\">Very Long Option Text That Expands Both Input and Popup</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Fixed input size, only popup resizes -->\n<ids-dropdown label=\"Fixed input, auto-size popup\" auto-size=\"true\" input-auto-size=\"false\">\n  <ids-list-box>\n    <ids-list-box-option value=\"short\">Short</ids-list-box-option>\n    <ids-list-box-option value=\"long\">Very Long Option Text That Only Expands Popup</ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n\n<!-- Multi-column with fixed input size -->\n<ids-dropdown label=\"Multi-column with fixed input\" multi-column=\"true\" auto-size=\"true\" input-auto-size=\"false\">\n  <ids-list-box>\n    <ids-list-box-option value=\"en-US\">\n      <span>en-US</span>\n      <span>English (United States)</span>\n    </ids-list-box-option>\n    <ids-list-box-option value=\"de-DE\">\n      <span>de-DE</span>\n      <span>German (Germany)</span>\n    </ids-list-box-option>\n  </ids-list-box>\n</ids-dropdown>\n```\n\n### Dynamic Multicolumn Feature\n\nThe dynamic multicolumn feature allows dropdown options to display multiple data fields in a structured column layout. This feature automatically detects when to enable multicolumn mode and formats the display accordingly.\n\n#### Activation\n\nThe multicolumn feature requires `multi-column=\"true\"` to be set on the ids-dropdown component. There are two ways to use it:\n\n1. **Auto-detection mode**: When `columns` is not set, the feature automatically detects `\\n` (newline) characters in option labels and splits them into columns\n2. **Configured mode**: When `columns` is set, the feature uses the specified column configuration to display data properties\n\n#### Configuration\n\nUse the `columns` property to define which data properties should be displayed:\n\n```typescript\ndropdown.columns = [\n  { field: 'code', label: 'Code' },\n  { field: 'name', label: 'Name' }\n];\n\ndropdown.data = [\n  { value: 'EUR', code: 'EUR', name: 'Euro' },\n  { value: 'USD', code: 'USD', name: 'US Dollar' }\n];\n```\n\n#### Example Usage\n\n```html\n<ids-dropdown id=\"currency-dropdown\" multi-column=\"true\">\n  <ids-list-box>\n    <!-- Options dynamically generated based on data and columns -->\n  </ids-list-box>\n</ids-dropdown>\n```\n\n```typescript\nconst dropdown = document.querySelector('#currency-dropdown');\ndropdown.columns = [{ field: 'code', label: 'Code' }, { field: 'name', label: 'Name' }];\ndropdown.data = [{ value: 'EUR', code: 'EUR', name: 'Euro' }];\n```\n\n#### Display Behavior\n\n- Selected values are formatted as \"Code - Name\" (e.g., \"EUR - Euro\")\n- The `showValue` property controls whether to display raw value or formatted text\n- CSS class `.multi-column` is added to the list-box container\n- Auto-detection works with newline characters (`\\n`) for backward compatibility\n\n## Settings\n\n- `allowBlank` {boolean} Sets whether option list should include 'blank' option. To reset the value to blank, use `value='' | 'blank' | undefined | null`.\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `colorVariant` {string} set the current color variant.\n- `combobox` {boolean} Enables combobox mode, allowing users to type custom values not in the predefined list. When enabled:\n  - Click the input field to type custom text\n  - Click the dropdown button to open the options list\n  - Accepts both predefined options and custom user input\n- `compact` {boolean} sets the component to be compact mode.\n- `dirtyTracker` {boolean} Sets the dirty tracking feature on to indicate a changed\n- `disabled` {boolean} Sets dropdown to disabled\n- `errorTracker` {boolean} Replaces the standard validation error message with a compact error indicator icon inside the field. The full error message is shown as a tooltip on hover. See [Ids Error Tracker Mixin](../../mixins/ids-error-tracker-mixin/README.md) for more information.\n- `fieldHeight` {string} defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `hidden` {boolean} Hides the element from display\n- `label` {string} Sets the label text\n- `language` {string} Sets the language for RTL and inner labels\n- `labelRequired` {boolean} Sets the validation required indicator on label text, it's default to `true`\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `list` {string} ID selector used to reference/connect to an external IdsDropdownList component (used in some scenarios like IdsDataGrid filters)\n- `multi-column` {boolean} - If set to true, will make a two column on the dropdown to accommodate two spans.\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `offset-container` {string} CSS Selector for container element from which a dropdown list with position-style `fixed` should adjust itself from. Such as when a parent container has `container-type: size`, which affects the popup's fixed position calculation.\n- `overflow` {string} Sets the overflow behavior for text content. When set to 'ellipsis', text will be truncated with ellipsis when it overflows the container.\n- `placeholder` {string} Sets the placeholder text\n- `size` {`'sm' | 'md' | 'lg' | 'full' | string`} Sets the size (width)\n- `readonly` {boolean} Sets to readonly state\n- `tabbable` {boolean} When set to true, allows the dropdown and its trigger button to be included in the tab order. By default (false), the trigger button is not tabbable. Enable this for accessibility when keyboard navigation to the trigger button is required. Applies to both the dropdown input and trigger button elements\n- `text-align` {`'start' | 'center' | 'end'`} Sets the text alignment of the selected value displayed in the input field. Defaults to `start`. Use `end` for right-aligned display (e.g., numeric fields), `center` for centered display.\n- `auto-size` {boolean} Sets whether the dropdown should auto-size based on content (default: false)\n- `input-auto-size` {boolean} Sets whether the input field should auto-size when auto-size is enabled (default: true). When false, only the popup expands to fit content while the input remains fixed size\n- `validate` {'required' | string} Sets the validation routine to use\n- `validationEvents` {'blur' | string} Sets the validation events to use\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `value` {string | null | undefined} Sets option to the matching option by the `value` attribute\n- `valueResetTracking` {string | null | undefined} Sets the value option but reset dirty in one step\n- `id` {string} Sets the `id` attribute\n- `tooltip` {string | boolean} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the overflow=\"ellipsis\" and tooltip=\"true\". You can also provide custom tooltip text as a string.\n- `selectedIndex` {number} Sets the the selected option by index\n- `typeahead` {boolean} - Enable/disable typeahead functionality (true by default)\n- `clearable` {boolean} - Whether or not the value can be cleared with Backspace/Delete (false by default)\n- `clearable-text` {string} - Sets the blank option custom text. The text will not be added to the input when the option is selected\n- `description` {string|string[]} - Sets descriptive text that appears as non-selectable options at the bottom of the dropdown list. Can be a single string or array of strings for multiple descriptions. Useful for explaining usage instructions or restrictions\n- `show-loading-indicator` {boolean} - Whether or not to show loading indicator (replaces trigger button). Defaults to false.\n- `show-list-item-icon` {boolean} - If set to true and `<ids-icon>` elements are in the markup. Then icons will be shown next to the text in the dropdown list.\n- `show-value` {boolean} - If set to true, then the text displayed as selected will be the value.\n- `skip-sanitize` {boolean} - If set to true, HTML content in option values and labels will not be sanitized, allowing raw HTML to be displayed. Use with caution as this can introduce XSS vulnerabilities if user input is not properly validated.\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `columns` {IdsDropdownColumn[]} Array of column configuration objects for multicolumn layout. Each object should have `field` and `label` properties\n- `maxColumns` {number} Maximum number of columns to display (default: 10, max: 20)\n\n## Events\n\n- `change` Fires when an option is selected / changed\n- `focus` Fires at the time the dropdown is focused\n- `selected` Fires when a value is selected\n- `focus` Fires when the field gets focus\n- `selected` Fires when a value is selected\n- Some event listeners for popup `show`, `hide` events can be added to `popup` property\n\n```js\nconst dropdown = document.querySelector('ids-dropdown');\n\ndropdown.popup.addEventListener('show');\ndropdown.popup.addEventListener('hide');\n```\n\n## Methods\n\n- `beforeShow` {Promise<string>} An async function that fires as the dropdown is opening allowing you to set contents\n- `afterShow` {Function} A callback that fires after the dropdown is shown, which is useful for capturing state (e.g., selectedIndex) when the options become available.\n- `toggle` {void} Toggles the dropdown list open/closed state\n- `open` {void} Opens the dropdown list\n- `close` {void} Closes the dropdown list\n- `options` {Array<HTMLElement>} Returns the currently available options\n- `selectedOption` {HTMLElement} Returns the selected option DOM element\n- `selectedIndex` {number} Sets the the selected option by index\n\n## Themeable Parts\n\n- `trigger-field` - allows you to further style  the trigger field container\n- `input` - allows you to further style  the input in the trigger field container\n- `trigger-button` - allows you to further style the trigger field button\n- `icon` - allows you to further style the trigger field icon\n- `popup` - allows you to further style the dropdown popup\n\n## States and Variations\n\n- Valid/Invalid\n- Required\n- Readonly\n- Open/Closed\n- Disabled\n- Dirty\n- Error Tracker\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: Moves focus into and out of the dropdown input. If the list is open, this will select the currently highlighted option, close the list, and move to the next focusable element\n- <kbd>Alt + Down Arrow / Down Arrow</kbd>: Opens the dropdown list and moves focus to the selected option. If nothing is selected, then focus moves to the first option in the list. If the combobox is not editable nothing will happen.\n- <kbd>Enter</kbd>: Selects the currently highlighted item in the list, updates the input field, highlights the selected item in the dropdown list, closes the dropdown list, and returns focus to the input field.\n- <kbd>Space</kbd>: When dropdown is open, selects the currently highlighted option. When input field is focused, allows normal typing without triggering selection\n- <kbd>Escape</kbd>: Closes the dropdown list, returns focus to the edit field, and does not change the current selection.\n- <kbd>Up/Down Arrow</kbd>: Navigates through options in the dropdown list\n- <kbd>AnyKey</kbd>: Typing a letter opens the list and filters to the items that start with that letter\n\n## Responsive Guidelines\n\n- The dropdown `<input>` should size to the parent container and the `<label>` should remain on the top.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Dropdown have all new markup and classes.\n\n**4.x to 5.x**\n- The dropdown component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-dropdown></ids-dropdown>`\n- If using events, events are now plain JS events (change event when changed)\n- API is significantly different\n- No longer uses a select element\n\n## Designs\n\n[Design Specs 4.5](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n[Design Specs 4.6](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\nThe dropdown list has been coded to act similar to the [aria readonly combobox](http://whatsock.com/Templates/Comboboxes/Native%20Inputs,%20Editable%20and%20Readonly/index.htm). With some variations due to having to deal with shadowDom.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The dropdown icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-editor-clean-utils","description":{"kind":"markdown","value":"# ids-editor\n\n## Description\n\nEditor component let you can control the appearance of your HTML text using the rich text formats. The editor toolbar provides various buttons for editing and formatting your content. You may use the editor component to displayed multiple styles, colors, alignments, or include images and hyperlinks as well.\n\n## Use Cases\n\n- Editor component use to rich text formats.\n- To displayed multiple styles, colors and alignments.\n- You may use to include images, hyperlinks and order/un-order lists.\n\n## Terminology\n\n**Toolbar:** Collection of buttons to apply various type of rich text formats.\n**Editor Container:** Editor container implemented using a `contenteditable` element.\n**Source Container:** A textarea element use as container to edit source mode.\n\n## Features (With Code Examples)\n\nA normal editor used as a web component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nReadonly editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" readonly>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDisabled editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" disabled>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDirty tracking editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" dirty-tracker>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nValidation (required) editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" validate=\"required\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nCustom toolbar with editor component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <ids-toolbar slot=\"toolbar\" tabbable type=\"formatter\">\n    <ids-toolbar-section type=\"buttonset\">\n      <ids-button editor-action=\"bold\" square=\"true\" tooltip=\"Toggle Bold Text\">\n        <span class=\"audible\">Bold</span>\n        <ids-icon icon=\"bold\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"italic\" square=\"true\" tooltip=\"Toggle Italic Text\">\n        <span class=\"audible\">Italic</span>\n        <ids-icon icon=\"italic\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"underline\" square=\"true\" tooltip=\"Toggle Underline Text\">\n        <span class=\"audible\">Underline</span>\n        <ids-icon icon=\"underline\"></ids-icon>\n      </ids-button>\n      <ids-separator vertical></ids-separator>\n      <ids-button editor-action=\"sourcemode\" square=\"true\" tooltip=\"View Source\">\n        <span class=\"audible\">View Source</span>\n        <ids-icon icon=\"html\" width=\"38\" viewbox=\"0 0 54 18\"></ids-icon>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor init with source mode.\n\n```html\n<ids-editor label=\"Demo Editor\" view=\"source\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with hidden label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"hidden\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with collapsed label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"collapsed\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor placeholder.\n\n```html\n<ids-editor label=\"Demo Editor\" placeholder=\"Type some text here...\">\n</ids-editor>\n```\n\nEditor use source formatter\n\n```html\n<ids-editor label=\"Demo Editor\" source-formatter>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor use clickable hyperlink\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text <a href=\"https://www.example.com/\" class=\"hyperlink\" contenteditable=\"false\" target=\"_blank\">example hyperlink</a></p>\n</ids-editor>\n```\n\nCustom default values in modals (ie. hyperlink modal)\n\n```html\n<ids-editor id=\"editor-demo\" label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\n```javaScript\nconst modals = {\n  hyperlink: {\n    url: 'http://www.example.com',\n    classes: 'hyperlink',\n    targets: [\n      { text: 'Same Window', value: '' },\n      { text: 'New Window', value: '_blank', selected: true }\n    ],\n    isClickable: false,\n    showIsClickable: true\n  },\n  insertimage: {\n    url: '../assets/images/placeholder-154x120.png',\n    alt: ''\n  }\n};\nconst editorEl = document.querySelector('#editor-demo');\neditorEl.modalElementsValue(modals);\n```\n\n## Settings and Attributes\n\n- `value` {string} Sets the editor's innerHTML (after sanitizing)\n- `disabled` {boolean} Sets the editor to disabled state\n- `label` {string} Set the editor aria label text\n- `label-state` {null|string} Controls the visible state of the label.  When using `hidden`, the label will not be displayed but will still take up physical space on a form.  When using `collapsed`, the label is hidden and does not take up space.\n- `labelRequired` {boolean} Set required indicator (red '*') to be hidden or shown\n- `paragraphSeparator` {string} Set the placeholder text for editor\n- `placeholder` {string} Sets the editor node to be selectable\n- `readonly` {boolean} Sets the editor to readonly state\n- `sourceFormatter` {boolean} Sets to be use source formatter for editor\n- `view` {string|'editor'|'source' } Set the view mode for editor\n- `height` {string } Set editor's height from the default 300px (plus toolbar height). This height can be dynamic for flexible height for example `calc(100vh - 262px)`.\n\n## Theme-able Parts\n\n- `editor` - allows you to further style the editor element\n- `editor-label` - allows you to further style the editor label element\n- `main-container` - allows you to further style the main container element\n- `toolbar-container` - allows you to further style the toolbar container element\n- `editor-container` - allows you to further style the editor container element\n- `source-container` - allows you to further style the source container element\n\n## Events\n\n- `beforeeditormode` Fires before change view to editor mode, you can return false in the response to veto\n- `aftereditormode` Fires after change view to editor mode\n- `beforesourcemode` Fires before change view to source mode, you can return false in the response to veto\n- `aftersourcemode` Fires after change view to source mode\n- `viewchange` Fires after requested view mode changed\n- `rejectviewchange` Fires if requested view mode reject\n- `beforepaste` Fires before paste, you can return false in the response to veto\n- `afterpaste` Fires after paste content\n- `rejectpaste` Fires if reject paste content\n- `initialize` Fires after initialize\n- `change` Fires after value change\n\n## Methods\n\n- `modalElementsValue(modals: object): HTMLElement` Set default value to each element in modals\n- `sourceTextareaLabel(): string` Get label text for source textarea\n\n## States and Variations (With Code Examples)\n\n- Custom Toolbar: End user can set custom toolbar buttons\n- Disabled: Disabled editor cannot be clicked, hovered, focused or selected\n- Readonly: Editor content readonly\n- Dirty Tracking: Content changes can be track by display dirty icon in editor\n- Validation: Can be check of required validation\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the editor.\n- <kbd>Ctrl + B</kbd>: Make text bold.\n- <kbd>Ctrl + I</kbd>: Make text italicize.\n- <kbd>Ctrl + U</kbd>: Make text underline.\n- <kbd>Ctrl + Shift + S</kbd>: Make text strike through.\n- <kbd>Ctrl + Shift + Equal</kbd>: Make text super script.\n- <kbd>Ctrl + Equal</kbd>: Make text sub script.\n- <kbd>Ctrl + Alt + Digit1</kbd>: Make header 1.\n- <kbd>Ctrl + Alt + Digit2</kbd>: Make header 2.\n- <kbd>Ctrl + Alt + Digit3</kbd>: Make header 3.\n- <kbd>Ctrl + Alt + Digit4</kbd>: Make header 4.\n- <kbd>Ctrl + Alt + Digit5</kbd>: Make header 5.\n- <kbd>Ctrl + Alt + Digit6</kbd>: Make header 6.\n- <kbd>Ctrl + Shift + Alt + K</kbd>: Change text fore color.\n- <kbd>Ctrl + Shift + O</kbd>: Insert ordered list.\n- <kbd>Ctrl + Shift + U</kbd>: Insert unordered list.\n- <kbd>Ctrl + Shift + I</kbd>: Insert image.\n- <kbd>Ctrl + K</kbd>: Insert/Update hyperlink.\n- <kbd>Ctrl + Shift + K</kbd>: Make unlink the hyperlink.\n- <kbd>Ctrl + Shift + L</kbd>: Insert horizontal line.\n- <kbd>Ctrl + L</kbd>: Make text align left.\n- <kbd>Ctrl + R</kbd>: Make text align right.\n- <kbd>Ctrl + E</kbd>: Make text align center.\n- <kbd>Ctrl + J</kbd>: Make text align justify.\n- <kbd>Ctrl + Shift + Space</kbd>: Clear formatting.\n- <kbd>Ctrl + Y</kbd>: History redo.\n- <kbd>Ctrl + Z</kbd>: History undo.\n- <kbd>Ctrl + Shift + Backquote</kbd>: Switch editor view mode.\n- <kbd>Ctrl + Backquote</kbd>: Switch source view mode.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Editor have all new markup and classes.\n\n**4.x to 5.x**\n- The Editor component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-editor><div slot=\"content\"><p>Some sample text</p></div></ids-editor>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/UoCNFBhmjVZZ9CxLHQ54Mq/IDS-Editor?node-id=1%3A7)\n\n## Accessibility Guidelines\n\n- Editor container contained in the element has a `role=\"textbox\"`, `aria-multiline=\"true\"` and `aria-labelledby`\n- Source container contained textarea with audible label\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n"}},{"name":"ids-editor-formatters","description":{"kind":"markdown","value":"# ids-editor\n\n## Description\n\nEditor component let you can control the appearance of your HTML text using the rich text formats. The editor toolbar provides various buttons for editing and formatting your content. You may use the editor component to displayed multiple styles, colors, alignments, or include images and hyperlinks as well.\n\n## Use Cases\n\n- Editor component use to rich text formats.\n- To displayed multiple styles, colors and alignments.\n- You may use to include images, hyperlinks and order/un-order lists.\n\n## Terminology\n\n**Toolbar:** Collection of buttons to apply various type of rich text formats.\n**Editor Container:** Editor container implemented using a `contenteditable` element.\n**Source Container:** A textarea element use as container to edit source mode.\n\n## Features (With Code Examples)\n\nA normal editor used as a web component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nReadonly editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" readonly>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDisabled editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" disabled>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDirty tracking editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" dirty-tracker>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nValidation (required) editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" validate=\"required\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nCustom toolbar with editor component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <ids-toolbar slot=\"toolbar\" tabbable type=\"formatter\">\n    <ids-toolbar-section type=\"buttonset\">\n      <ids-button editor-action=\"bold\" square=\"true\" tooltip=\"Toggle Bold Text\">\n        <span class=\"audible\">Bold</span>\n        <ids-icon icon=\"bold\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"italic\" square=\"true\" tooltip=\"Toggle Italic Text\">\n        <span class=\"audible\">Italic</span>\n        <ids-icon icon=\"italic\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"underline\" square=\"true\" tooltip=\"Toggle Underline Text\">\n        <span class=\"audible\">Underline</span>\n        <ids-icon icon=\"underline\"></ids-icon>\n      </ids-button>\n      <ids-separator vertical></ids-separator>\n      <ids-button editor-action=\"sourcemode\" square=\"true\" tooltip=\"View Source\">\n        <span class=\"audible\">View Source</span>\n        <ids-icon icon=\"html\" width=\"38\" viewbox=\"0 0 54 18\"></ids-icon>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor init with source mode.\n\n```html\n<ids-editor label=\"Demo Editor\" view=\"source\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with hidden label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"hidden\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with collapsed label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"collapsed\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor placeholder.\n\n```html\n<ids-editor label=\"Demo Editor\" placeholder=\"Type some text here...\">\n</ids-editor>\n```\n\nEditor use source formatter\n\n```html\n<ids-editor label=\"Demo Editor\" source-formatter>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor use clickable hyperlink\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text <a href=\"https://www.example.com/\" class=\"hyperlink\" contenteditable=\"false\" target=\"_blank\">example hyperlink</a></p>\n</ids-editor>\n```\n\nCustom default values in modals (ie. hyperlink modal)\n\n```html\n<ids-editor id=\"editor-demo\" label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\n```javaScript\nconst modals = {\n  hyperlink: {\n    url: 'http://www.example.com',\n    classes: 'hyperlink',\n    targets: [\n      { text: 'Same Window', value: '' },\n      { text: 'New Window', value: '_blank', selected: true }\n    ],\n    isClickable: false,\n    showIsClickable: true\n  },\n  insertimage: {\n    url: '../assets/images/placeholder-154x120.png',\n    alt: ''\n  }\n};\nconst editorEl = document.querySelector('#editor-demo');\neditorEl.modalElementsValue(modals);\n```\n\n## Settings and Attributes\n\n- `value` {string} Sets the editor's innerHTML (after sanitizing)\n- `disabled` {boolean} Sets the editor to disabled state\n- `label` {string} Set the editor aria label text\n- `label-state` {null|string} Controls the visible state of the label.  When using `hidden`, the label will not be displayed but will still take up physical space on a form.  When using `collapsed`, the label is hidden and does not take up space.\n- `labelRequired` {boolean} Set required indicator (red '*') to be hidden or shown\n- `paragraphSeparator` {string} Set the placeholder text for editor\n- `placeholder` {string} Sets the editor node to be selectable\n- `readonly` {boolean} Sets the editor to readonly state\n- `sourceFormatter` {boolean} Sets to be use source formatter for editor\n- `view` {string|'editor'|'source' } Set the view mode for editor\n- `height` {string } Set editor's height from the default 300px (plus toolbar height). This height can be dynamic for flexible height for example `calc(100vh - 262px)`.\n\n## Theme-able Parts\n\n- `editor` - allows you to further style the editor element\n- `editor-label` - allows you to further style the editor label element\n- `main-container` - allows you to further style the main container element\n- `toolbar-container` - allows you to further style the toolbar container element\n- `editor-container` - allows you to further style the editor container element\n- `source-container` - allows you to further style the source container element\n\n## Events\n\n- `beforeeditormode` Fires before change view to editor mode, you can return false in the response to veto\n- `aftereditormode` Fires after change view to editor mode\n- `beforesourcemode` Fires before change view to source mode, you can return false in the response to veto\n- `aftersourcemode` Fires after change view to source mode\n- `viewchange` Fires after requested view mode changed\n- `rejectviewchange` Fires if requested view mode reject\n- `beforepaste` Fires before paste, you can return false in the response to veto\n- `afterpaste` Fires after paste content\n- `rejectpaste` Fires if reject paste content\n- `initialize` Fires after initialize\n- `change` Fires after value change\n\n## Methods\n\n- `modalElementsValue(modals: object): HTMLElement` Set default value to each element in modals\n- `sourceTextareaLabel(): string` Get label text for source textarea\n\n## States and Variations (With Code Examples)\n\n- Custom Toolbar: End user can set custom toolbar buttons\n- Disabled: Disabled editor cannot be clicked, hovered, focused or selected\n- Readonly: Editor content readonly\n- Dirty Tracking: Content changes can be track by display dirty icon in editor\n- Validation: Can be check of required validation\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the editor.\n- <kbd>Ctrl + B</kbd>: Make text bold.\n- <kbd>Ctrl + I</kbd>: Make text italicize.\n- <kbd>Ctrl + U</kbd>: Make text underline.\n- <kbd>Ctrl + Shift + S</kbd>: Make text strike through.\n- <kbd>Ctrl + Shift + Equal</kbd>: Make text super script.\n- <kbd>Ctrl + Equal</kbd>: Make text sub script.\n- <kbd>Ctrl + Alt + Digit1</kbd>: Make header 1.\n- <kbd>Ctrl + Alt + Digit2</kbd>: Make header 2.\n- <kbd>Ctrl + Alt + Digit3</kbd>: Make header 3.\n- <kbd>Ctrl + Alt + Digit4</kbd>: Make header 4.\n- <kbd>Ctrl + Alt + Digit5</kbd>: Make header 5.\n- <kbd>Ctrl + Alt + Digit6</kbd>: Make header 6.\n- <kbd>Ctrl + Shift + Alt + K</kbd>: Change text fore color.\n- <kbd>Ctrl + Shift + O</kbd>: Insert ordered list.\n- <kbd>Ctrl + Shift + U</kbd>: Insert unordered list.\n- <kbd>Ctrl + Shift + I</kbd>: Insert image.\n- <kbd>Ctrl + K</kbd>: Insert/Update hyperlink.\n- <kbd>Ctrl + Shift + K</kbd>: Make unlink the hyperlink.\n- <kbd>Ctrl + Shift + L</kbd>: Insert horizontal line.\n- <kbd>Ctrl + L</kbd>: Make text align left.\n- <kbd>Ctrl + R</kbd>: Make text align right.\n- <kbd>Ctrl + E</kbd>: Make text align center.\n- <kbd>Ctrl + J</kbd>: Make text align justify.\n- <kbd>Ctrl + Shift + Space</kbd>: Clear formatting.\n- <kbd>Ctrl + Y</kbd>: History redo.\n- <kbd>Ctrl + Z</kbd>: History undo.\n- <kbd>Ctrl + Shift + Backquote</kbd>: Switch editor view mode.\n- <kbd>Ctrl + Backquote</kbd>: Switch source view mode.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Editor have all new markup and classes.\n\n**4.x to 5.x**\n- The Editor component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-editor><div slot=\"content\"><p>Some sample text</p></div></ids-editor>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/UoCNFBhmjVZZ9CxLHQ54Mq/IDS-Editor?node-id=1%3A7)\n\n## Accessibility Guidelines\n\n- Editor container contained in the element has a `role=\"textbox\"`, `aria-multiline=\"true\"` and `aria-labelledby`\n- Source container contained textarea with audible label\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n"}},{"name":"ids-editor-handle-paste","description":{"kind":"markdown","value":"# ids-editor\n\n## Description\n\nEditor component let you can control the appearance of your HTML text using the rich text formats. The editor toolbar provides various buttons for editing and formatting your content. You may use the editor component to displayed multiple styles, colors, alignments, or include images and hyperlinks as well.\n\n## Use Cases\n\n- Editor component use to rich text formats.\n- To displayed multiple styles, colors and alignments.\n- You may use to include images, hyperlinks and order/un-order lists.\n\n## Terminology\n\n**Toolbar:** Collection of buttons to apply various type of rich text formats.\n**Editor Container:** Editor container implemented using a `contenteditable` element.\n**Source Container:** A textarea element use as container to edit source mode.\n\n## Features (With Code Examples)\n\nA normal editor used as a web component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nReadonly editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" readonly>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDisabled editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" disabled>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDirty tracking editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" dirty-tracker>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nValidation (required) editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" validate=\"required\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nCustom toolbar with editor component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <ids-toolbar slot=\"toolbar\" tabbable type=\"formatter\">\n    <ids-toolbar-section type=\"buttonset\">\n      <ids-button editor-action=\"bold\" square=\"true\" tooltip=\"Toggle Bold Text\">\n        <span class=\"audible\">Bold</span>\n        <ids-icon icon=\"bold\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"italic\" square=\"true\" tooltip=\"Toggle Italic Text\">\n        <span class=\"audible\">Italic</span>\n        <ids-icon icon=\"italic\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"underline\" square=\"true\" tooltip=\"Toggle Underline Text\">\n        <span class=\"audible\">Underline</span>\n        <ids-icon icon=\"underline\"></ids-icon>\n      </ids-button>\n      <ids-separator vertical></ids-separator>\n      <ids-button editor-action=\"sourcemode\" square=\"true\" tooltip=\"View Source\">\n        <span class=\"audible\">View Source</span>\n        <ids-icon icon=\"html\" width=\"38\" viewbox=\"0 0 54 18\"></ids-icon>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor init with source mode.\n\n```html\n<ids-editor label=\"Demo Editor\" view=\"source\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with hidden label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"hidden\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with collapsed label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"collapsed\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor placeholder.\n\n```html\n<ids-editor label=\"Demo Editor\" placeholder=\"Type some text here...\">\n</ids-editor>\n```\n\nEditor use source formatter\n\n```html\n<ids-editor label=\"Demo Editor\" source-formatter>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor use clickable hyperlink\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text <a href=\"https://www.example.com/\" class=\"hyperlink\" contenteditable=\"false\" target=\"_blank\">example hyperlink</a></p>\n</ids-editor>\n```\n\nCustom default values in modals (ie. hyperlink modal)\n\n```html\n<ids-editor id=\"editor-demo\" label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\n```javaScript\nconst modals = {\n  hyperlink: {\n    url: 'http://www.example.com',\n    classes: 'hyperlink',\n    targets: [\n      { text: 'Same Window', value: '' },\n      { text: 'New Window', value: '_blank', selected: true }\n    ],\n    isClickable: false,\n    showIsClickable: true\n  },\n  insertimage: {\n    url: '../assets/images/placeholder-154x120.png',\n    alt: ''\n  }\n};\nconst editorEl = document.querySelector('#editor-demo');\neditorEl.modalElementsValue(modals);\n```\n\n## Settings and Attributes\n\n- `value` {string} Sets the editor's innerHTML (after sanitizing)\n- `disabled` {boolean} Sets the editor to disabled state\n- `label` {string} Set the editor aria label text\n- `label-state` {null|string} Controls the visible state of the label.  When using `hidden`, the label will not be displayed but will still take up physical space on a form.  When using `collapsed`, the label is hidden and does not take up space.\n- `labelRequired` {boolean} Set required indicator (red '*') to be hidden or shown\n- `paragraphSeparator` {string} Set the placeholder text for editor\n- `placeholder` {string} Sets the editor node to be selectable\n- `readonly` {boolean} Sets the editor to readonly state\n- `sourceFormatter` {boolean} Sets to be use source formatter for editor\n- `view` {string|'editor'|'source' } Set the view mode for editor\n- `height` {string } Set editor's height from the default 300px (plus toolbar height). This height can be dynamic for flexible height for example `calc(100vh - 262px)`.\n\n## Theme-able Parts\n\n- `editor` - allows you to further style the editor element\n- `editor-label` - allows you to further style the editor label element\n- `main-container` - allows you to further style the main container element\n- `toolbar-container` - allows you to further style the toolbar container element\n- `editor-container` - allows you to further style the editor container element\n- `source-container` - allows you to further style the source container element\n\n## Events\n\n- `beforeeditormode` Fires before change view to editor mode, you can return false in the response to veto\n- `aftereditormode` Fires after change view to editor mode\n- `beforesourcemode` Fires before change view to source mode, you can return false in the response to veto\n- `aftersourcemode` Fires after change view to source mode\n- `viewchange` Fires after requested view mode changed\n- `rejectviewchange` Fires if requested view mode reject\n- `beforepaste` Fires before paste, you can return false in the response to veto\n- `afterpaste` Fires after paste content\n- `rejectpaste` Fires if reject paste content\n- `initialize` Fires after initialize\n- `change` Fires after value change\n\n## Methods\n\n- `modalElementsValue(modals: object): HTMLElement` Set default value to each element in modals\n- `sourceTextareaLabel(): string` Get label text for source textarea\n\n## States and Variations (With Code Examples)\n\n- Custom Toolbar: End user can set custom toolbar buttons\n- Disabled: Disabled editor cannot be clicked, hovered, focused or selected\n- Readonly: Editor content readonly\n- Dirty Tracking: Content changes can be track by display dirty icon in editor\n- Validation: Can be check of required validation\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the editor.\n- <kbd>Ctrl + B</kbd>: Make text bold.\n- <kbd>Ctrl + I</kbd>: Make text italicize.\n- <kbd>Ctrl + U</kbd>: Make text underline.\n- <kbd>Ctrl + Shift + S</kbd>: Make text strike through.\n- <kbd>Ctrl + Shift + Equal</kbd>: Make text super script.\n- <kbd>Ctrl + Equal</kbd>: Make text sub script.\n- <kbd>Ctrl + Alt + Digit1</kbd>: Make header 1.\n- <kbd>Ctrl + Alt + Digit2</kbd>: Make header 2.\n- <kbd>Ctrl + Alt + Digit3</kbd>: Make header 3.\n- <kbd>Ctrl + Alt + Digit4</kbd>: Make header 4.\n- <kbd>Ctrl + Alt + Digit5</kbd>: Make header 5.\n- <kbd>Ctrl + Alt + Digit6</kbd>: Make header 6.\n- <kbd>Ctrl + Shift + Alt + K</kbd>: Change text fore color.\n- <kbd>Ctrl + Shift + O</kbd>: Insert ordered list.\n- <kbd>Ctrl + Shift + U</kbd>: Insert unordered list.\n- <kbd>Ctrl + Shift + I</kbd>: Insert image.\n- <kbd>Ctrl + K</kbd>: Insert/Update hyperlink.\n- <kbd>Ctrl + Shift + K</kbd>: Make unlink the hyperlink.\n- <kbd>Ctrl + Shift + L</kbd>: Insert horizontal line.\n- <kbd>Ctrl + L</kbd>: Make text align left.\n- <kbd>Ctrl + R</kbd>: Make text align right.\n- <kbd>Ctrl + E</kbd>: Make text align center.\n- <kbd>Ctrl + J</kbd>: Make text align justify.\n- <kbd>Ctrl + Shift + Space</kbd>: Clear formatting.\n- <kbd>Ctrl + Y</kbd>: History redo.\n- <kbd>Ctrl + Z</kbd>: History undo.\n- <kbd>Ctrl + Shift + Backquote</kbd>: Switch editor view mode.\n- <kbd>Ctrl + Backquote</kbd>: Switch source view mode.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Editor have all new markup and classes.\n\n**4.x to 5.x**\n- The Editor component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-editor><div slot=\"content\"><p>Some sample text</p></div></ids-editor>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/UoCNFBhmjVZZ9CxLHQ54Mq/IDS-Editor?node-id=1%3A7)\n\n## Accessibility Guidelines\n\n- Editor container contained in the element has a `role=\"textbox\"`, `aria-multiline=\"true\"` and `aria-labelledby`\n- Source container contained textarea with audible label\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n"}},{"name":"ids-editor-selection-utils","description":{"kind":"markdown","value":"# ids-editor\n\n## Description\n\nEditor component let you can control the appearance of your HTML text using the rich text formats. The editor toolbar provides various buttons for editing and formatting your content. You may use the editor component to displayed multiple styles, colors, alignments, or include images and hyperlinks as well.\n\n## Use Cases\n\n- Editor component use to rich text formats.\n- To displayed multiple styles, colors and alignments.\n- You may use to include images, hyperlinks and order/un-order lists.\n\n## Terminology\n\n**Toolbar:** Collection of buttons to apply various type of rich text formats.\n**Editor Container:** Editor container implemented using a `contenteditable` element.\n**Source Container:** A textarea element use as container to edit source mode.\n\n## Features (With Code Examples)\n\nA normal editor used as a web component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nReadonly editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" readonly>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDisabled editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" disabled>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDirty tracking editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" dirty-tracker>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nValidation (required) editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" validate=\"required\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nCustom toolbar with editor component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <ids-toolbar slot=\"toolbar\" tabbable type=\"formatter\">\n    <ids-toolbar-section type=\"buttonset\">\n      <ids-button editor-action=\"bold\" square=\"true\" tooltip=\"Toggle Bold Text\">\n        <span class=\"audible\">Bold</span>\n        <ids-icon icon=\"bold\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"italic\" square=\"true\" tooltip=\"Toggle Italic Text\">\n        <span class=\"audible\">Italic</span>\n        <ids-icon icon=\"italic\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"underline\" square=\"true\" tooltip=\"Toggle Underline Text\">\n        <span class=\"audible\">Underline</span>\n        <ids-icon icon=\"underline\"></ids-icon>\n      </ids-button>\n      <ids-separator vertical></ids-separator>\n      <ids-button editor-action=\"sourcemode\" square=\"true\" tooltip=\"View Source\">\n        <span class=\"audible\">View Source</span>\n        <ids-icon icon=\"html\" width=\"38\" viewbox=\"0 0 54 18\"></ids-icon>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor init with source mode.\n\n```html\n<ids-editor label=\"Demo Editor\" view=\"source\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with hidden label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"hidden\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with collapsed label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"collapsed\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor placeholder.\n\n```html\n<ids-editor label=\"Demo Editor\" placeholder=\"Type some text here...\">\n</ids-editor>\n```\n\nEditor use source formatter\n\n```html\n<ids-editor label=\"Demo Editor\" source-formatter>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor use clickable hyperlink\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text <a href=\"https://www.example.com/\" class=\"hyperlink\" contenteditable=\"false\" target=\"_blank\">example hyperlink</a></p>\n</ids-editor>\n```\n\nCustom default values in modals (ie. hyperlink modal)\n\n```html\n<ids-editor id=\"editor-demo\" label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\n```javaScript\nconst modals = {\n  hyperlink: {\n    url: 'http://www.example.com',\n    classes: 'hyperlink',\n    targets: [\n      { text: 'Same Window', value: '' },\n      { text: 'New Window', value: '_blank', selected: true }\n    ],\n    isClickable: false,\n    showIsClickable: true\n  },\n  insertimage: {\n    url: '../assets/images/placeholder-154x120.png',\n    alt: ''\n  }\n};\nconst editorEl = document.querySelector('#editor-demo');\neditorEl.modalElementsValue(modals);\n```\n\n## Settings and Attributes\n\n- `value` {string} Sets the editor's innerHTML (after sanitizing)\n- `disabled` {boolean} Sets the editor to disabled state\n- `label` {string} Set the editor aria label text\n- `label-state` {null|string} Controls the visible state of the label.  When using `hidden`, the label will not be displayed but will still take up physical space on a form.  When using `collapsed`, the label is hidden and does not take up space.\n- `labelRequired` {boolean} Set required indicator (red '*') to be hidden or shown\n- `paragraphSeparator` {string} Set the placeholder text for editor\n- `placeholder` {string} Sets the editor node to be selectable\n- `readonly` {boolean} Sets the editor to readonly state\n- `sourceFormatter` {boolean} Sets to be use source formatter for editor\n- `view` {string|'editor'|'source' } Set the view mode for editor\n- `height` {string } Set editor's height from the default 300px (plus toolbar height). This height can be dynamic for flexible height for example `calc(100vh - 262px)`.\n\n## Theme-able Parts\n\n- `editor` - allows you to further style the editor element\n- `editor-label` - allows you to further style the editor label element\n- `main-container` - allows you to further style the main container element\n- `toolbar-container` - allows you to further style the toolbar container element\n- `editor-container` - allows you to further style the editor container element\n- `source-container` - allows you to further style the source container element\n\n## Events\n\n- `beforeeditormode` Fires before change view to editor mode, you can return false in the response to veto\n- `aftereditormode` Fires after change view to editor mode\n- `beforesourcemode` Fires before change view to source mode, you can return false in the response to veto\n- `aftersourcemode` Fires after change view to source mode\n- `viewchange` Fires after requested view mode changed\n- `rejectviewchange` Fires if requested view mode reject\n- `beforepaste` Fires before paste, you can return false in the response to veto\n- `afterpaste` Fires after paste content\n- `rejectpaste` Fires if reject paste content\n- `initialize` Fires after initialize\n- `change` Fires after value change\n\n## Methods\n\n- `modalElementsValue(modals: object): HTMLElement` Set default value to each element in modals\n- `sourceTextareaLabel(): string` Get label text for source textarea\n\n## States and Variations (With Code Examples)\n\n- Custom Toolbar: End user can set custom toolbar buttons\n- Disabled: Disabled editor cannot be clicked, hovered, focused or selected\n- Readonly: Editor content readonly\n- Dirty Tracking: Content changes can be track by display dirty icon in editor\n- Validation: Can be check of required validation\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the editor.\n- <kbd>Ctrl + B</kbd>: Make text bold.\n- <kbd>Ctrl + I</kbd>: Make text italicize.\n- <kbd>Ctrl + U</kbd>: Make text underline.\n- <kbd>Ctrl + Shift + S</kbd>: Make text strike through.\n- <kbd>Ctrl + Shift + Equal</kbd>: Make text super script.\n- <kbd>Ctrl + Equal</kbd>: Make text sub script.\n- <kbd>Ctrl + Alt + Digit1</kbd>: Make header 1.\n- <kbd>Ctrl + Alt + Digit2</kbd>: Make header 2.\n- <kbd>Ctrl + Alt + Digit3</kbd>: Make header 3.\n- <kbd>Ctrl + Alt + Digit4</kbd>: Make header 4.\n- <kbd>Ctrl + Alt + Digit5</kbd>: Make header 5.\n- <kbd>Ctrl + Alt + Digit6</kbd>: Make header 6.\n- <kbd>Ctrl + Shift + Alt + K</kbd>: Change text fore color.\n- <kbd>Ctrl + Shift + O</kbd>: Insert ordered list.\n- <kbd>Ctrl + Shift + U</kbd>: Insert unordered list.\n- <kbd>Ctrl + Shift + I</kbd>: Insert image.\n- <kbd>Ctrl + K</kbd>: Insert/Update hyperlink.\n- <kbd>Ctrl + Shift + K</kbd>: Make unlink the hyperlink.\n- <kbd>Ctrl + Shift + L</kbd>: Insert horizontal line.\n- <kbd>Ctrl + L</kbd>: Make text align left.\n- <kbd>Ctrl + R</kbd>: Make text align right.\n- <kbd>Ctrl + E</kbd>: Make text align center.\n- <kbd>Ctrl + J</kbd>: Make text align justify.\n- <kbd>Ctrl + Shift + Space</kbd>: Clear formatting.\n- <kbd>Ctrl + Y</kbd>: History redo.\n- <kbd>Ctrl + Z</kbd>: History undo.\n- <kbd>Ctrl + Shift + Backquote</kbd>: Switch editor view mode.\n- <kbd>Ctrl + Backquote</kbd>: Switch source view mode.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Editor have all new markup and classes.\n\n**4.x to 5.x**\n- The Editor component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-editor><div slot=\"content\"><p>Some sample text</p></div></ids-editor>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/UoCNFBhmjVZZ9CxLHQ54Mq/IDS-Editor?node-id=1%3A7)\n\n## Accessibility Guidelines\n\n- Editor container contained in the element has a `role=\"textbox\"`, `aria-multiline=\"true\"` and `aria-labelledby`\n- Source container contained textarea with audible label\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n"}},{"name":"ids-editor-shared","description":{"kind":"markdown","value":"# ids-editor\n\n## Description\n\nEditor component let you can control the appearance of your HTML text using the rich text formats. The editor toolbar provides various buttons for editing and formatting your content. You may use the editor component to displayed multiple styles, colors, alignments, or include images and hyperlinks as well.\n\n## Use Cases\n\n- Editor component use to rich text formats.\n- To displayed multiple styles, colors and alignments.\n- You may use to include images, hyperlinks and order/un-order lists.\n\n## Terminology\n\n**Toolbar:** Collection of buttons to apply various type of rich text formats.\n**Editor Container:** Editor container implemented using a `contenteditable` element.\n**Source Container:** A textarea element use as container to edit source mode.\n\n## Features (With Code Examples)\n\nA normal editor used as a web component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nReadonly editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" readonly>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDisabled editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" disabled>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDirty tracking editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" dirty-tracker>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nValidation (required) editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" validate=\"required\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nCustom toolbar with editor component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <ids-toolbar slot=\"toolbar\" tabbable type=\"formatter\">\n    <ids-toolbar-section type=\"buttonset\">\n      <ids-button editor-action=\"bold\" square=\"true\" tooltip=\"Toggle Bold Text\">\n        <span class=\"audible\">Bold</span>\n        <ids-icon icon=\"bold\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"italic\" square=\"true\" tooltip=\"Toggle Italic Text\">\n        <span class=\"audible\">Italic</span>\n        <ids-icon icon=\"italic\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"underline\" square=\"true\" tooltip=\"Toggle Underline Text\">\n        <span class=\"audible\">Underline</span>\n        <ids-icon icon=\"underline\"></ids-icon>\n      </ids-button>\n      <ids-separator vertical></ids-separator>\n      <ids-button editor-action=\"sourcemode\" square=\"true\" tooltip=\"View Source\">\n        <span class=\"audible\">View Source</span>\n        <ids-icon icon=\"html\" width=\"38\" viewbox=\"0 0 54 18\"></ids-icon>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor init with source mode.\n\n```html\n<ids-editor label=\"Demo Editor\" view=\"source\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with hidden label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"hidden\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with collapsed label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"collapsed\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor placeholder.\n\n```html\n<ids-editor label=\"Demo Editor\" placeholder=\"Type some text here...\">\n</ids-editor>\n```\n\nEditor use source formatter\n\n```html\n<ids-editor label=\"Demo Editor\" source-formatter>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor use clickable hyperlink\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text <a href=\"https://www.example.com/\" class=\"hyperlink\" contenteditable=\"false\" target=\"_blank\">example hyperlink</a></p>\n</ids-editor>\n```\n\nCustom default values in modals (ie. hyperlink modal)\n\n```html\n<ids-editor id=\"editor-demo\" label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\n```javaScript\nconst modals = {\n  hyperlink: {\n    url: 'http://www.example.com',\n    classes: 'hyperlink',\n    targets: [\n      { text: 'Same Window', value: '' },\n      { text: 'New Window', value: '_blank', selected: true }\n    ],\n    isClickable: false,\n    showIsClickable: true\n  },\n  insertimage: {\n    url: '../assets/images/placeholder-154x120.png',\n    alt: ''\n  }\n};\nconst editorEl = document.querySelector('#editor-demo');\neditorEl.modalElementsValue(modals);\n```\n\n## Settings and Attributes\n\n- `value` {string} Sets the editor's innerHTML (after sanitizing)\n- `disabled` {boolean} Sets the editor to disabled state\n- `label` {string} Set the editor aria label text\n- `label-state` {null|string} Controls the visible state of the label.  When using `hidden`, the label will not be displayed but will still take up physical space on a form.  When using `collapsed`, the label is hidden and does not take up space.\n- `labelRequired` {boolean} Set required indicator (red '*') to be hidden or shown\n- `paragraphSeparator` {string} Set the placeholder text for editor\n- `placeholder` {string} Sets the editor node to be selectable\n- `readonly` {boolean} Sets the editor to readonly state\n- `sourceFormatter` {boolean} Sets to be use source formatter for editor\n- `view` {string|'editor'|'source' } Set the view mode for editor\n- `height` {string } Set editor's height from the default 300px (plus toolbar height). This height can be dynamic for flexible height for example `calc(100vh - 262px)`.\n\n## Theme-able Parts\n\n- `editor` - allows you to further style the editor element\n- `editor-label` - allows you to further style the editor label element\n- `main-container` - allows you to further style the main container element\n- `toolbar-container` - allows you to further style the toolbar container element\n- `editor-container` - allows you to further style the editor container element\n- `source-container` - allows you to further style the source container element\n\n## Events\n\n- `beforeeditormode` Fires before change view to editor mode, you can return false in the response to veto\n- `aftereditormode` Fires after change view to editor mode\n- `beforesourcemode` Fires before change view to source mode, you can return false in the response to veto\n- `aftersourcemode` Fires after change view to source mode\n- `viewchange` Fires after requested view mode changed\n- `rejectviewchange` Fires if requested view mode reject\n- `beforepaste` Fires before paste, you can return false in the response to veto\n- `afterpaste` Fires after paste content\n- `rejectpaste` Fires if reject paste content\n- `initialize` Fires after initialize\n- `change` Fires after value change\n\n## Methods\n\n- `modalElementsValue(modals: object): HTMLElement` Set default value to each element in modals\n- `sourceTextareaLabel(): string` Get label text for source textarea\n\n## States and Variations (With Code Examples)\n\n- Custom Toolbar: End user can set custom toolbar buttons\n- Disabled: Disabled editor cannot be clicked, hovered, focused or selected\n- Readonly: Editor content readonly\n- Dirty Tracking: Content changes can be track by display dirty icon in editor\n- Validation: Can be check of required validation\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the editor.\n- <kbd>Ctrl + B</kbd>: Make text bold.\n- <kbd>Ctrl + I</kbd>: Make text italicize.\n- <kbd>Ctrl + U</kbd>: Make text underline.\n- <kbd>Ctrl + Shift + S</kbd>: Make text strike through.\n- <kbd>Ctrl + Shift + Equal</kbd>: Make text super script.\n- <kbd>Ctrl + Equal</kbd>: Make text sub script.\n- <kbd>Ctrl + Alt + Digit1</kbd>: Make header 1.\n- <kbd>Ctrl + Alt + Digit2</kbd>: Make header 2.\n- <kbd>Ctrl + Alt + Digit3</kbd>: Make header 3.\n- <kbd>Ctrl + Alt + Digit4</kbd>: Make header 4.\n- <kbd>Ctrl + Alt + Digit5</kbd>: Make header 5.\n- <kbd>Ctrl + Alt + Digit6</kbd>: Make header 6.\n- <kbd>Ctrl + Shift + Alt + K</kbd>: Change text fore color.\n- <kbd>Ctrl + Shift + O</kbd>: Insert ordered list.\n- <kbd>Ctrl + Shift + U</kbd>: Insert unordered list.\n- <kbd>Ctrl + Shift + I</kbd>: Insert image.\n- <kbd>Ctrl + K</kbd>: Insert/Update hyperlink.\n- <kbd>Ctrl + Shift + K</kbd>: Make unlink the hyperlink.\n- <kbd>Ctrl + Shift + L</kbd>: Insert horizontal line.\n- <kbd>Ctrl + L</kbd>: Make text align left.\n- <kbd>Ctrl + R</kbd>: Make text align right.\n- <kbd>Ctrl + E</kbd>: Make text align center.\n- <kbd>Ctrl + J</kbd>: Make text align justify.\n- <kbd>Ctrl + Shift + Space</kbd>: Clear formatting.\n- <kbd>Ctrl + Y</kbd>: History redo.\n- <kbd>Ctrl + Z</kbd>: History undo.\n- <kbd>Ctrl + Shift + Backquote</kbd>: Switch editor view mode.\n- <kbd>Ctrl + Backquote</kbd>: Switch source view mode.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Editor have all new markup and classes.\n\n**4.x to 5.x**\n- The Editor component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-editor><div slot=\"content\"><p>Some sample text</p></div></ids-editor>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/UoCNFBhmjVZZ9CxLHQ54Mq/IDS-Editor?node-id=1%3A7)\n\n## Accessibility Guidelines\n\n- Editor container contained in the element has a `role=\"textbox\"`, `aria-multiline=\"true\"` and `aria-labelledby`\n- Source container contained textarea with audible label\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n"}},{"name":"ids-editor-templates","description":{"kind":"markdown","value":"# ids-editor\n\n## Description\n\nEditor component let you can control the appearance of your HTML text using the rich text formats. The editor toolbar provides various buttons for editing and formatting your content. You may use the editor component to displayed multiple styles, colors, alignments, or include images and hyperlinks as well.\n\n## Use Cases\n\n- Editor component use to rich text formats.\n- To displayed multiple styles, colors and alignments.\n- You may use to include images, hyperlinks and order/un-order lists.\n\n## Terminology\n\n**Toolbar:** Collection of buttons to apply various type of rich text formats.\n**Editor Container:** Editor container implemented using a `contenteditable` element.\n**Source Container:** A textarea element use as container to edit source mode.\n\n## Features (With Code Examples)\n\nA normal editor used as a web component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nReadonly editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" readonly>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDisabled editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" disabled>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDirty tracking editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" dirty-tracker>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nValidation (required) editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" validate=\"required\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nCustom toolbar with editor component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <ids-toolbar slot=\"toolbar\" tabbable type=\"formatter\">\n    <ids-toolbar-section type=\"buttonset\">\n      <ids-button editor-action=\"bold\" square=\"true\" tooltip=\"Toggle Bold Text\">\n        <span class=\"audible\">Bold</span>\n        <ids-icon icon=\"bold\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"italic\" square=\"true\" tooltip=\"Toggle Italic Text\">\n        <span class=\"audible\">Italic</span>\n        <ids-icon icon=\"italic\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"underline\" square=\"true\" tooltip=\"Toggle Underline Text\">\n        <span class=\"audible\">Underline</span>\n        <ids-icon icon=\"underline\"></ids-icon>\n      </ids-button>\n      <ids-separator vertical></ids-separator>\n      <ids-button editor-action=\"sourcemode\" square=\"true\" tooltip=\"View Source\">\n        <span class=\"audible\">View Source</span>\n        <ids-icon icon=\"html\" width=\"38\" viewbox=\"0 0 54 18\"></ids-icon>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor init with source mode.\n\n```html\n<ids-editor label=\"Demo Editor\" view=\"source\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with hidden label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"hidden\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with collapsed label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"collapsed\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor placeholder.\n\n```html\n<ids-editor label=\"Demo Editor\" placeholder=\"Type some text here...\">\n</ids-editor>\n```\n\nEditor use source formatter\n\n```html\n<ids-editor label=\"Demo Editor\" source-formatter>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor use clickable hyperlink\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text <a href=\"https://www.example.com/\" class=\"hyperlink\" contenteditable=\"false\" target=\"_blank\">example hyperlink</a></p>\n</ids-editor>\n```\n\nCustom default values in modals (ie. hyperlink modal)\n\n```html\n<ids-editor id=\"editor-demo\" label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\n```javaScript\nconst modals = {\n  hyperlink: {\n    url: 'http://www.example.com',\n    classes: 'hyperlink',\n    targets: [\n      { text: 'Same Window', value: '' },\n      { text: 'New Window', value: '_blank', selected: true }\n    ],\n    isClickable: false,\n    showIsClickable: true\n  },\n  insertimage: {\n    url: '../assets/images/placeholder-154x120.png',\n    alt: ''\n  }\n};\nconst editorEl = document.querySelector('#editor-demo');\neditorEl.modalElementsValue(modals);\n```\n\n## Settings and Attributes\n\n- `value` {string} Sets the editor's innerHTML (after sanitizing)\n- `disabled` {boolean} Sets the editor to disabled state\n- `label` {string} Set the editor aria label text\n- `label-state` {null|string} Controls the visible state of the label.  When using `hidden`, the label will not be displayed but will still take up physical space on a form.  When using `collapsed`, the label is hidden and does not take up space.\n- `labelRequired` {boolean} Set required indicator (red '*') to be hidden or shown\n- `paragraphSeparator` {string} Set the placeholder text for editor\n- `placeholder` {string} Sets the editor node to be selectable\n- `readonly` {boolean} Sets the editor to readonly state\n- `sourceFormatter` {boolean} Sets to be use source formatter for editor\n- `view` {string|'editor'|'source' } Set the view mode for editor\n- `height` {string } Set editor's height from the default 300px (plus toolbar height). This height can be dynamic for flexible height for example `calc(100vh - 262px)`.\n\n## Theme-able Parts\n\n- `editor` - allows you to further style the editor element\n- `editor-label` - allows you to further style the editor label element\n- `main-container` - allows you to further style the main container element\n- `toolbar-container` - allows you to further style the toolbar container element\n- `editor-container` - allows you to further style the editor container element\n- `source-container` - allows you to further style the source container element\n\n## Events\n\n- `beforeeditormode` Fires before change view to editor mode, you can return false in the response to veto\n- `aftereditormode` Fires after change view to editor mode\n- `beforesourcemode` Fires before change view to source mode, you can return false in the response to veto\n- `aftersourcemode` Fires after change view to source mode\n- `viewchange` Fires after requested view mode changed\n- `rejectviewchange` Fires if requested view mode reject\n- `beforepaste` Fires before paste, you can return false in the response to veto\n- `afterpaste` Fires after paste content\n- `rejectpaste` Fires if reject paste content\n- `initialize` Fires after initialize\n- `change` Fires after value change\n\n## Methods\n\n- `modalElementsValue(modals: object): HTMLElement` Set default value to each element in modals\n- `sourceTextareaLabel(): string` Get label text for source textarea\n\n## States and Variations (With Code Examples)\n\n- Custom Toolbar: End user can set custom toolbar buttons\n- Disabled: Disabled editor cannot be clicked, hovered, focused or selected\n- Readonly: Editor content readonly\n- Dirty Tracking: Content changes can be track by display dirty icon in editor\n- Validation: Can be check of required validation\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the editor.\n- <kbd>Ctrl + B</kbd>: Make text bold.\n- <kbd>Ctrl + I</kbd>: Make text italicize.\n- <kbd>Ctrl + U</kbd>: Make text underline.\n- <kbd>Ctrl + Shift + S</kbd>: Make text strike through.\n- <kbd>Ctrl + Shift + Equal</kbd>: Make text super script.\n- <kbd>Ctrl + Equal</kbd>: Make text sub script.\n- <kbd>Ctrl + Alt + Digit1</kbd>: Make header 1.\n- <kbd>Ctrl + Alt + Digit2</kbd>: Make header 2.\n- <kbd>Ctrl + Alt + Digit3</kbd>: Make header 3.\n- <kbd>Ctrl + Alt + Digit4</kbd>: Make header 4.\n- <kbd>Ctrl + Alt + Digit5</kbd>: Make header 5.\n- <kbd>Ctrl + Alt + Digit6</kbd>: Make header 6.\n- <kbd>Ctrl + Shift + Alt + K</kbd>: Change text fore color.\n- <kbd>Ctrl + Shift + O</kbd>: Insert ordered list.\n- <kbd>Ctrl + Shift + U</kbd>: Insert unordered list.\n- <kbd>Ctrl + Shift + I</kbd>: Insert image.\n- <kbd>Ctrl + K</kbd>: Insert/Update hyperlink.\n- <kbd>Ctrl + Shift + K</kbd>: Make unlink the hyperlink.\n- <kbd>Ctrl + Shift + L</kbd>: Insert horizontal line.\n- <kbd>Ctrl + L</kbd>: Make text align left.\n- <kbd>Ctrl + R</kbd>: Make text align right.\n- <kbd>Ctrl + E</kbd>: Make text align center.\n- <kbd>Ctrl + J</kbd>: Make text align justify.\n- <kbd>Ctrl + Shift + Space</kbd>: Clear formatting.\n- <kbd>Ctrl + Y</kbd>: History redo.\n- <kbd>Ctrl + Z</kbd>: History undo.\n- <kbd>Ctrl + Shift + Backquote</kbd>: Switch editor view mode.\n- <kbd>Ctrl + Backquote</kbd>: Switch source view mode.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Editor have all new markup and classes.\n\n**4.x to 5.x**\n- The Editor component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-editor><div slot=\"content\"><p>Some sample text</p></div></ids-editor>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/UoCNFBhmjVZZ9CxLHQ54Mq/IDS-Editor?node-id=1%3A7)\n\n## Accessibility Guidelines\n\n- Editor container contained in the element has a `role=\"textbox\"`, `aria-multiline=\"true\"` and `aria-labelledby`\n- Source container contained textarea with audible label\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n"}},{"name":"ids-editor","attributes":[{"name":"validation-elems","values":[]},{"name":"req-initialize","values":[]},{"name":"is-form-component","values":[]},{"name":"#resize-observer","values":[]},{"name":"#modals","description":"Modals attached to editor.","values":[]},{"name":"#paragraph-separator","description":"Current paragraph separator.","values":[]},{"name":"#saved-selection","description":"Saved current selection ranges.","values":[]},{"name":"#elems","description":"Cache elements use most.","values":[]},{"name":"input","values":[]},{"name":"label-el","values":[]},{"name":"#editor-text-container","values":[]},{"name":"#actions","description":"List of actions can be execute with editor.\nextra actions get added in `#initContent()`","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"on-language-change","description":"Handles the event when the editor's language changes","values":[]},{"name":"value","description":"Get editor current html value","values":[]},{"name":"disabled","description":"Get the disabled state","values":[]},{"name":"paragraph-separator","description":"Get the paragraph separator","values":[]},{"name":"paste-as-plain-text","description":"Get the paste as plain text setting","values":[]},{"name":"placeholder","description":"Get the placeholder text","values":[]},{"name":"readonly","description":"Get the readonly state","values":[]},{"name":"source-formatter","description":"Get the source formatter setting","values":[]},{"name":"view","description":"Get the view mode","values":[]},{"name":"height","description":"Get the height of the editor","values":[]},{"name":"editor-slot","description":"Get the editor slot element","values":[]},{"name":"hidden-slot","description":"Get the hidden slot element","values":[]}],"description":{"kind":"markdown","value":"# ids-editor\n\n## Description\n\nEditor component let you can control the appearance of your HTML text using the rich text formats. The editor toolbar provides various buttons for editing and formatting your content. You may use the editor component to displayed multiple styles, colors, alignments, or include images and hyperlinks as well.\n\n## Use Cases\n\n- Editor component use to rich text formats.\n- To displayed multiple styles, colors and alignments.\n- You may use to include images, hyperlinks and order/un-order lists.\n\n## Terminology\n\n**Toolbar:** Collection of buttons to apply various type of rich text formats.\n**Editor Container:** Editor container implemented using a `contenteditable` element.\n**Source Container:** A textarea element use as container to edit source mode.\n\n## Features (With Code Examples)\n\nA normal editor used as a web component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nReadonly editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" readonly>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDisabled editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" disabled>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nDirty tracking editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" dirty-tracker>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nValidation (required) editor component.\n\n```html\n<ids-editor label=\"Demo Editor\" validate=\"required\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nCustom toolbar with editor component.\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <ids-toolbar slot=\"toolbar\" tabbable type=\"formatter\">\n    <ids-toolbar-section type=\"buttonset\">\n      <ids-button editor-action=\"bold\" square=\"true\" tooltip=\"Toggle Bold Text\">\n        <span class=\"audible\">Bold</span>\n        <ids-icon icon=\"bold\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"italic\" square=\"true\" tooltip=\"Toggle Italic Text\">\n        <span class=\"audible\">Italic</span>\n        <ids-icon icon=\"italic\"></ids-icon>\n      </ids-button>\n      <ids-button editor-action=\"underline\" square=\"true\" tooltip=\"Toggle Underline Text\">\n        <span class=\"audible\">Underline</span>\n        <ids-icon icon=\"underline\"></ids-icon>\n      </ids-button>\n      <ids-separator vertical></ids-separator>\n      <ids-button editor-action=\"sourcemode\" square=\"true\" tooltip=\"View Source\">\n        <span class=\"audible\">View Source</span>\n        <ids-icon icon=\"html\" width=\"38\" viewbox=\"0 0 54 18\"></ids-icon>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor init with source mode.\n\n```html\n<ids-editor label=\"Demo Editor\" view=\"source\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with hidden label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"hidden\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor with collapsed label.\n\n```html\n<ids-editor label=\"Demo Editor\" label-state=\"collapsed\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor placeholder.\n\n```html\n<ids-editor label=\"Demo Editor\" placeholder=\"Type some text here...\">\n</ids-editor>\n```\n\nEditor use source formatter\n\n```html\n<ids-editor label=\"Demo Editor\" source-formatter>\n  <p>Some sample text</p>\n</ids-editor>\n```\n\nEditor use clickable hyperlink\n\n```html\n<ids-editor label=\"Demo Editor\">\n  <p>Some sample text <a href=\"https://www.example.com/\" class=\"hyperlink\" contenteditable=\"false\" target=\"_blank\">example hyperlink</a></p>\n</ids-editor>\n```\n\nCustom default values in modals (ie. hyperlink modal)\n\n```html\n<ids-editor id=\"editor-demo\" label=\"Demo Editor\">\n  <p>Some sample text</p>\n</ids-editor>\n```\n\n```javaScript\nconst modals = {\n  hyperlink: {\n    url: 'http://www.example.com',\n    classes: 'hyperlink',\n    targets: [\n      { text: 'Same Window', value: '' },\n      { text: 'New Window', value: '_blank', selected: true }\n    ],\n    isClickable: false,\n    showIsClickable: true\n  },\n  insertimage: {\n    url: '../assets/images/placeholder-154x120.png',\n    alt: ''\n  }\n};\nconst editorEl = document.querySelector('#editor-demo');\neditorEl.modalElementsValue(modals);\n```\n\n## Settings and Attributes\n\n- `value` {string} Sets the editor's innerHTML (after sanitizing)\n- `disabled` {boolean} Sets the editor to disabled state\n- `label` {string} Set the editor aria label text\n- `label-state` {null|string} Controls the visible state of the label.  When using `hidden`, the label will not be displayed but will still take up physical space on a form.  When using `collapsed`, the label is hidden and does not take up space.\n- `labelRequired` {boolean} Set required indicator (red '*') to be hidden or shown\n- `paragraphSeparator` {string} Set the placeholder text for editor\n- `placeholder` {string} Sets the editor node to be selectable\n- `readonly` {boolean} Sets the editor to readonly state\n- `sourceFormatter` {boolean} Sets to be use source formatter for editor\n- `view` {string|'editor'|'source' } Set the view mode for editor\n- `height` {string } Set editor's height from the default 300px (plus toolbar height). This height can be dynamic for flexible height for example `calc(100vh - 262px)`.\n\n## Theme-able Parts\n\n- `editor` - allows you to further style the editor element\n- `editor-label` - allows you to further style the editor label element\n- `main-container` - allows you to further style the main container element\n- `toolbar-container` - allows you to further style the toolbar container element\n- `editor-container` - allows you to further style the editor container element\n- `source-container` - allows you to further style the source container element\n\n## Events\n\n- `beforeeditormode` Fires before change view to editor mode, you can return false in the response to veto\n- `aftereditormode` Fires after change view to editor mode\n- `beforesourcemode` Fires before change view to source mode, you can return false in the response to veto\n- `aftersourcemode` Fires after change view to source mode\n- `viewchange` Fires after requested view mode changed\n- `rejectviewchange` Fires if requested view mode reject\n- `beforepaste` Fires before paste, you can return false in the response to veto\n- `afterpaste` Fires after paste content\n- `rejectpaste` Fires if reject paste content\n- `initialize` Fires after initialize\n- `change` Fires after value change\n\n## Methods\n\n- `modalElementsValue(modals: object): HTMLElement` Set default value to each element in modals\n- `sourceTextareaLabel(): string` Get label text for source textarea\n\n## States and Variations (With Code Examples)\n\n- Custom Toolbar: End user can set custom toolbar buttons\n- Disabled: Disabled editor cannot be clicked, hovered, focused or selected\n- Readonly: Editor content readonly\n- Dirty Tracking: Content changes can be track by display dirty icon in editor\n- Validation: Can be check of required validation\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the editor.\n- <kbd>Ctrl + B</kbd>: Make text bold.\n- <kbd>Ctrl + I</kbd>: Make text italicize.\n- <kbd>Ctrl + U</kbd>: Make text underline.\n- <kbd>Ctrl + Shift + S</kbd>: Make text strike through.\n- <kbd>Ctrl + Shift + Equal</kbd>: Make text super script.\n- <kbd>Ctrl + Equal</kbd>: Make text sub script.\n- <kbd>Ctrl + Alt + Digit1</kbd>: Make header 1.\n- <kbd>Ctrl + Alt + Digit2</kbd>: Make header 2.\n- <kbd>Ctrl + Alt + Digit3</kbd>: Make header 3.\n- <kbd>Ctrl + Alt + Digit4</kbd>: Make header 4.\n- <kbd>Ctrl + Alt + Digit5</kbd>: Make header 5.\n- <kbd>Ctrl + Alt + Digit6</kbd>: Make header 6.\n- <kbd>Ctrl + Shift + Alt + K</kbd>: Change text fore color.\n- <kbd>Ctrl + Shift + O</kbd>: Insert ordered list.\n- <kbd>Ctrl + Shift + U</kbd>: Insert unordered list.\n- <kbd>Ctrl + Shift + I</kbd>: Insert image.\n- <kbd>Ctrl + K</kbd>: Insert/Update hyperlink.\n- <kbd>Ctrl + Shift + K</kbd>: Make unlink the hyperlink.\n- <kbd>Ctrl + Shift + L</kbd>: Insert horizontal line.\n- <kbd>Ctrl + L</kbd>: Make text align left.\n- <kbd>Ctrl + R</kbd>: Make text align right.\n- <kbd>Ctrl + E</kbd>: Make text align center.\n- <kbd>Ctrl + J</kbd>: Make text align justify.\n- <kbd>Ctrl + Shift + Space</kbd>: Clear formatting.\n- <kbd>Ctrl + Y</kbd>: History redo.\n- <kbd>Ctrl + Z</kbd>: History undo.\n- <kbd>Ctrl + Shift + Backquote</kbd>: Switch editor view mode.\n- <kbd>Ctrl + Backquote</kbd>: Switch source view mode.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Editor have all new markup and classes.\n\n**4.x to 5.x**\n- The Editor component has been changed to a web component and renamed to ids-editor.\n- Markup has changed to a custom element `<ids-editor><div slot=\"content\"><p>Some sample text</p></div></ids-editor>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/UoCNFBhmjVZZ9CxLHQ54Mq/IDS-Editor?node-id=1%3A7)\n\n## Accessibility Guidelines\n\n- Editor container contained in the element has a `role=\"textbox\"`, `aria-multiline=\"true\"` and `aria-labelledby`\n- Source container contained textarea with audible label\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n"}},{"name":"ids-empty-message","attributes":[{"name":"icon","description":"Get the icon name","values":[]}],"description":{"kind":"markdown","value":"# ids-empty-message\n\n## Description\n\nThe IDS Empty Message component is a layout pattern for indicating there is no data for the object. Empty messages appear in ids-cards, ids-data-grid and other places like forms. The component supports action buttons, provides styling for a label and secondary description and optional empty-message specific icons.\n\n## Use Cases\n\n- When no content is present, an empty message is useful to communicate information & action. It is critical to communicate why it’s empty and what the user can do.\n## Terminology\n- **icon**: this property when included and provided with a supported icon id will display the chosen icon in the empty message format\n- **label**: this is a web component slot, the contents of this slot are treated as a primary label and are styled accordingly\n- **description**: this is a web component slot, the contents of this slot are formatted as secondary text in the ids-empty-message format\n- **button**: this is a slot that is used for any button inputs for the empty message\n\n## Themeable Parts\n\n- `container` allows for the styling of the container element\n\n## Features\n\nA simple implementation of the empty-message component\n\n```html\n  <ids-empty-message icon=\"empty-no-tasks\">\n    <ids-text type=\"h2\" font-size=\"20\" label=\"true\" slot=\"label\">Document Management</ids-text>\n    <ids-text label=\"true\" slot=\"description\">Description of empty message that explains why</ids-text>\n    <ids-button class=\"action-button\" slot=\"button\" appearance=\"primary\">\n      <span>BUTTON NAME</span>\n    </ids-button>\n  </ids-empty-message>\n```\n\nWhen making use of the `icon` property, it is important to remember that only empty message specific icon options are valid. Here is a complete list:\n\n`empty-error-loading`\n`empty-generic`\n`empty-new-project`\n`empty-no-alerts`\n`empty-no-analytics`\n`empty-no-budget`\n`empty-no-data`\n`empty-no-events`\n`empty-no-notes`\n`empty-no-orders`\n`empty-no-tasks`\n`empty-no-users`\n`empty-search-data`\n\n## Settings and Attributes\n\n- **icon** the attribute for adding an icon to the empty message, also has bound property with getter/setter\n\n## Accessibility\n\nIt is important to remember to always include a label or description with an Icon for screen reader users.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- This is a new concept that did not exist in 3.x\n\n**4.x to 5.x**\n- The EmptyMessage component has been changed to a web component and renamed to `<ids-empty-message>`.\n- Markup has changed to a custom element `<ids-empty-message>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The icon, label, description and button-text are set via properties/attributes.\n"}},{"name":"ids-error-page","attributes":[{"name":"icon","description":"Get the icon","values":[]},{"name":"label","description":"Get the label","values":[]},{"name":"description","description":"Get the description text","values":[]},{"name":"button-text","description":"Get the button text","values":[]},{"name":"aria-label-content","description":"Used for ARIA Labels and other content","values":[]},{"name":"z-count","values":[]},{"name":"should-update","values":[]},{"name":"on-button-click","values":[]},{"name":"ro","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"#visible","values":[]},{"name":"global-keydown-listener","values":[]},{"name":"auto-focus","description":"Get whether to focus the first input element instead of the close button","values":[]},{"name":"focus-target","description":"Get whether to focus the target element for modal","values":[]},{"name":"buttons","description":"Get the currently slotted buttons","values":[]},{"name":"button-set","description":"Get the current button group","values":[]},{"name":"title-slot","description":"Get the slotted title element or the default title slot","values":[]},{"name":"modal-content-el","description":"Get the Modal's content wrapper element","values":[]},{"name":"fullsize","description":"Get the breakpoint at which the Modal will change from normal mode to fullsize mode","values":[]},{"name":"show-close-button","description":"Get whether the close button is shown","values":[]},{"name":"suppress-enter-key","description":"Get whether the Enter key is suppressed from dismissing the modal","values":[]},{"name":"close-button","description":"Get the close button element","values":[]},{"name":"overlay","description":"Sets the overlay element for the modal","values":[]},{"name":"message-title","description":"Sets the content of the message's title","values":[]},{"name":"scrollable","description":"Get the modal scrollable setting","values":[]},{"name":"visible","description":"Sets whether the Modal is visible","values":[]},{"name":"is-service-message","values":[]},{"name":"click-outside-to-close","description":"Set whether or not to allow the modal to close by clicking outside","values":[]},{"name":"height","description":"Get the modal height","values":[]},{"name":"width","description":"Get the modal width","values":[]},{"name":"overflow","description":"Get the overflow behavior for the modal content","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"## Ids Error Page Component\n\nThis example shows how to render a page in an IDS Error Page that shows an unknown error. Ideally its best to avoid these types of errors in your application but when an unexpected error occurs you can use this component to render information about the error. The general use case is similar to a 40(x) error page.\n\nThe IDS Error Page Component builds on top of the [Modal]('../ids-modal/README.md'). It also utilizes [EmptyMessage]('../ids-empty-message/README.md')\n\n## Features (With Code Examples)\n\n```html\n<ids-error-page\n    id=\"error-page-1\"\n    visible=\"true\"\n    icon=\"empty-error-loading\"\n    label=\"Access Denied\"\n    description=\"SunSystems Configuration Manager access has been denied.\"\n    button-text=\"Return\"\n></ids-error-page>\n```\n\n## Settings (Attributes)\n\n- `icon` {string} the icon to display in the error page\n- `label` {string} the main title of the error\n- `description` {string} the description of the error\n- `button-text` {string} the text for the action button\n## Terminology\n\n- **action-button**: button in the error page that triggers a the `action-button` event when clicked or touched.\n- **visible**: {boolean} shows or hides the error page based on value\n\n## Accessibility\n\n- All of the page should be readable and contain the information the screen reader users need.\n\n## Keyboard Shortcuts\n\n- Not Applicable as this is a static page\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- This is a new concept that did not exist in 3.x\n\n**4.x to 5.x**\n- The ErrorPage component has been changed to a web component and renamed to `ids-error-page`.\n- Markup has changed to a custom element `<ids-error-page>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The options are all are set via properties/attributes.\n"}},{"name":"ids-exandable-area-attributes","description":{"kind":"markdown","value":"# ids-expandable-area\n\n## Description\n\nThe IDS Expandable Area component is a UI pattern that is comprised of a title, content and a toggle button or link for expanding and collapsing.\n\n## Use Cases\n\nExpandable areas are crucial to displaying only important information to the user. This can be especially useful in managing application pages with many sections, forms and other content. Users may benefit from having to sort through less information.\n\n## Terminology\n\n- **ids-expandable-area**: Container for expandable areas. The default version consists of 4 slots. `header`, `pane`, `expander-default` and `expander-expanded`.\n- **header**: Usually contains an `ids-text` component and displays the title of the expandable area. When type is set to `toggle-btn` the header will container an `ids-toggle-button` and acts as the control for expanding and collapsing.\n- **pane**: This slot contains the content for the expandable area. This can be any HTML element or a wrapper for a series of HTML elements.\n- **expander-default**: Acts as the control for expanding. Contains the text for the collapsed state.\n- **expander-expanded**: Acts as the control for collapsing. Contains the text for the expanded state.\n\n## Themeable Parts\n\n- `container` allows you to further style the main container element\n- `header` allows you to further style the header element\n- `pane` allows you to further style the pane element\n- `pane-content` allows you to further style the content pane\n- `footer` allows you to further style the footer element\n\n## Settings\n\n- `no-padding` Removed the css padding and bottom-border bar for a flush layout\n\n## Events\n\n- `beforeexpand` Vetoable event triggered before expanding pane\n- `beforecollapse` Vetoable event triggered before collapsing pane\n- `expand` Triggered when pane starts expanding\n- `collapse` Triggered when pane starts collapsing\n- `afterexpand` Triggered after expand css transition\n- `aftercollapse` Triggered after collapse css transition\n\n## Features (With Code Examples)\n\nIds Expandable Area - Default\n\n```html\n<ids-expandable-area>\n    <ids-text slot=\"header\" font-size=\"16\">Procurement</ids-text>\n    <ids-text slot=\"pane\" font-size=\"14\">\n        Ubiquitous out-of-the-box, scalable; communities disintermediate beta-test, enable utilize markets dynamic\n        infomediaries virtual data-driven synergistic aggregate infrastructures, \"cross-platform, feeds\n        bleeding-edge tagclouds.\" Platforms extend interactive B2C benchmark proactive, embrace e-markets,\n        transition generate peer-to-peer.\n    </ids-text>\n    <ids-hyperlink slot=\"expander-default\" font-size=\"14\">Show More</ids-hyperlink>\n    <ids-hyperlink slot=\"expander-expanded\" font-size=\"14\">Show Less</ids-hyperlink>\n</ids-expandable-area>\n```\n\nIds Expandable Area - Toggle Button\n\n```html\n<ids-expandable-area type=\"toggle-btn\">\n    <ids-toggle-button\n        slot=\"header\"\n        id=\"test-toggle-button\"\n        icon-on=\"caret-up\"\n        icon-off=\"caret-down\"\n        text-off=\"Employee\"\n        text-on=\"Employee\"\n    >\n        <span></span>\n        <ids-icon icon=\"settings\"></ids-icon>\n    </ids-toggle-button>\n    <ids-text slot=\"pane\" font-size=\"14\">\n        Ubiquitous out-of-the-box, scalable; communities disintermediate beta-test, enable utilize markets dynamic\n        infomediaries virtual data-driven synergistic aggregate infrastructures, \"cross-platform, feeds\n        bleeding-edge tagclouds.\" Platforms extend interactive B2C benchmark proactive, embrace e-markets,\n        transition generate peer-to-peer.\n    </ids-text>\n</ids-expandable-area>\n```\n\n## States and Variations\n\n- **Collapsed**: The state where the expandable area’s content is not visible. Sometimes it serves as the default state, this state can also be remembered by the application.\n- **Expanded**: The state where the expandable area’s content is visible. Sometimes it serves as the default state, this state can also be remembered by the application.\n\n## Keyboard Guidelines\n\n- **Enter or Space**: When focus is on an `expander`, this keystroke toggles the expansion of the corresponding expandable area panel. If collapsed, the panel is expanded, and its aria-expanded state is set to true. If expanded, the panel is collapsed and its aria-expanded state is set to false.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Expandable Area and Field Set were separated\n\n**4.x to 5.x**\n- The ExpandableArea component has been changed to a web component and renamed to `<ids-expandable-area>`.\n- Markup has changed to a custom element `<ids-expandable-area` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The settings are changed and uses flexible slots\n- The events now use native events / custom events\n"}},{"name":"ids-expandable-area","attributes":[{"name":"vetoable-event-types","values":[]},{"name":"expander","values":[]},{"name":"expander-default","values":[]},{"name":"expander-expanded","values":[]},{"name":"pane","values":[]},{"name":"type","description":"Set the type","values":[]},{"name":"expanded","description":"Set the expanded property","values":[]},{"name":"expand-style","description":"Set the expanded property","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-expandable-area\n\n## Description\n\nThe IDS Expandable Area component is a UI pattern that is comprised of a title, content and a toggle button or link for expanding and collapsing.\n\n## Use Cases\n\nExpandable areas are crucial to displaying only important information to the user. This can be especially useful in managing application pages with many sections, forms and other content. Users may benefit from having to sort through less information.\n\n## Terminology\n\n- **ids-expandable-area**: Container for expandable areas. The default version consists of 4 slots. `header`, `pane`, `expander-default` and `expander-expanded`.\n- **header**: Usually contains an `ids-text` component and displays the title of the expandable area. When type is set to `toggle-btn` the header will container an `ids-toggle-button` and acts as the control for expanding and collapsing.\n- **pane**: This slot contains the content for the expandable area. This can be any HTML element or a wrapper for a series of HTML elements.\n- **expander-default**: Acts as the control for expanding. Contains the text for the collapsed state.\n- **expander-expanded**: Acts as the control for collapsing. Contains the text for the expanded state.\n\n## Themeable Parts\n\n- `container` allows you to further style the main container element\n- `header` allows you to further style the header element\n- `pane` allows you to further style the pane element\n- `pane-content` allows you to further style the content pane\n- `footer` allows you to further style the footer element\n\n## Settings\n\n- `no-padding` Removed the css padding and bottom-border bar for a flush layout\n\n## Events\n\n- `beforeexpand` Vetoable event triggered before expanding pane\n- `beforecollapse` Vetoable event triggered before collapsing pane\n- `expand` Triggered when pane starts expanding\n- `collapse` Triggered when pane starts collapsing\n- `afterexpand` Triggered after expand css transition\n- `aftercollapse` Triggered after collapse css transition\n\n## Features (With Code Examples)\n\nIds Expandable Area - Default\n\n```html\n<ids-expandable-area>\n    <ids-text slot=\"header\" font-size=\"16\">Procurement</ids-text>\n    <ids-text slot=\"pane\" font-size=\"14\">\n        Ubiquitous out-of-the-box, scalable; communities disintermediate beta-test, enable utilize markets dynamic\n        infomediaries virtual data-driven synergistic aggregate infrastructures, \"cross-platform, feeds\n        bleeding-edge tagclouds.\" Platforms extend interactive B2C benchmark proactive, embrace e-markets,\n        transition generate peer-to-peer.\n    </ids-text>\n    <ids-hyperlink slot=\"expander-default\" font-size=\"14\">Show More</ids-hyperlink>\n    <ids-hyperlink slot=\"expander-expanded\" font-size=\"14\">Show Less</ids-hyperlink>\n</ids-expandable-area>\n```\n\nIds Expandable Area - Toggle Button\n\n```html\n<ids-expandable-area type=\"toggle-btn\">\n    <ids-toggle-button\n        slot=\"header\"\n        id=\"test-toggle-button\"\n        icon-on=\"caret-up\"\n        icon-off=\"caret-down\"\n        text-off=\"Employee\"\n        text-on=\"Employee\"\n    >\n        <span></span>\n        <ids-icon icon=\"settings\"></ids-icon>\n    </ids-toggle-button>\n    <ids-text slot=\"pane\" font-size=\"14\">\n        Ubiquitous out-of-the-box, scalable; communities disintermediate beta-test, enable utilize markets dynamic\n        infomediaries virtual data-driven synergistic aggregate infrastructures, \"cross-platform, feeds\n        bleeding-edge tagclouds.\" Platforms extend interactive B2C benchmark proactive, embrace e-markets,\n        transition generate peer-to-peer.\n    </ids-text>\n</ids-expandable-area>\n```\n\n## States and Variations\n\n- **Collapsed**: The state where the expandable area’s content is not visible. Sometimes it serves as the default state, this state can also be remembered by the application.\n- **Expanded**: The state where the expandable area’s content is visible. Sometimes it serves as the default state, this state can also be remembered by the application.\n\n## Keyboard Guidelines\n\n- **Enter or Space**: When focus is on an `expander`, this keystroke toggles the expansion of the corresponding expandable area panel. If collapsed, the panel is expanded, and its aria-expanded state is set to true. If expanded, the panel is collapsed and its aria-expanded state is set to false.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Expandable Area and Field Set were separated\n\n**4.x to 5.x**\n- The ExpandableArea component has been changed to a web component and renamed to `<ids-expandable-area>`.\n- Markup has changed to a custom element `<ids-expandable-area` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The settings are changed and uses flexible slots\n- The events now use native events / custom events\n"}},{"name":"ids-fieldset","attributes":[],"description":{"kind":"markdown","value":"# ids-fieldset\n\n## Description\n\nField sets are used to group various content or input fields into a section. They can include various input fields and other components as well. They are often used as building block of forms.\n\n## Use Cases\n\n- Use when you need form sections\n\n## Terminology\n\n- **Fieldset**: An html <fieldset> tag is used to group related elements in a form.\n\n## Features (With Code Examples)\n\nAn IdsFieldset inside a form element. Best practice is to use an IdsText element inside the legend possibly with a type like h2.\n\n```html\n<form>\n  <ids-fieldset>\n    <legend><ids-text font-size=\"24\" type=\"h2\">Company Information</ids-text></legend>\n    <ids-input type=\"text\" label=\"Company Name\" id=\"company-name\"></ids-input>\n    <ids-input type=\"text\" label=\"Company Type\" id=\"type\"></ids-input>\n    <ids-input type=\"text\" label=\"Company Address\" id=\"company-address\"></ids-input>\n    <ids-checkbox label=\"Checked\" checked=\"true\"></ids-checkbox>\n    <ids-button appearance=\"primary\">Submit</ids-button>\n  </ids-fieldset>\n</form>\n```\n\nIt is possible to use a field set with a legend and a title and a sub-title.\n\n```html\n<ids-fieldset>\n  <legend>\n    <ids-text font-size=\"20\" type=\"h2\">Quantities</ids-text>\n    <ids-text color=\"foreground-default-tertiary\" font-size=\"16\" type=\"h3\">U/M: EA</ids-text>\n  </legend>\n\n  <ids-input label=\"Quantity on hand\" text-align=\"end\" placeholder=\"Enter on quantity\" value=\"254\"></ids-input>\n  <ids-input label=\"Non-Nettable stock\" text-align=\"end\" placeholder=\"Enter non-nettable stock\" value=\"123\"></ids-input>\n</ids-fieldset>\n```\n\n## Themeable Parts\n\n- `fieldset` allows you to further style the fieldset HTML element in the slot\n\n## Responsive Guidelines\n\nField sets have a default responsive behavior to move from two columns to one at our mobile breakpoints. The behavior is not limited to this, however, it is important to keep in mind the complexity that a multitude of content columns can bring to an application experience.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Removed the expand/collapse button, Changed class inforFieldSetLabel and inforFieldSet\n\n**4.x to 5.x**\n- The fieldset component has been changed to a web component and renamed to `<ids-fieldset>`.\n- Markup has changed to a custom element `<ids-fieldset>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The uses flexible slots for content\n\n## Regional Considerations\n\nThe fieldset will flip in in Right To Left languages.\n"}},{"name":"ids-filter-field","description":{"kind":"markdown","value":"# ids-filter-field\n\n## Description\n\nWe include a filter field component that helps layout an input next to a menu button with filter operators. It expects an input component\nsuch as IdsInput, IdsDatePicker, IdsTimePicker, IdsDropdown, or IdsLookup to be slotted in.\n\n## Class Hierarchy\n\n- IdsFilterField\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLabelStateMixin\n\n## Use Cases\n\n- When you want an input with a default or customized menu of filter operators to emit `change` events together.\n\n## Features (With Code Examples)\n\nAdd an IdsFilterField to the page and inside its slot add one input component.\n\n```html\n<ids-filter-field label=\"Text\">\n  <ids-input></ids-input>\n</ids-filter-field>\n```\n\nExample usage with dropdown input\n\n```html\n<ids-filter-field label=\"Dropdown\">\n  <ids-dropdown value=\"opt2\">\n    <ids-list-box>\n      <ids-list-box-option value=\"opt1\">Option One</ids-list-box-option>\n      <ids-list-box-option value=\"opt2\">Option Two</ids-list-box-option>\n      <ids-list-box-option value=\"opt3\">Option Three</ids-list-box-option>\n      <ids-list-box-option value=\"opt4\">Option Four</ids-list-box-option>\n      <ids-list-box-option value=\"opt5\">Option Five</ids-list-box-option>\n      <ids-list-box-option value=\"opt6\">Option Six</ids-list-box-option>\n    </ids-list-box>\n  </ids-dropdown>\n</ids-filter-field>\n```\n\nExample setting custom operators list\n\n```js\n  const filterField = document.querySelector('ids-filter-field');\n  filterField.operators = [\n    {\n      text: 'Equals',\n      value: 'equals',\n      icon: 'filter-equals',\n      selected: true\n    },\n    {\n      text: 'Does not equal',\n      value: 'does-not-equal',\n      icon: 'filter-does-not-equal',\n      selected: false\n    }\n  ];\n```\n\n## Settings and Attributes\n\n- `autoselect` {boolean} Set the text to auto select on focus, this setting is on each of the sub components.\n- `label` {string} This adds a label to the filter field\n- `size` {string} set the input size, it will set `md` as defaults\n- `value` {string} sets the value of the slotted input component\n- `operator` {string} sets the filter operator value\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `readonly` {string | boolean} Controls the readonly state of the filter field. Accepts:\n  - `readonly` or `readonly=\"\"`: Both the input and operator button are readonly/disabled\n  - `readonly=\"input\"`: Only the slotted input is readonly; the operator button remains interactive\n  - `readonly=\"button\"`: Only the operator button is disabled; the input remains editable\n\n## Events\n\n- `input` Fires when the input value changes. Event details object provides input value and input element reference.\n- `change` Fires when input value or operator selection is changed. Event details object provides operator value, input value, and input element reference.\n"}},{"name":"ids-form","attributes":[{"name":"compact","description":"Sets the compact attribute","values":[]},{"name":"field-height","description":"Set the fieldHeight (height) of input","values":[]},{"name":"submit-button","description":"Set the id of the submit button","values":[]},{"name":"ids-components","description":"Returns an array containing only IdsElements","values":[]},{"name":"form-components","description":"Returns an array containing only Ids Elements that are considered form components.","values":[]},{"name":"is-dirty","description":"Return if and form fields are dirty or not","values":[]},{"name":"dirty-form-components","description":"Returs all dirty form components.","values":[]},{"name":"is-valid","description":"Return if the form is valid or not","values":[]},{"name":"error-form-components","description":"Return the inputs with validation errors","values":[]}],"description":{"kind":"markdown","value":"# ids-form\n\n## Description\n\nThe ids-form provides similar functionality to the `<form>` HTML element. The form component enables the ability to link a submit button. When the form is submitted, the submit event is fired in which you can do what is needed with the form data. This component also allows you to toggle the `compact` mode. And get which form fields have been changed (dirty) and reset this. You can also see which fields have errors with the API. The layout of the page is handled by [ids-layout-grid](https://design.infor.com/components/utilities/layout-grid/).\n\n## Terminology\n\n- **Form**: A HTML `<form>` is used to collect user input. \n- **Validation Messages**: Input errors a field might have.\n- **isDirty**: Form or field has been changed from its original value.\n- **inValid**: Form or field has one or more errors.\n\n## Features (With Code Examples)\n\nA basic form has an `id` and a `submit-button` property that links to a button. Setting `compact` to `true` if you have a large form and not much space, but its recommended to use the larger/normal size fields in most cases, and for better mobile experience.\n\n```html\n    <ids-form compact=\"false\" submit-button=\"btn-submit\" id=\"sample-form\">\n      <ids-layout-grid cols=\"2\" gap=\"md\">\n        <ids-layout-grid-cell>\n          <ids-input id=\"field-1\" label=\"Field One\"></ids-input>\n          <ids-input id=\"field-2\" label=\"Field Two\"></ids-input>\n\n          <ids-button id=\"btn-submit\" appearance=\"primary\">\n            <span>Submit</span>\n          </ids-button>\n        </ids-layout-grid-cell>\n        <ids-layout-grid-cell>\n          <ids-input id=\"field-3\" label=\"Field Three\"></ids-input>\n          <ids-input id=\"field-4\" label=\"Field Four\"></ids-input>\n\n        </ids-layout-grid-cell>\n      </ids-layout-grid>\n    </ids-form>\n```\n\n## Class Hierarchy\n\n- IdsForm\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n\n## Settings (Attributes)\n\n- `compact` {boolean} When set to `true`, reduce the height and padding of form components.\n- `name` {string} Adds a name to the form, this is only used for possible naming.\n- `submit-button` {string} Sets the id of the submit button, which will fire a submit event when clicked.\n\n## Events\n\n- `submit` Fires when the form is submitted / the submit button is clicked. In the event data, you will get all components in the form of type formComponent and the form data including, value, oldValue, dirty info and validation info.\n\n## Getters / Methods\n\n- `errorFormComponents` Returns all form components in error.\n- `isValid` Returns true if any form components are in error.\n- `dirtyFormComponents` Returns all form components that have been changed from their original value.\n- `isDirty` Returns true if any form components are dirty.\n- `resetDirtyTracker` Resets the dirty tracker for all form components.\n- `formComponents` Returns all form components of type formComponent.\n- `idsComponents` Returns all ids components in the form.\n- `checkValidation` Runs validation all form fields\n\n## Themeable Parts\n\n- `form` allows you style the internal form element if needed\n\n## States and Variations\n\n- Dirty\n- Error\n\n## Responsive Guidelines\n\n- See `ids-layout-grid` for details as this is the layout driver for forms\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Forms were first implemented in v4.0.0 in this version you just used a `<form>` element.\n\n**4.x to 5.x**\n\n- Forms are now custom elements `<ids-form>...</ids-form>`\n- If using events events are now plain JS events. `submit`\n- Folks using reactive forms in angular will need to give us feedback.\n- The previous version just had forms as layouts, now the form has more functionality.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The fields in the form will flip the direction of the fields but these are details of the `ids-layout-grid` component.\n"}},{"name":"ids-global","attributes":[{"name":"personalize","values":[]},{"name":"version","values":[]},{"name":"theme-name","values":[]},{"name":"theme-name","values":[]},{"name":"theme-path","values":[]},{"name":"theme-path","values":[]},{"name":"custom-icon-data","values":[]},{"name":"custom-icon-data","values":[]},{"name":"style-sheet-cache","values":[]},{"name":"filter-manager","description":"Gets the global data grid filter manager instance.\nProvides centralized control for managing filter popups across all data grids.","values":[]}],"description":{"kind":"markdown","value":"# ids-global\n\n## Description\n\nThe Global API exposes a few objects that can be used global and will be added to in the future. This global object is similar in nature to the `Soho` object in the older components. The Global API handles or will handle in the future the following:\n\n- locale api singleton\n- personalization api singleton\n- theme api singleton\n- anything else shared globally\n\nAny objects that are a singleton must return the same instance so have a `getInstanceName` method. For example:\n\n```js\nif (!window.IdsGlobal.locale) {\n  window.IdsGlobal.locale = new IdsLocale();\n}\n\nreturn window.IdsGlobal.locale;\n```\n\n## Importing and using IdsGlobal\n\n```js\nimport IdsGlobal from 'mode_modules/ids-enterprise-wc/components/ids-global/ids-global';\n\nconst locale = await IdsGlobal.getLocale().setLocale('it-lT');\nlocale.extendTranslations(localeAPI.currentLanguage.name, myStrings);\n```\n\n## Whats in IdsGlobal\n\n- `getLocale()` {IdsLocale} A singleton instance of IdsLocale (see ids-locale from details). Allows you to get to it at a global level.\n- `onThemeLoaded()` {IdsDeferred} Fires when the theme is loaded.\n- `personalize` {IdsPersonalize} Access to the personalization API\n- `version` {string} Displays the components version\n- `themeName` {string} Allows you to get and set the current theme\n- `themePath` {string} Allows you to the relative path or complete path to a where the themes folder is. This includes the themes folder itself. This must be set before any component is imported.\n- `customIconData` {JSON} Allows you to store custom icon SVG for `ids-icon`.\n\n## Example of using Theme Path\n\n```html\n<head>\n  ...\n  <script>\n    window.IdsGlobal = { themePath: '/node_modules/ids-enterprise-wc/themes/' };\n  </script>\n  <script defer type=\"module\" src=\"node_modules/ids-enterprise-wc/enterprise-wc.js\"></script>\n</head>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- `Soho.Locale` is now `IdsGlobal.locale` but you can also import it and use it as above\n"}},{"name":"ids-header","attributes":[{"name":"color-variants","values":[]},{"name":"color","description":"Sets the color attribute","values":[]},{"name":"compact","description":"Gets the compact attribute","values":[]},{"name":"sticky","description":"Gets the sticky attribute","values":[]},{"name":"sticky-top","description":"Gets the sticky-top attribute","values":[]},{"name":"slot-elements","description":"Gets the elements assigned to the header slot","values":[]}],"description":{"kind":"markdown","value":"# ids-header\n\n## Description\n\nDisplays identifying information for a given data set. Best for identifying the main object or data set in a given view.\n\n## Settings and Attributes\n\n- `color` {string} Sets the header background color\n- `compact` {string} Sets the header compact attribute\n- `sticky` {boolean} Makes the header stick to the top when scrolling\n- `sticky-top` {string} Sets the top position when sticky (default: '0')\n\n## Code Examples\n\nA basic use case of the default ids header.\n\n```html\n<ids-header>\n  <ids-text font-size=\"12\" type=\"h1\">Ids Header</ids-text>\n</ids-header>\n```\n\nHeader components can contain other navigation components, such as [IdsBreadcrumb](../ids-breadcrumb/README.md) and [IdsToolbar](../ids-toolbar/README.md):\n\n```html\n<ids-header>\n  <ids-toolbar id=\"my-toolbar\">\n    <ids-toolbar-section type=\"title\">\n      <ids-text font-size=\"20\">Page Title</ids-text>\n      <ids-text font-size=\"14\">Subtitle</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"buttonset\" align=\"end\">\n      <ids-button id=\"button-1\" role=\"button\">\n        <span>Text</span>\n      </ids-button>\n      <ids-button id=\"button-2\">\n        <span class=\"audible\">Settings</span>\n        <ids-icon icon=\"settings\"></ids-icon>\n      </ids-button>\n    </ids-toolbar-section>\n  </ids-toolbar>\n</ids-header>\n```\nFor a compact header, you can use the `compact` attribute to reduce the height of the header:\n\n```html\n<ids-header compact>\n <ids-toolbar>...</ids-toolbar>\n</ids-header>\n```\n\nFor a sticky header that remains at the top when scrolling:\n\n```html\n<ids-header sticky>\n <ids-toolbar>...</ids-toolbar>\n</ids-header>\n```\n\nTo set a custom top position for the sticky header:\n\n```html\n<ids-header sticky sticky-top=\"60px\">\n <ids-toolbar>...</ids-toolbar>\n</ids-header>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Replaces Module Header\n- Has entirely different structure with no direct mapping\n\n**4.x to 5.x**\n- The header component has been changed to a web component and renamed to `<ids-header>`.\n- Markup has changed to a custom element `<ids-header>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The uses ids-toolbar component for content\n- The <ids-header></ids-header> custom element has a color attribute that can be applied to personalize the background color.\n- Deprecated: Alternate breadcrumbs and alternate wizard and alternate tabs\n"}},{"name":"ids-hidden","attributes":[{"name":"hide-down","description":"Get the hideDown attribute","values":[]},{"name":"hide-up","description":"Get the hideUp attribute","values":[]},{"name":"visible","description":"Get the visible attribute","values":[]},{"name":"condition","description":"Get the compare condition","values":[]},{"name":"value","description":"Get the compare value","values":[]},{"name":"enable-container","description":"Get the enable-container attribute","values":[]},{"name":"container-target","description":"Get the container target","values":[]}],"description":{"kind":"markdown","value":"# ids-hidden\n\n## Description\n\nThe IDS Hidden `ids-hidden` is a wrapper component that can be used to responsively hide children components based on selected breakpoints.\n\n## Use Cases\n\nCreate responsive layouts or hide/show components based on selected breakpoints\n\n## Terminology\n\n- **hide-up**: An attribute that when set with a breakpoint size will hide when the min-width breakpoint is reached.\n- **hide-down**: An attribute that when set with a breakpoint size will hide when the max-width breakpoint is reached.\n- **enable-container**: Sets or removes the `enable-container` attribute and class based on the truthiness of the string value to toggle the use of container queries.\n- **container-target**: Sets the `container-target` attribute to the ID of a DOM element and applies `containerType: inline-size`, or removes the attribute if the value is null or empty.\n- **breakpoints**:\n- xxl: 1440px\n- xl: 1280px\n- l: 1024px\n- m: 840px\n- s: 600px\n- xs: 360px\n\n## Features (With Code Examples)\n\n```html\n<ids-hidden id=\"hidden-1\" hide-up=\"md\">\n  <ids-card>\n    <div slot=\"card-header\">\n      <ids-text font-size=\"20\" type=\"h2\" overflow=\"ellipsis\" tooltip=\"true\">Card Title One</ids-text>\n    </div>\n    <div slot=\"card-content\">\n    </div>\n  </ids-card>\n</ids-hidden>\n\n<ids-hidden id=\"hidden-2\" hide-down=\"md\">\n  <ids-card>\n    <div slot=\"card-header\">\n      <ids-text font-size=\"20\" type=\"h2\" overflow=\"ellipsis\" tooltip=\"true\">Card Title Two</ids-text>\n    </div>\n    <div slot=\"card-content\">\n    </div>\n  </ids-card>\n</ids-hidden>\n```\n\n## States and Variations\n\n- **visible**: The state where `ids-hidden` is visible. Is set set by the `visible` attribute.\n- **hidden**: The state where `ids-hidden` is hidden.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n- The hidden component replaces the visibility functionality https://main-enterprise.demo.design.infor.com/components/visibility/list\n- Markup has changed to a custom element `<ids-hidden>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-hierarchy-item","attributes":[{"name":"#prev-selected","description":"store the previous \"selected\" value to prevent double firing events","values":[]},{"name":"child-elements","values":[]},{"name":"expander","values":[]},{"name":"dropdown-menu","values":[]},{"name":"leaf","values":[]},{"name":"nested-item-container","values":[]},{"name":"expanded","description":"Set the value of the expanded attribute","values":[]},{"name":"selected","description":"Set the value of the selected attribute","values":[]},{"name":"root-item","description":"Set the value of the root attribute","values":[]},{"name":"color","description":"Set the color of the bar","values":[]},{"name":"load-children","description":"An async function that fires as the dropdown is opening allowing you to set contents.","values":[]},{"name":"has-children","description":"An async function that fires as the dropdown is opening allowing you to set contents.","values":[]}],"description":{"kind":"markdown","value":"# ids-hierarchy\n\n## Description\n\nThe IDS Hierarchy (Org Chart) component is a UI pattern that is comprised expandable hierarchical cards. It consists of an wrapper component called `ids-hierarchy` and it's items called `ids-hierarchy-item`. The `ids-hierarchy-item` component can be nested in side each other to create another level of hierarchy. Additionally there is an `ids-hierarchy-legend` component that can be used to display the legend for the org chart.\n\n## Use Cases\n\nThe main use case for the IDS Hierarchy component is to create an organizational chart with each leaf (card) containing details on employees and their hierarchy in the org.\n\n## Terminology\n\n- **leaf**: The horizontal card that contains details\n- **avatar**: A named `slot` that usually consists of an `img` thumbnail\n- **heading**: A named `slot` that usually consists of `ids-text` component and displays the heading of the hierarchy item.\n- **subheading**: A named `slot` that usually consists of `ids-text` component and displays the subheading of the hierarchy item.\n- **micro**: A named `slot` that usually consists of `ids-text` component and displays the micro text of the hierarchy item.\n- **icon-btn**: An element in the `ids-hierarchy-item` that acts as the trigger for expanding and collapsing the hierarchy item.\n- **legend**: A component called `ids-hierarchy-legend` that is used to display the legend for the org chart. It consists of a text property and color-variant.\n\n## Features (With Code Examples)\n\n```html\n<ids-hierarchy>\n  <ids-hierarchy-item id=\"item-1\" root-item expanded color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n\n    <ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n      <ids-text slot=\"heading\">Julie Dawes</ids-text>\n      <ids-text slot=\"subheading\">Records Clerk</ids-text>\n      <ids-text slot=\"micro\">PT</ids-text>\n    </ids-hierarchy-item>\n    <ids-hierarchy-item id=\"item-3\" color-variant=\"contractor\">\n      <ids-text slot=\"heading\">Kaylee Edwards</ids-text>\n      <ids-text slot=\"subheading\">Records Manager</ids-text>\n      <ids-text slot=\"micro\">C</ids-text>\n\n      <ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n        <ids-text slot=\"heading\">Julie Dawes</ids-text>\n        <ids-text slot=\"subheading\">Records Clerk</ids-text>\n        <ids-text slot=\"micro\">OP</ids-text>\n\n        <ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n          <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n          <ids-text slot=\"subheading\">Director</ids-text>\n          <ids-text slot=\"micro\">C</ids-text>\n        </ids-hierarchy-item>\n      </ids-hierarchy-item>\n    </ids-hierarchy-item>\n  </ids-hierarchy-item>\n</ids-hierarchy>\n```\n\nExample with legend\n\n```html\n<ids-hierarchy-legend>\n  <ids-hierarchy-legend-item\n    text=\"Full Time\"\n    color-variant=\"full-time\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Part Time\"\n    color-variant=\"part-time\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Contractor\"\n    color-variant=\"contractor\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Open Position\"\n    color-variant=\"open-position\"\n  ></ids-hierarchy-legend-item>\n</ids-hierarchy-legend>\n\n<ids-hierarchy>\n  <ids-hierarchy-item id=\"item-1\" root-item expanded color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n\n    <ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n      <ids-text slot=\"heading\">Julie Dawes</ids-text>\n      <ids-text slot=\"subheading\">Records Clerk</ids-text>\n      <ids-text slot=\"micro\">PT</ids-text>\n    </ids-hierarchy-item>\n    <ids-hierarchy-item id=\"item-3\" color-variant=\"contractor\">\n      <ids-text slot=\"heading\">Kaylee Edwards</ids-text>\n      <ids-text slot=\"subheading\">Records Manager</ids-text>\n      <ids-text slot=\"micro\">C</ids-text>\n\n      <ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n        <ids-text slot=\"heading\">Julie Dawes</ids-text>\n        <ids-text slot=\"subheading\">Records Clerk</ids-text>\n        <ids-text slot=\"micro\">OP</ids-text>\n\n        <ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n          <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n          <ids-text slot=\"subheading\">Director</ids-text>\n          <ids-text slot=\"micro\">C</ids-text>\n        </ids-hierarchy-item>\n      </ids-hierarchy-item>\n    </ids-hierarchy-item>\n  </ids-hierarchy-item>\n</ids-hierarchy>\n```\n\n### Color Variants\n\nThe `ids-hierarchy-item` and `ids-hierarchy-legend-item` make use of the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md) to modify the colors per item. There are currently 4 color variants available: `full-time`, `part-time`, `contractor` and `open-position`.\n\n```html\n<ids-hierarchy-item id=\"item-1\" color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n    <ids-text slot=\"heading\">Julie Dawes</ids-text>\n    <ids-text slot=\"subheading\">Records Clerk</ids-text>\n    <ids-text slot=\"micro\">PT</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">C</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n    <ids-text slot=\"heading\">Julie Dawes</ids-text>\n    <ids-text slot=\"subheading\">Records Clerk</ids-text>\n    <ids-text slot=\"micro\">OP</ids-text>\n</ids-hierarchy-item>\n```\n\n## States and Variations\n\n- **root-item**: This is an attribute that can be added the top level `ids-hierarchy-item`. This is added to adjust the styling of the root item.\n- **Expanded**: The state where the leaf's children are visible. Sometimes it serves as the default state, this state can also be remembered by the application.\n- **Selected**: The state where the leaf appears selected or focused\n\n## Keyboard Guidelines\n\n- **Enter or Space**: When focus is on an `icon-btn`, this keystroke toggles the expansion of the corresponding leaf. If collapsed, the leaf is expanded, and its aria-expanded state is set to true. If expanded, the leaf is collapsed and its aria-expanded state is set to false.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- The Hierarchy component has been changed to a web component and use with `ids-hierarchy`, `ids-hierarchy-item` and `ids-hierarchy-legend`.\n- Markup has changed to a custom element `<ids-hidden>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The multi level hierarchy has been removed (as is multi root)\n- The paging hierarchy has been discontinued\n"}},{"name":"ids-hierarchy-legend-item","attributes":[{"name":"text","description":"Set the value of the text attribute","values":[]},{"name":"color","description":"Set the color of the bar","values":[]}],"description":{"kind":"markdown","value":"# ids-hierarchy\n\n## Description\n\nThe IDS Hierarchy (Org Chart) component is a UI pattern that is comprised expandable hierarchical cards. It consists of an wrapper component called `ids-hierarchy` and it's items called `ids-hierarchy-item`. The `ids-hierarchy-item` component can be nested in side each other to create another level of hierarchy. Additionally there is an `ids-hierarchy-legend` component that can be used to display the legend for the org chart.\n\n## Use Cases\n\nThe main use case for the IDS Hierarchy component is to create an organizational chart with each leaf (card) containing details on employees and their hierarchy in the org.\n\n## Terminology\n\n- **leaf**: The horizontal card that contains details\n- **avatar**: A named `slot` that usually consists of an `img` thumbnail\n- **heading**: A named `slot` that usually consists of `ids-text` component and displays the heading of the hierarchy item.\n- **subheading**: A named `slot` that usually consists of `ids-text` component and displays the subheading of the hierarchy item.\n- **micro**: A named `slot` that usually consists of `ids-text` component and displays the micro text of the hierarchy item.\n- **icon-btn**: An element in the `ids-hierarchy-item` that acts as the trigger for expanding and collapsing the hierarchy item.\n- **legend**: A component called `ids-hierarchy-legend` that is used to display the legend for the org chart. It consists of a text property and color-variant.\n\n## Features (With Code Examples)\n\n```html\n<ids-hierarchy>\n  <ids-hierarchy-item id=\"item-1\" root-item expanded color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n\n    <ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n      <ids-text slot=\"heading\">Julie Dawes</ids-text>\n      <ids-text slot=\"subheading\">Records Clerk</ids-text>\n      <ids-text slot=\"micro\">PT</ids-text>\n    </ids-hierarchy-item>\n    <ids-hierarchy-item id=\"item-3\" color-variant=\"contractor\">\n      <ids-text slot=\"heading\">Kaylee Edwards</ids-text>\n      <ids-text slot=\"subheading\">Records Manager</ids-text>\n      <ids-text slot=\"micro\">C</ids-text>\n\n      <ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n        <ids-text slot=\"heading\">Julie Dawes</ids-text>\n        <ids-text slot=\"subheading\">Records Clerk</ids-text>\n        <ids-text slot=\"micro\">OP</ids-text>\n\n        <ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n          <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n          <ids-text slot=\"subheading\">Director</ids-text>\n          <ids-text slot=\"micro\">C</ids-text>\n        </ids-hierarchy-item>\n      </ids-hierarchy-item>\n    </ids-hierarchy-item>\n  </ids-hierarchy-item>\n</ids-hierarchy>\n```\n\nExample with legend\n\n```html\n<ids-hierarchy-legend>\n  <ids-hierarchy-legend-item\n    text=\"Full Time\"\n    color-variant=\"full-time\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Part Time\"\n    color-variant=\"part-time\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Contractor\"\n    color-variant=\"contractor\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Open Position\"\n    color-variant=\"open-position\"\n  ></ids-hierarchy-legend-item>\n</ids-hierarchy-legend>\n\n<ids-hierarchy>\n  <ids-hierarchy-item id=\"item-1\" root-item expanded color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n\n    <ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n      <ids-text slot=\"heading\">Julie Dawes</ids-text>\n      <ids-text slot=\"subheading\">Records Clerk</ids-text>\n      <ids-text slot=\"micro\">PT</ids-text>\n    </ids-hierarchy-item>\n    <ids-hierarchy-item id=\"item-3\" color-variant=\"contractor\">\n      <ids-text slot=\"heading\">Kaylee Edwards</ids-text>\n      <ids-text slot=\"subheading\">Records Manager</ids-text>\n      <ids-text slot=\"micro\">C</ids-text>\n\n      <ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n        <ids-text slot=\"heading\">Julie Dawes</ids-text>\n        <ids-text slot=\"subheading\">Records Clerk</ids-text>\n        <ids-text slot=\"micro\">OP</ids-text>\n\n        <ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n          <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n          <ids-text slot=\"subheading\">Director</ids-text>\n          <ids-text slot=\"micro\">C</ids-text>\n        </ids-hierarchy-item>\n      </ids-hierarchy-item>\n    </ids-hierarchy-item>\n  </ids-hierarchy-item>\n</ids-hierarchy>\n```\n\n### Color Variants\n\nThe `ids-hierarchy-item` and `ids-hierarchy-legend-item` make use of the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md) to modify the colors per item. There are currently 4 color variants available: `full-time`, `part-time`, `contractor` and `open-position`.\n\n```html\n<ids-hierarchy-item id=\"item-1\" color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n    <ids-text slot=\"heading\">Julie Dawes</ids-text>\n    <ids-text slot=\"subheading\">Records Clerk</ids-text>\n    <ids-text slot=\"micro\">PT</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">C</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n    <ids-text slot=\"heading\">Julie Dawes</ids-text>\n    <ids-text slot=\"subheading\">Records Clerk</ids-text>\n    <ids-text slot=\"micro\">OP</ids-text>\n</ids-hierarchy-item>\n```\n\n## States and Variations\n\n- **root-item**: This is an attribute that can be added the top level `ids-hierarchy-item`. This is added to adjust the styling of the root item.\n- **Expanded**: The state where the leaf's children are visible. Sometimes it serves as the default state, this state can also be remembered by the application.\n- **Selected**: The state where the leaf appears selected or focused\n\n## Keyboard Guidelines\n\n- **Enter or Space**: When focus is on an `icon-btn`, this keystroke toggles the expansion of the corresponding leaf. If collapsed, the leaf is expanded, and its aria-expanded state is set to true. If expanded, the leaf is collapsed and its aria-expanded state is set to false.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- The Hierarchy component has been changed to a web component and use with `ids-hierarchy`, `ids-hierarchy-item` and `ids-hierarchy-legend`.\n- Markup has changed to a custom element `<ids-hidden>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The multi level hierarchy has been removed (as is multi root)\n- The paging hierarchy has been discontinued\n"}},{"name":"ids-hierarchy-legend","attributes":[],"description":{"kind":"markdown","value":"# ids-hierarchy\n\n## Description\n\nThe IDS Hierarchy (Org Chart) component is a UI pattern that is comprised expandable hierarchical cards. It consists of an wrapper component called `ids-hierarchy` and it's items called `ids-hierarchy-item`. The `ids-hierarchy-item` component can be nested in side each other to create another level of hierarchy. Additionally there is an `ids-hierarchy-legend` component that can be used to display the legend for the org chart.\n\n## Use Cases\n\nThe main use case for the IDS Hierarchy component is to create an organizational chart with each leaf (card) containing details on employees and their hierarchy in the org.\n\n## Terminology\n\n- **leaf**: The horizontal card that contains details\n- **avatar**: A named `slot` that usually consists of an `img` thumbnail\n- **heading**: A named `slot` that usually consists of `ids-text` component and displays the heading of the hierarchy item.\n- **subheading**: A named `slot` that usually consists of `ids-text` component and displays the subheading of the hierarchy item.\n- **micro**: A named `slot` that usually consists of `ids-text` component and displays the micro text of the hierarchy item.\n- **icon-btn**: An element in the `ids-hierarchy-item` that acts as the trigger for expanding and collapsing the hierarchy item.\n- **legend**: A component called `ids-hierarchy-legend` that is used to display the legend for the org chart. It consists of a text property and color-variant.\n\n## Features (With Code Examples)\n\n```html\n<ids-hierarchy>\n  <ids-hierarchy-item id=\"item-1\" root-item expanded color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n\n    <ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n      <ids-text slot=\"heading\">Julie Dawes</ids-text>\n      <ids-text slot=\"subheading\">Records Clerk</ids-text>\n      <ids-text slot=\"micro\">PT</ids-text>\n    </ids-hierarchy-item>\n    <ids-hierarchy-item id=\"item-3\" color-variant=\"contractor\">\n      <ids-text slot=\"heading\">Kaylee Edwards</ids-text>\n      <ids-text slot=\"subheading\">Records Manager</ids-text>\n      <ids-text slot=\"micro\">C</ids-text>\n\n      <ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n        <ids-text slot=\"heading\">Julie Dawes</ids-text>\n        <ids-text slot=\"subheading\">Records Clerk</ids-text>\n        <ids-text slot=\"micro\">OP</ids-text>\n\n        <ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n          <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n          <ids-text slot=\"subheading\">Director</ids-text>\n          <ids-text slot=\"micro\">C</ids-text>\n        </ids-hierarchy-item>\n      </ids-hierarchy-item>\n    </ids-hierarchy-item>\n  </ids-hierarchy-item>\n</ids-hierarchy>\n```\n\nExample with legend\n\n```html\n<ids-hierarchy-legend>\n  <ids-hierarchy-legend-item\n    text=\"Full Time\"\n    color-variant=\"full-time\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Part Time\"\n    color-variant=\"part-time\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Contractor\"\n    color-variant=\"contractor\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Open Position\"\n    color-variant=\"open-position\"\n  ></ids-hierarchy-legend-item>\n</ids-hierarchy-legend>\n\n<ids-hierarchy>\n  <ids-hierarchy-item id=\"item-1\" root-item expanded color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n\n    <ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n      <ids-text slot=\"heading\">Julie Dawes</ids-text>\n      <ids-text slot=\"subheading\">Records Clerk</ids-text>\n      <ids-text slot=\"micro\">PT</ids-text>\n    </ids-hierarchy-item>\n    <ids-hierarchy-item id=\"item-3\" color-variant=\"contractor\">\n      <ids-text slot=\"heading\">Kaylee Edwards</ids-text>\n      <ids-text slot=\"subheading\">Records Manager</ids-text>\n      <ids-text slot=\"micro\">C</ids-text>\n\n      <ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n        <ids-text slot=\"heading\">Julie Dawes</ids-text>\n        <ids-text slot=\"subheading\">Records Clerk</ids-text>\n        <ids-text slot=\"micro\">OP</ids-text>\n\n        <ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n          <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n          <ids-text slot=\"subheading\">Director</ids-text>\n          <ids-text slot=\"micro\">C</ids-text>\n        </ids-hierarchy-item>\n      </ids-hierarchy-item>\n    </ids-hierarchy-item>\n  </ids-hierarchy-item>\n</ids-hierarchy>\n```\n\n### Color Variants\n\nThe `ids-hierarchy-item` and `ids-hierarchy-legend-item` make use of the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md) to modify the colors per item. There are currently 4 color variants available: `full-time`, `part-time`, `contractor` and `open-position`.\n\n```html\n<ids-hierarchy-item id=\"item-1\" color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n    <ids-text slot=\"heading\">Julie Dawes</ids-text>\n    <ids-text slot=\"subheading\">Records Clerk</ids-text>\n    <ids-text slot=\"micro\">PT</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">C</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n    <ids-text slot=\"heading\">Julie Dawes</ids-text>\n    <ids-text slot=\"subheading\">Records Clerk</ids-text>\n    <ids-text slot=\"micro\">OP</ids-text>\n</ids-hierarchy-item>\n```\n\n## States and Variations\n\n- **root-item**: This is an attribute that can be added the top level `ids-hierarchy-item`. This is added to adjust the styling of the root item.\n- **Expanded**: The state where the leaf's children are visible. Sometimes it serves as the default state, this state can also be remembered by the application.\n- **Selected**: The state where the leaf appears selected or focused\n\n## Keyboard Guidelines\n\n- **Enter or Space**: When focus is on an `icon-btn`, this keystroke toggles the expansion of the corresponding leaf. If collapsed, the leaf is expanded, and its aria-expanded state is set to true. If expanded, the leaf is collapsed and its aria-expanded state is set to false.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- The Hierarchy component has been changed to a web component and use with `ids-hierarchy`, `ids-hierarchy-item` and `ids-hierarchy-legend`.\n- Markup has changed to a custom element `<ids-hidden>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The multi level hierarchy has been removed (as is multi root)\n- The paging hierarchy has been discontinued\n"}},{"name":"ids-hierarchy","attributes":[],"description":{"kind":"markdown","value":"# ids-hierarchy\n\n## Description\n\nThe IDS Hierarchy (Org Chart) component is a UI pattern that is comprised expandable hierarchical cards. It consists of an wrapper component called `ids-hierarchy` and it's items called `ids-hierarchy-item`. The `ids-hierarchy-item` component can be nested in side each other to create another level of hierarchy. Additionally there is an `ids-hierarchy-legend` component that can be used to display the legend for the org chart.\n\n## Use Cases\n\nThe main use case for the IDS Hierarchy component is to create an organizational chart with each leaf (card) containing details on employees and their hierarchy in the org.\n\n## Terminology\n\n- **leaf**: The horizontal card that contains details\n- **avatar**: A named `slot` that usually consists of an `img` thumbnail\n- **heading**: A named `slot` that usually consists of `ids-text` component and displays the heading of the hierarchy item.\n- **subheading**: A named `slot` that usually consists of `ids-text` component and displays the subheading of the hierarchy item.\n- **micro**: A named `slot` that usually consists of `ids-text` component and displays the micro text of the hierarchy item.\n- **icon-btn**: An element in the `ids-hierarchy-item` that acts as the trigger for expanding and collapsing the hierarchy item.\n- **legend**: A component called `ids-hierarchy-legend` that is used to display the legend for the org chart. It consists of a text property and color-variant.\n\n## Features (With Code Examples)\n\n```html\n<ids-hierarchy>\n  <ids-hierarchy-item id=\"item-1\" root-item expanded color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n\n    <ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n      <ids-text slot=\"heading\">Julie Dawes</ids-text>\n      <ids-text slot=\"subheading\">Records Clerk</ids-text>\n      <ids-text slot=\"micro\">PT</ids-text>\n    </ids-hierarchy-item>\n    <ids-hierarchy-item id=\"item-3\" color-variant=\"contractor\">\n      <ids-text slot=\"heading\">Kaylee Edwards</ids-text>\n      <ids-text slot=\"subheading\">Records Manager</ids-text>\n      <ids-text slot=\"micro\">C</ids-text>\n\n      <ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n        <ids-text slot=\"heading\">Julie Dawes</ids-text>\n        <ids-text slot=\"subheading\">Records Clerk</ids-text>\n        <ids-text slot=\"micro\">OP</ids-text>\n\n        <ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n          <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n          <ids-text slot=\"subheading\">Director</ids-text>\n          <ids-text slot=\"micro\">C</ids-text>\n        </ids-hierarchy-item>\n      </ids-hierarchy-item>\n    </ids-hierarchy-item>\n  </ids-hierarchy-item>\n</ids-hierarchy>\n```\n\nExample with legend\n\n```html\n<ids-hierarchy-legend>\n  <ids-hierarchy-legend-item\n    text=\"Full Time\"\n    color-variant=\"full-time\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Part Time\"\n    color-variant=\"part-time\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Contractor\"\n    color-variant=\"contractor\"\n  ></ids-hierarchy-legend-item>\n  <ids-hierarchy-legend-item\n    text=\"Open Position\"\n    color-variant=\"open-position\"\n  ></ids-hierarchy-legend-item>\n</ids-hierarchy-legend>\n\n<ids-hierarchy>\n  <ids-hierarchy-item id=\"item-1\" root-item expanded color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n\n    <ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n      <ids-text slot=\"heading\">Julie Dawes</ids-text>\n      <ids-text slot=\"subheading\">Records Clerk</ids-text>\n      <ids-text slot=\"micro\">PT</ids-text>\n    </ids-hierarchy-item>\n    <ids-hierarchy-item id=\"item-3\" color-variant=\"contractor\">\n      <ids-text slot=\"heading\">Kaylee Edwards</ids-text>\n      <ids-text slot=\"subheading\">Records Manager</ids-text>\n      <ids-text slot=\"micro\">C</ids-text>\n\n      <ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n        <ids-text slot=\"heading\">Julie Dawes</ids-text>\n        <ids-text slot=\"subheading\">Records Clerk</ids-text>\n        <ids-text slot=\"micro\">OP</ids-text>\n\n        <ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n          <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n          <ids-text slot=\"subheading\">Director</ids-text>\n          <ids-text slot=\"micro\">C</ids-text>\n        </ids-hierarchy-item>\n      </ids-hierarchy-item>\n    </ids-hierarchy-item>\n  </ids-hierarchy-item>\n</ids-hierarchy>\n```\n\n### Color Variants\n\nThe `ids-hierarchy-item` and `ids-hierarchy-legend-item` make use of the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md) to modify the colors per item. There are currently 4 color variants available: `full-time`, `part-time`, `contractor` and `open-position`.\n\n```html\n<ids-hierarchy-item id=\"item-1\" color-variant=\"full-time\">\n    <img src=\"..../assets/images/images/headshot-1.jpg\" alt=\"item-1\" slot=\"avatar\" />\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">FT</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-2\" color-variant=\"part-time\">\n    <ids-text slot=\"heading\">Julie Dawes</ids-text>\n    <ids-text slot=\"subheading\">Records Clerk</ids-text>\n    <ids-text slot=\"micro\">PT</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-5\" color-variant=\"contractor\">\n    <ids-text slot=\"heading\">Tony Cleveland</ids-text>\n    <ids-text slot=\"subheading\">Director</ids-text>\n    <ids-text slot=\"micro\">C</ids-text>\n</ids-hierarchy-item>\n\n<ids-hierarchy-item id=\"item-4\" color-variant=\"open-position\">\n    <ids-text slot=\"heading\">Julie Dawes</ids-text>\n    <ids-text slot=\"subheading\">Records Clerk</ids-text>\n    <ids-text slot=\"micro\">OP</ids-text>\n</ids-hierarchy-item>\n```\n\n## States and Variations\n\n- **root-item**: This is an attribute that can be added the top level `ids-hierarchy-item`. This is added to adjust the styling of the root item.\n- **Expanded**: The state where the leaf's children are visible. Sometimes it serves as the default state, this state can also be remembered by the application.\n- **Selected**: The state where the leaf appears selected or focused\n\n## Keyboard Guidelines\n\n- **Enter or Space**: When focus is on an `icon-btn`, this keystroke toggles the expansion of the corresponding leaf. If collapsed, the leaf is expanded, and its aria-expanded state is set to true. If expanded, the leaf is collapsed and its aria-expanded state is set to false.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- The Hierarchy component has been changed to a web component and use with `ids-hierarchy`, `ids-hierarchy-item` and `ids-hierarchy-legend`.\n- Markup has changed to a custom element `<ids-hidden>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- The multi level hierarchy has been removed (as is multi root)\n- The paging hierarchy has been discontinued\n"}},{"name":"ids-home-page-attributes","description":{"kind":"markdown","value":"# ids-homepage\n\n## Description\n\nHomepages hold combinations of widgets that are tailored to the needs of a user’s workflow. The Home Page component will set the layout to display the widgets in specific order according to available space in it's container. It take care everything as laid out in the best order and use of space that is possible. To keep the responsive behavior it will readjust each widget size and position on the event of resize.\n\n## Use Cases\n\n- Use when you want organize your content in specific order.\n- A homepage is an admin or end-user configured page made up of widgets that are relevant to the workflow of a general role or an individual. Widgets can be resized to create layouts best-suited for the data within the widget or homepage.\n\n## Terminology\n\n- **Widget**: The container to keep the content.\n\n## Features (With Code Examples)\n\nA normal home page used as a web component.\n\n```html\n<ids-home-page>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nA Widget spanning three columns.\n\n```html\n<ids-home-page>\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 3x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nA Widget with double height.\n\n```html\n<ids-home-page>\n  <ids-widget slot=\"widget\" rowspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x2</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nA quarter sized Widget (for special cases)\n\n```html\n<ids-home-page>\n  <ids-widget slot=\"widget\" quarter-size>\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x2</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nNo animation with widgets while changing/resizing.\n\n```html\n<ids-home-page animated=\"false\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 3x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\" colspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe home page with custom widgets height.\n\n```html\n<ids-home-page widgetHeight=\"260\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 3x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\" colspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe home page with custom widgets width.\n\n```html\n<ids-home-page widgetWidth=\"260\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 3x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\" colspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe home page max columns.\n\n```html\n<ids-home-page cols=\"4\">\n  <ids-widget slot=\"widget\" colspan=\"4\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 4x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\" colspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe widget gap for single span, apply same for both horizontal and vertical sides.\n\n```html\n<ids-home-page gap=\"50\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 4x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe widget horizontal gap for single span.\n\n```html\n<ids-home-page gap-x=\"50\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 4x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe widget vertical gap for single span.\n\n```html\n<ids-home-page gap-y=\"50\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 4x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\n## Settings for HomePage\n\n- `animated` {boolean} Set to animated or not the home page widgets on resize\n- `widgetHeight` {number} Set widget height for single span\n- `widgetWidth` {number} Set widget width for single span\n- `cols` {number} Set the number of columns to display\n- `gap` {number} Set widget gap for single span, apply same for both horizontal and vertical sides\n- `gapX` {number} Set widget horizontal gap for single span\n- `gapY` {number} Set widget vertical gap for single span\n\n## Settings for widgets\n\n- `colspan` {number} Set the horizontal span size (`widget-width * colspan`)\n- `rowspan` {number} Set the vertical span size (`widget-height * rowspan`)\n\n## Events\n\n- `resized` Fires after the page is resized and layout is set. Detail contains the element `elem` and the home page current status as rows, columns, container-height and matrix for each block.\n\n## Methods\n\n- `refresh` Refresh will resize calculations to update any changes.\n\n## Themeable Parts\n\n- `home-page` allows you to further style the home-page element\n- `widgets` allows you to further style the widgets container element\n\n## States and Variations (With Code Examples)\n\n- Animated widgets on change or resize\n- Custom widget height/width\n- Number of max columns to display\n- Horizontal and vertical span size\n- Widget gap for single span both horizontal and vertical sides\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the tab is focusable this will focus or unfocus content.\n\n## Responsive Guidelines\n\n- Flows the laid out in the best order and use of space it can be. It is possible to adjust columns to different size depending on how much screen and parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Home Page has all new markup and classes.\n\n**4.x to 5.x**\n\n- The HomePage component has been changed to a web component\n- Markup has changed to a custom element `<ids-home-page></ids-home-page>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- If using events, events are now plain JS events.\n- The hero example must be created manually by styling a widget\n\n## Accessibility Guidelines\n\n- The component respects element tab order which is important between the main containers\n\n## Regional Considerations\n\nThe widgets will flip to the alternate side in Right To Left mode.\n"}},{"name":"ids-home-page","attributes":[{"name":"#blocks","description":"List of blocks to manage widgets width/height and position.","values":[]},{"name":"#widgets","description":"List of widgets attached to home page.","values":[]},{"name":"#columns","description":"Number of current columns.","values":[]},{"name":"#container-height","description":"Container current height.","values":[]},{"name":"#gap-x","description":"Column gap","values":[]},{"name":"#gap-y","description":"Row gap","values":[]},{"name":"#rows-and-cols","description":"Keep all the blocks as rows and columns.","values":[]},{"name":"#resize-observer","description":"Attach the resize observer.","values":[]},{"name":"on-language-change","description":"Handle Languages Changes","values":[]},{"name":"status","description":"Get the current status of home page","values":[]},{"name":"animated","description":"Set to animated or not the home page widgets on resize.","values":[]},{"name":"widget-height","description":"Set widget height for single span","values":[]},{"name":"widget-width","description":"Set widget width for single span","values":[]},{"name":"cols","description":"Set number of columns to display","values":[]},{"name":"gap","description":"Set widget gap for single span, apply same for both horizontal and vertical sides","values":[]},{"name":"gap-x","description":"Set widget horizontal gap for single span","values":[]},{"name":"gap-y","description":"Set widget vertical gap for single span","values":[]}],"description":{"kind":"markdown","value":"# ids-homepage\n\n## Description\n\nHomepages hold combinations of widgets that are tailored to the needs of a user’s workflow. The Home Page component will set the layout to display the widgets in specific order according to available space in it's container. It take care everything as laid out in the best order and use of space that is possible. To keep the responsive behavior it will readjust each widget size and position on the event of resize.\n\n## Use Cases\n\n- Use when you want organize your content in specific order.\n- A homepage is an admin or end-user configured page made up of widgets that are relevant to the workflow of a general role or an individual. Widgets can be resized to create layouts best-suited for the data within the widget or homepage.\n\n## Terminology\n\n- **Widget**: The container to keep the content.\n\n## Features (With Code Examples)\n\nA normal home page used as a web component.\n\n```html\n<ids-home-page>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nA Widget spanning three columns.\n\n```html\n<ids-home-page>\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 3x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nA Widget with double height.\n\n```html\n<ids-home-page>\n  <ids-widget slot=\"widget\" rowspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x2</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nA quarter sized Widget (for special cases)\n\n```html\n<ids-home-page>\n  <ids-widget slot=\"widget\" quarter-size>\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x2</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nNo animation with widgets while changing/resizing.\n\n```html\n<ids-home-page animated=\"false\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 3x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\" colspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe home page with custom widgets height.\n\n```html\n<ids-home-page widgetHeight=\"260\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 3x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\" colspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe home page with custom widgets width.\n\n```html\n<ids-home-page widgetWidth=\"260\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 3x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\" colspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe home page max columns.\n\n```html\n<ids-home-page cols=\"4\">\n  <ids-widget slot=\"widget\" colspan=\"4\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 4x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\" colspan=\"2\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe widget gap for single span, apply same for both horizontal and vertical sides.\n\n```html\n<ids-home-page gap=\"50\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 4x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe widget horizontal gap for single span.\n\n```html\n<ids-home-page gap-x=\"50\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 4x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nThe widget vertical gap for single span.\n\n```html\n<ids-home-page gap-y=\"50\">\n  <ids-widget slot=\"widget\" colspan=\"3\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 4x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 2x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-text>Widget 1x1</ids-text>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\n## Settings for HomePage\n\n- `animated` {boolean} Set to animated or not the home page widgets on resize\n- `widgetHeight` {number} Set widget height for single span\n- `widgetWidth` {number} Set widget width for single span\n- `cols` {number} Set the number of columns to display\n- `gap` {number} Set widget gap for single span, apply same for both horizontal and vertical sides\n- `gapX` {number} Set widget horizontal gap for single span\n- `gapY` {number} Set widget vertical gap for single span\n\n## Settings for widgets\n\n- `colspan` {number} Set the horizontal span size (`widget-width * colspan`)\n- `rowspan` {number} Set the vertical span size (`widget-height * rowspan`)\n\n## Events\n\n- `resized` Fires after the page is resized and layout is set. Detail contains the element `elem` and the home page current status as rows, columns, container-height and matrix for each block.\n\n## Methods\n\n- `refresh` Refresh will resize calculations to update any changes.\n\n## Themeable Parts\n\n- `home-page` allows you to further style the home-page element\n- `widgets` allows you to further style the widgets container element\n\n## States and Variations (With Code Examples)\n\n- Animated widgets on change or resize\n- Custom widget height/width\n- Number of max columns to display\n- Horizontal and vertical span size\n- Widget gap for single span both horizontal and vertical sides\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the tab is focusable this will focus or unfocus content.\n\n## Responsive Guidelines\n\n- Flows the laid out in the best order and use of space it can be. It is possible to adjust columns to different size depending on how much screen and parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Home Page has all new markup and classes.\n\n**4.x to 5.x**\n\n- The HomePage component has been changed to a web component\n- Markup has changed to a custom element `<ids-home-page></ids-home-page>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- If using events, events are now plain JS events.\n- The hero example must be created manually by styling a widget\n\n## Accessibility Guidelines\n\n- The component respects element tab order which is important between the main containers\n\n## Regional Considerations\n\nThe widgets will flip to the alternate side in Right To Left mode.\n"}},{"name":"ids-hyperlink","attributes":[{"name":"color-variants","values":[]},{"name":"clickable","description":"Set the text to be clickable","values":[]},{"name":"href","description":"Set the link href","values":[]},{"name":"target","description":"Set the link target attribute","values":[]},{"name":"text-decoration","description":"Set the link text decoration styling","values":[]},{"name":"show-visited-color","description":"Show/Hide the visited color on the link","values":[]},{"name":"disabled","description":"Set the text to disabled color.","values":[]},{"name":"color","description":"\nIf set to \"unset\", color can be controlled by parent container","values":[]},{"name":"font-sizes","values":[]},{"name":"font-size","description":"Set the font size/style of the text with a class.","values":[]},{"name":"font-weight","description":"Adjust font weight; can be either \"bold\" \"lighter\" or not present\nsince font supports 300, 400, 600","values":[]},{"name":"allow-empty-href","description":"Allows underline and styling of the link when href attribute is empty","values":[]},{"name":"col-span","description":"Get col-span attribute","values":[]},{"name":"overflow","description":"Set how content overflows; can specify 'ellipsis', or undefined or 'none'","values":[]},{"name":"text-ellipsis","description":"Get text-ellipsis attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-hyperlink\n\n## Description\n\nHyperlinks open a document or navigate to a new location. See more [usage details](https://design.infor.com/components/components/hyperlink).\n\n## Features (With Code Examples)\n\nA standard hyperlink that opens a url in a new window:\n\n```html\n<ids-hyperlink href=\"http://www.example.com\" target=\"_blank\">Normal Link</ids-hyperlink>\n```\n\nA disabled hyperlink element:\n\n```html\n  <ids-hyperlink href=\"http://www.example.com\" disabled=\"true\" target=\"_blank\">Disabled Link</ids-hyperlink>\n```\n\nLinks can be styled in a ids-box, for use within widgets:\n\n```html\n<ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\" color=\"unset\">\n  <ids-box shadowed>\n    <ids-layout-flex direction=\"column\" justify-content=\"center\">\n      <ids-layout-flex-item>\n        <ids-icon icon=\"stacked\"></ids-icon>\n      </ids-layout-flex-item>\n      <ids-layout-flex-item>\n        <ids-text font-size=\"16\" font-weight=\"semi-bold\">Purchase Order Intake Workbench</ids-text>\n      </ids-layout-flex-item>\n    </ids-layout-flex>\n  </ids-box>\n</ids-hyperlink>\n```\n\nLinks can be grouped in a list, with an optional title. If used in a widget, leave the title off and use the widget title.\n\n```html\n<ids-link-list title=\"Link List\">\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\">Categories</ids-hyperlink>\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\" disabled>Organization Configuration</ids-hyperlink>\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\">Types</ids-hyperlink>\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\">Organization Configuration</ids-hyperlink>\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\">Appraisal Email Templates</ids-hyperlink>\n</ids-link-list>\n```\n\n## Settings and Attributes\n\n- `clickable` {boolean} Makes the hyperlink focusable and adds a clickable CSS class for styling interactive hyperlink text elements\n- `disabled` {boolean} Sets the link to `disabled`.\n- `href` {string} Sets the link `href` to a url or file.\n- `target` {string} Sets the links `target` attribute: '_blank' | '_self' | '_parent' | '_top' | frame name.\n- `allow-empty-href` {boolean} Allows underline and styling of the link when `href` attribute is empty. Defaults to `true`.\n- `col-span` {number} Can be used for box links to double the width.\n- `tooltip` {boolean} Can be set to true, if the hyperlink is cut off to ellipsis a tooltip will show the contents\n- `overflow` {string} If set to `ellipsis` the hyperlink overflow style will be set to overflow. Can be used with the `tooltip` option.\n\n## Themeable Parts\n\n- `link` allows you to further style the link element\n\n## States and Variations (With Code Examples)\n\n- Disabled\n- Visited\n- Hover\n- Active\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed, based on parent dimensions.\n\n## Regional Considerations\n\nLink text should be localized in the current language. Links should flip to the opposite side in right-to-left UIs. Consider that some languages, text may be a lot longer (German). And in some cases it can't be wrapped (Thai).\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Used a css class on `<a>` tags\n\n**4.x to 5.x**\n\n- The Hyperlink component has been changed to a web component\n- Markup has changed to a custom element `<ids-hyperlink></ids-hyperlink>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- If using events, events are now plain JS events.\n- The directional links have been removed/deprecated.\n"}},{"name":"ids-link-list","attributes":[],"description":{"kind":"markdown","value":"# ids-hyperlink\n\n## Description\n\nHyperlinks open a document or navigate to a new location. See more [usage details](https://design.infor.com/components/components/hyperlink).\n\n## Features (With Code Examples)\n\nA standard hyperlink that opens a url in a new window:\n\n```html\n<ids-hyperlink href=\"http://www.example.com\" target=\"_blank\">Normal Link</ids-hyperlink>\n```\n\nA disabled hyperlink element:\n\n```html\n  <ids-hyperlink href=\"http://www.example.com\" disabled=\"true\" target=\"_blank\">Disabled Link</ids-hyperlink>\n```\n\nLinks can be styled in a ids-box, for use within widgets:\n\n```html\n<ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\" color=\"unset\">\n  <ids-box shadowed>\n    <ids-layout-flex direction=\"column\" justify-content=\"center\">\n      <ids-layout-flex-item>\n        <ids-icon icon=\"stacked\"></ids-icon>\n      </ids-layout-flex-item>\n      <ids-layout-flex-item>\n        <ids-text font-size=\"16\" font-weight=\"semi-bold\">Purchase Order Intake Workbench</ids-text>\n      </ids-layout-flex-item>\n    </ids-layout-flex>\n  </ids-box>\n</ids-hyperlink>\n```\n\nLinks can be grouped in a list, with an optional title. If used in a widget, leave the title off and use the widget title.\n\n```html\n<ids-link-list title=\"Link List\">\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\">Categories</ids-hyperlink>\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\" disabled>Organization Configuration</ids-hyperlink>\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\">Types</ids-hyperlink>\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\">Organization Configuration</ids-hyperlink>\n  <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\" text-decoration=\"none\">Appraisal Email Templates</ids-hyperlink>\n</ids-link-list>\n```\n\n## Settings and Attributes\n\n- `clickable` {boolean} Makes the hyperlink focusable and adds a clickable CSS class for styling interactive hyperlink text elements\n- `disabled` {boolean} Sets the link to `disabled`.\n- `href` {string} Sets the link `href` to a url or file.\n- `target` {string} Sets the links `target` attribute: '_blank' | '_self' | '_parent' | '_top' | frame name.\n- `allow-empty-href` {boolean} Allows underline and styling of the link when `href` attribute is empty. Defaults to `true`.\n- `col-span` {number} Can be used for box links to double the width.\n- `tooltip` {boolean} Can be set to true, if the hyperlink is cut off to ellipsis a tooltip will show the contents\n- `overflow` {string} If set to `ellipsis` the hyperlink overflow style will be set to overflow. Can be used with the `tooltip` option.\n\n## Themeable Parts\n\n- `link` allows you to further style the link element\n\n## States and Variations (With Code Examples)\n\n- Disabled\n- Visited\n- Hover\n- Active\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed, based on parent dimensions.\n\n## Regional Considerations\n\nLink text should be localized in the current language. Links should flip to the opposite side in right-to-left UIs. Consider that some languages, text may be a lot longer (German). And in some cases it can't be wrapped (Thai).\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Used a css class on `<a>` tags\n\n**4.x to 5.x**\n\n- The Hyperlink component has been changed to a web component\n- Markup has changed to a custom element `<ids-hyperlink></ids-hyperlink>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- If using events, events are now plain JS events.\n- The directional links have been removed/deprecated.\n"}},{"name":"ids-icon-attributes","description":{"kind":"markdown","value":"# ids-icon\n\n## Description\n\nThe design system provides a list of standard icons which can be used in your applications. The list of icons is a result of a studying common iconography and consolidating that with standardized icons (for example, a floppy disk to represent a \"save\" function). The icons in the list should be familiar to users.\n\n## Use Cases\n\n- Icons are most effective when they improve visual interest and grab the user's attention. They help guide users while they're navigating a page.\n- Use too many icons and they'll become nothing more than decoration. Their use for navigation on a webpage can often cause dilution.\n\n## Terminology\n\n- **Icon**: An icon is a symbol. In this design case this is literal, for example  the little trashcan to indicate delete.\n- **Svg**: Stands for eXtensible Markup Language (XML)-based vector graphic format for the Web and other environments\n\n## Methods\n\n- `appendSVGDefs(SVGDefsElement | string)` Appends additional `SVGDefs` to the icon's SVG element to allow SVG customization.\n\n## Features (With Code Examples)\n\nFor a normal sized icon just specific the icon name and the web component will display the appropriate icon.\n\n```html\n<ids-icon icon=\"notes\"></ids-icon>\n```\n\nIcons come in 6 sizes depending where it is used.\n\n```html\n<ids-icon icon=\"notes\" size=\"xxl\"></ids-icon>\n<ids-icon icon=\"notes\" size=\"xl\"></ids-icon>\n<ids-icon icon=\"notes\" size=\"large\"></ids-icon>\n<ids-icon icon=\"notes\" size=\"medium\"></ids-icon>\n<!-- Used only for extreme edge cases -->\n<ids-icon icon=\"notes\" size=\"small\"></ids-icon>\n<ids-icon icon=\"notes\" size=\"xsmall\"></ids-icon>\n```\n\nIcons can also have a color that can be used for embellishment or to indicate status or bring attention to data. These should not be confused with `ids-alert` icons which are used in error messages / validation messages and for alert/errors. These should be used for softer embellishment and do not replace alert icons where these are shown in examples (i.e. validation messages). Valid values are 'error' | 'warning' | 'caution' | 'info' | 'success' | 'neutral' | 'red' | 'yellow' | 'green' | 'blue' | 'teal' | 'purple' | 'white' | 'black'\n\n```html\n<ids-icon icon=\"rocket\" status-color=\"blue\"></ids-icon>\n<ids-icon icon=\"money\" status-color=\"blue\"></ids-icon>\n<ids-icon icon=\"info\" status-color=\"blue\"></ids-icon>\n<ids-icon icon=\"success\" status-color=\"success\"></ids-icon>\n<ids-icon icon=\"error\" status-color=\"error\"></ids-icon>\n<ids-icon icon=\"alert\" status-color=\"warning\"></ids-icon>\n```\n\nIcons also have offer notification badge options in 4 possible positions\n\n```html\n<ids-icon icon=\"notes\" badge-position=\"top-left\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"top-right\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"bottom-left\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"bottom-right\"></ids-icon>\n```\n\nThese badges can also be displayed in 5 possible colors\n\n```html\n<ids-icon icon=\"notes\" badge-position=\"top-left\" badge-color=\"base\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"top-left\" badge-color=\"info\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"top-left\"></ids-icon badge-color=\"warning\">\n<ids-icon icon=\"notes\" badge-position=\"top-left\"></ids-icon badge-color=\"success\">\n<ids-icon icon=\"notes\" badge-position=\"top-left\" badge-color=\"error\"></ids-icon>\n```\n\n## Accessibility\n\nIcons follow these accessibility rules:\n\n- Icons with a `label` attribute will be announced by screen readers\n- Icons without a `label` attribute will be hidden from screen readers (aria-hidden=\"true\")\n- Icons with `no-aria-label` attribute will be hidden from screen readers even if a label is present\n\nFor meaningful icons that convey information, always provide a label:\n\n```html\n<!-- This icon will be announced to screen readers as \"Settings\" -->\n<ids-icon icon=\"settings\" label=\"Settings\"></ids-icon>\n```\n\nFor purely decorative icons that don't convey unique information, omit the label:\n\n```html\n<!-- This icon will be hidden from screen readers -->\n<ids-icon icon=\"settings\"></ids-icon>\n```\n\nTo force an icon to be hidden from screen readers even when a label is present:\n\n```html\n<!-- This icon will be hidden from screen readers despite having a label -->\n<ids-icon icon=\"settings\" label=\"Settings\" no-aria-label></ids-icon>\n```\n\n## Custom Icons\n\nAdd a custom icons by importing a custom icon file in the same format we use. The format of the json file is something like:\n\n```json\n{\n  \"my-icon1\": \"<path d=\\\"m7 16.81-1.57-1 .49-9L.83 3.37s-.51-1.51 1-1.56c1 .63 5.09 3.33 5.09 3.33l7.8-4.33 1.62 1-5.87 5.64 3.36 2.14 2.11-.9 1.31.85-.44.72-1.56 1-.39.63-.19 1.82-.45.73-1.31-.86-.07-2.36L9.45 9.1Z\\\"></path>\",\n  \"my-icon2\": \"<path d=\\\"m17.54 12.23-1.42 1H3.1l-2-2.6h16.42ZM3.32 8.85h2.74V7H3.32Zm4.78 0h2.74V7H8.1Zm8.56 1.62V5.19h-3.4v5.21\\\"></path>\"\n}\n```\n\nWe recommend you use [svgo](https://github.com/svg/svgo) to optimize your SVG before adding them to IdsIcon. In particular inline colors and transforms can causes issues rendering the icons in buttons and other places.\n\nTo import the file use the IdsIcon static api. The file only needs to be imported once because this is static then it can be used everywhere on the page or in your framework if you do it in the right place like app startup.\n\n```js\nimport customIconJSON from './custom-icon-data.json';\n\n// May need to fetch the file with ajax...\nIdsIcon.customIconData = customIconData; // JSON String\n```\n\nOne the files are imported they can be used like a normal ids-icon\n\n```html\n<ids-icon icon=\"my-icon1\" size=\"large\"></ids-icon>\n```\n\n## States and Variations\n\n- Color\n- Size\n- Alert\n- Badge-Position\n- Badge-Color\n- Status-Color\n- Height\n- Viewbox\n- Width\n\n## Keyboard Guidelines\n\nAn icon is not on its own keyboard focusable and has no keyboard interaction.\n\n## Responsive Guidelines\n\n- Flows within its parent/placement and is usually centered vertically.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Icons have all new markup and classes.\n\n**4.x to 5.x**\n\n- The Icon component has been changed to a web component\n- You no longer need the huge block of svg in the page.\n- The icon and size are set via properties/attributes\n- Markup has changed to a custom element `<ids-icon></ids-icon>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- If using events, events are now plain JS events.\n- Can now display notification badge (combines this feature)\n- Can now be used to display empty-message options\n- The logos have been removed/deprecated.\n- The pseudo elements have been removed/deprecated.\n\n**5.x to Current**\n\n- Icons now use a simpler accessibility model:\n  - Icons with a `label` attribute are announced by screen readers\n  - Icons without a `label` attribute are hidden from screen readers\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the icons tags pass contrast when combined with text.\n\n## Regional Considerations\n\nSome icons that indicate direction will be flipped when in Right-To-Left languages. This is a TODO still.\n"}},{"name":"ids-icon","attributes":[{"name":"path-data","values":[]},{"name":"on-language-change","description":"Handle Languages Changes","values":[]},{"name":"custom","values":[]},{"name":"custom-icon-data","description":"Set the static custom icon instance","values":[]},{"name":"badge-color","values":[]},{"name":"badge-position","values":[]},{"name":"fill","description":"Return the fill value","values":[]},{"name":"label","description":"Set the accessibility label for the icon","values":[]},{"name":"height","description":"Returns the height attribute","values":[]},{"name":"stroke","description":"Return the stroke value","values":[]},{"name":"viewbox","description":"Return the viewbox","values":[]},{"name":"width","description":"Return the width number","values":[]},{"name":"icon","description":"Sets the icon svg path to render","values":[]},{"name":"size","description":"Return the size. May be large, normal/medium or small","values":[]},{"name":"status-color","description":"Color that can be used for embellishment or to indicate status or bring attention","values":[]},{"name":"color","description":"Color to use for icon fill (other than other settings).","values":[]},{"name":"path-elem","values":[]},{"name":"no-aria-label","description":"Get whether ARIA label is suppressed","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-icon\n\n## Description\n\nThe design system provides a list of standard icons which can be used in your applications. The list of icons is a result of a studying common iconography and consolidating that with standardized icons (for example, a floppy disk to represent a \"save\" function). The icons in the list should be familiar to users.\n\n## Use Cases\n\n- Icons are most effective when they improve visual interest and grab the user's attention. They help guide users while they're navigating a page.\n- Use too many icons and they'll become nothing more than decoration. Their use for navigation on a webpage can often cause dilution.\n\n## Terminology\n\n- **Icon**: An icon is a symbol. In this design case this is literal, for example  the little trashcan to indicate delete.\n- **Svg**: Stands for eXtensible Markup Language (XML)-based vector graphic format for the Web and other environments\n\n## Methods\n\n- `appendSVGDefs(SVGDefsElement | string)` Appends additional `SVGDefs` to the icon's SVG element to allow SVG customization.\n\n## Features (With Code Examples)\n\nFor a normal sized icon just specific the icon name and the web component will display the appropriate icon.\n\n```html\n<ids-icon icon=\"notes\"></ids-icon>\n```\n\nIcons come in 6 sizes depending where it is used.\n\n```html\n<ids-icon icon=\"notes\" size=\"xxl\"></ids-icon>\n<ids-icon icon=\"notes\" size=\"xl\"></ids-icon>\n<ids-icon icon=\"notes\" size=\"large\"></ids-icon>\n<ids-icon icon=\"notes\" size=\"medium\"></ids-icon>\n<!-- Used only for extreme edge cases -->\n<ids-icon icon=\"notes\" size=\"small\"></ids-icon>\n<ids-icon icon=\"notes\" size=\"xsmall\"></ids-icon>\n```\n\nIcons can also have a color that can be used for embellishment or to indicate status or bring attention to data. These should not be confused with `ids-alert` icons which are used in error messages / validation messages and for alert/errors. These should be used for softer embellishment and do not replace alert icons where these are shown in examples (i.e. validation messages). Valid values are 'error' | 'warning' | 'caution' | 'info' | 'success' | 'neutral' | 'red' | 'yellow' | 'green' | 'blue' | 'teal' | 'purple' | 'white' | 'black'\n\n```html\n<ids-icon icon=\"rocket\" status-color=\"blue\"></ids-icon>\n<ids-icon icon=\"money\" status-color=\"blue\"></ids-icon>\n<ids-icon icon=\"info\" status-color=\"blue\"></ids-icon>\n<ids-icon icon=\"success\" status-color=\"success\"></ids-icon>\n<ids-icon icon=\"error\" status-color=\"error\"></ids-icon>\n<ids-icon icon=\"alert\" status-color=\"warning\"></ids-icon>\n```\n\nIcons also have offer notification badge options in 4 possible positions\n\n```html\n<ids-icon icon=\"notes\" badge-position=\"top-left\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"top-right\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"bottom-left\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"bottom-right\"></ids-icon>\n```\n\nThese badges can also be displayed in 5 possible colors\n\n```html\n<ids-icon icon=\"notes\" badge-position=\"top-left\" badge-color=\"base\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"top-left\" badge-color=\"info\"></ids-icon>\n<ids-icon icon=\"notes\" badge-position=\"top-left\"></ids-icon badge-color=\"warning\">\n<ids-icon icon=\"notes\" badge-position=\"top-left\"></ids-icon badge-color=\"success\">\n<ids-icon icon=\"notes\" badge-position=\"top-left\" badge-color=\"error\"></ids-icon>\n```\n\n## Accessibility\n\nIcons follow these accessibility rules:\n\n- Icons with a `label` attribute will be announced by screen readers\n- Icons without a `label` attribute will be hidden from screen readers (aria-hidden=\"true\")\n- Icons with `no-aria-label` attribute will be hidden from screen readers even if a label is present\n\nFor meaningful icons that convey information, always provide a label:\n\n```html\n<!-- This icon will be announced to screen readers as \"Settings\" -->\n<ids-icon icon=\"settings\" label=\"Settings\"></ids-icon>\n```\n\nFor purely decorative icons that don't convey unique information, omit the label:\n\n```html\n<!-- This icon will be hidden from screen readers -->\n<ids-icon icon=\"settings\"></ids-icon>\n```\n\nTo force an icon to be hidden from screen readers even when a label is present:\n\n```html\n<!-- This icon will be hidden from screen readers despite having a label -->\n<ids-icon icon=\"settings\" label=\"Settings\" no-aria-label></ids-icon>\n```\n\n## Custom Icons\n\nAdd a custom icons by importing a custom icon file in the same format we use. The format of the json file is something like:\n\n```json\n{\n  \"my-icon1\": \"<path d=\\\"m7 16.81-1.57-1 .49-9L.83 3.37s-.51-1.51 1-1.56c1 .63 5.09 3.33 5.09 3.33l7.8-4.33 1.62 1-5.87 5.64 3.36 2.14 2.11-.9 1.31.85-.44.72-1.56 1-.39.63-.19 1.82-.45.73-1.31-.86-.07-2.36L9.45 9.1Z\\\"></path>\",\n  \"my-icon2\": \"<path d=\\\"m17.54 12.23-1.42 1H3.1l-2-2.6h16.42ZM3.32 8.85h2.74V7H3.32Zm4.78 0h2.74V7H8.1Zm8.56 1.62V5.19h-3.4v5.21\\\"></path>\"\n}\n```\n\nWe recommend you use [svgo](https://github.com/svg/svgo) to optimize your SVG before adding them to IdsIcon. In particular inline colors and transforms can causes issues rendering the icons in buttons and other places.\n\nTo import the file use the IdsIcon static api. The file only needs to be imported once because this is static then it can be used everywhere on the page or in your framework if you do it in the right place like app startup.\n\n```js\nimport customIconJSON from './custom-icon-data.json';\n\n// May need to fetch the file with ajax...\nIdsIcon.customIconData = customIconData; // JSON String\n```\n\nOne the files are imported they can be used like a normal ids-icon\n\n```html\n<ids-icon icon=\"my-icon1\" size=\"large\"></ids-icon>\n```\n\n## States and Variations\n\n- Color\n- Size\n- Alert\n- Badge-Position\n- Badge-Color\n- Status-Color\n- Height\n- Viewbox\n- Width\n\n## Keyboard Guidelines\n\nAn icon is not on its own keyboard focusable and has no keyboard interaction.\n\n## Responsive Guidelines\n\n- Flows within its parent/placement and is usually centered vertically.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Icons have all new markup and classes.\n\n**4.x to 5.x**\n\n- The Icon component has been changed to a web component\n- You no longer need the huge block of svg in the page.\n- The icon and size are set via properties/attributes\n- Markup has changed to a custom element `<ids-icon></ids-icon>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n- If using events, events are now plain JS events.\n- Can now display notification badge (combines this feature)\n- Can now be used to display empty-message options\n- The logos have been removed/deprecated.\n- The pseudo elements have been removed/deprecated.\n\n**5.x to Current**\n\n- Icons now use a simpler accessibility model:\n  - Icons with a `label` attribute are announced by screen readers\n  - Icons without a `label` attribute are hidden from screen readers\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the icons tags pass contrast when combined with text.\n\n## Regional Considerations\n\nSome icons that indicate direction will be flipped when in Right-To-Left languages. This is a TODO still.\n"}},{"name":"ids-image","attributes":[{"name":"src","description":"Set the path to the image","values":[]},{"name":"alt","description":"Set an alternate text for the image","values":[]},{"name":"color","description":"Set the alert color","values":[]},{"name":"size","description":"Set the size for the image","values":[]},{"name":"placeholder","description":"Set whether or not to replace image with placeholder initially","values":[]},{"name":"fallback","description":"Set whether or not to replace image with placeholder if the image fails to load","values":[]},{"name":"round","description":"Set whether or not the image is round","values":[]},{"name":"user-status","description":"Set user status and render html element","values":[]},{"name":"initials","description":"Set initials and render html element","values":[]}],"description":{"kind":"markdown","value":"# ids-image\n\n## Description\n\nThe `ids-image` component is a web component wrapper around a standard `<img>` tag to handle image sizes, placeholders, thumbnails with statuses and user initials\n\n## Use Cases\n- Display an images with different sizes\n- Display placeholder either from fallback or initially\n- Display a thumbnail image with different statuses\n- Display initials for the user\n\n## Settings (Attributes)\n- `src` `{string}` - Specifies the path to the image\n- `alt` `{string}` - Specifies an alternate text for an image\n- `size` `{auto|full|sm|md|lg}` - Specifies the size of the image, if no size is specified or size is not one of `auto|sm|md|lg` it defaults to `auto`\n  - `sm` - 60x60px\n  - `md` - 154x120px\n  - `lg` - 300x350px\n  - `full` - 100% width of the container and auto height\n- `fallback` `{true|false}` - Whether or not to replace image with placeholder if the image fails to load\n- `placeholder` `{true|false}` - Whether or not to use placeholder, if set, `src` and `alt` attributes will be ignored, image will not load and placeholder will be used initially\n- `round` `{true|false}` - Whether or not to make the image round with 50x50x size\n- `user-status` `{available|away|busy|do-not-disturb|unknown}` - Specifies whether or not to show status icon at the bottom right corner of the image and what type of icon\n- `initials` `{string}` - Initials for the user, crops to two letters and uppercase automatically\n\n## Features (With Code Examples)\n\nBasic image behaves similarly to `<img>` tag in browser. Size is `auto` as default. Will show broken image if image fails to load\n\n```html\n<ids-image src=\"image.jpg\" alt=\"image auto\"></ids-image>\n```\n\nBasic image with fallback and size, broken image will be replaced with placeholder if image fails to load\n\n```html\n<ids-image src=\"image.jpg\" alt=\"image md\" size=\"md\" fallback=\"true\"></ids-image>\n```\n\nPlaceholder initially with size md, src and alt attributes are ignored\n\n```html\n<ids-image placeholder=\"true\" size=\"md\"></ids-image>\n```\n\nRound image\n\n```html\n<ids-image src=\"image.jpg\" alt=\"image round\" round=\"true\"></ids-image>\n```\n\nWith status\n\n```html\n<ids-image src=\"image.jpg\" alt=\"image round\" round=\"true\" user-status=\"available\"></ids-image>\n```\n\nInitials\n\n```html\n<ids-image round=\"true\" initials=\"mn\"></ids-image>\n```\n\nThe component can be controlled dynamically\n\n```js\nconst image = document.querySelector('ids-image');\n\n// Changing src and alt\nimage.src = 'another-image.jpg';\nimage.alt = 'changed alt';\n\n// Using fallback in case the image with new src fails to load\nimage.fallback = true;\nimage.src = 'might-not-exist.jpg';\n\n// Make it round\nimage.round = true;\n\n// Add status icon\nimage.userStatus = 'available';\n\n// Change to placeholder\nimage.src = null;\n\n// Remove status icon\nimage.userStatus = null;\n\n// Show initials\nimage.initials = 'mn';\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Block grid / Image List partially replaces the carousel in 3.x\n\n**4.x to 5.x**\n\n- Swipe Container replaces the carousel in 3.x\n- Image List - can be done if needed with a toolbar and block grid\n- The Image css for sizes/placeholder and alerts/initials has been changed to a web component with settings\n- Markup has changed to a custom element `<ids-image></ids-image>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-autocomplete","attributes":[{"name":"datasource","description":"Gets the internal IdsDataSource object","values":[]},{"name":"autocomplete","description":"Get the autocomplete attribute","values":[]},{"name":"data","description":"Get the data of the autocomplete","values":[]},{"name":"info-field","description":"Get infoField","values":[]},{"name":"search-field","description":"Get searchField","values":[]},{"name":"value-field","description":"Dataset field to use as value in selected event","values":[]},{"name":"popup","description":"Get the internal ids-popup element","values":[]},{"name":"list-box","description":"Get the internal ids-list-box element","values":[]},{"name":"options","description":"Get all internal ids-list-box-option elements","values":[]},{"name":"is-selected","description":"Get the selected ids-list-box-option element","values":[]}],"description":{"kind":"markdown","value":"# ids-input\n\n## Description\n\nThe IDS Input component is a simple wrapper around a standard HTMLInputElement that is styled with Infor branding, and contains some additional API that makes it easy to set input, label, and functionality.\n\n## Use Cases\n\n- Create standalone inputs\n- Create inputs, each with different styling to provide context for actions that are disabled, readonly, and various sizes, types.\n\n## Terminology\n\n- Input: A standard basic input element. It can set to various types, size, and functionality. IDS Input will add `aria-required` for required elements.\n- Label: HTMLLabelElement to keep matching with HTMLInputElement. Make sure the input label has a meaningful relative to input. IDS Input will add pseudo UI `*` for required elements.\n\n## Features (With Code Samples)\n\nA standard Text Input is a basic input element:\n\n```html\n<ids-input label=\"First Name\"></ids-input>\n```\n\nSet the types, available types are `'text'|'password'|'email'|'color'` and default type is `type=\"text\"`.\n\n```html\n<ids-input type=\"password\" label=\"Xtra Small\"></ids-input>\n```\n\nSet the sizes, available sizes are `'xs'|'sm'|'mm'|'md'|'lg'|'full'` and default type is `size=\"md\"`.\n\n```html\n<ids-input size=\"xs\" label=\"Xtra Small\"></ids-input>\n```\n\nAdd an Disabled Text Input this way:\n\n```html\n<ids-input label=\"Disabled\" disabled=\"true\"></ids-input>\n```\n\nAdd an Readonly Text Input this way:\n\n```html\n<ids-input label=\"Readonly\" readonly=\"true\"></ids-input>\n```\n\nSet the Dirty Tracking to Text Input this way. You can also call `resetDirtyTracker()` to reset the dirty tracking icon:\n\n```html\n<ids-input label=\"Dirty Tracking\" dirty-tracker=\"true\"></ids-input>\n```\n\nTo set the visible validation `required` indicator you can use the required attribute:\n\n```html\n<ids-input label=\"Last Name\" required></ids-input>\n```\n\nSet validation to `required` and the indicator you can use:\n\n```html\n<ids-input label=\"Last Name\" validate=\"required\"></ids-input>\n```\n\nSet the input to clearable and add a clear button:\n\n```html\n<ids-input label=\"Clearable\" clearable=\"true\"></ids-input>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-input>\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-input>\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap-no-stretch\"></ids-input>\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis-no-stretch\"></ids-input>\n```\n\nSet the `autoselect` to so that inputs get selected on focus using the `autoselect` attribute. For notes on this behavior see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n\n```html\n<ids-input label=\"Autoselect\" value=\"Text select on focus\" autoselect=\"true\"></ids-input>\n```\n\nSet the `text-align` to align text:\n\n```html\n<ids-input label=\"Default align (left)\" value=\"Default align\"></ids-input>\n<ids-input label=\"Left align\" value=\"Left align\" text-align=\"start\"></ids-input>\n<ids-input label=\"Center align\" value=\"Center align\" text-align=\"center\"></ids-input>\n<ids-input label=\"Right align\" value=\"Right align\" text-align=\"end\"></ids-input>\n```\n\nSet the caps lock alert indicator:\n\n```html\n<ids-input label=\"password\" caps-lock=\"true\" type=\"password\"></ids-input>\n```\n\nSet up for displaying the show/hide password button:\n\n```html\n<ids-input label=\"password\" revealable-password=\"true\" password-visible=\"false\" type=\"password\"></ids-input>\n```\n\nUse `reveal-on-edit` to show the reveal button only when the user edits the field. The button appears on input and hides on blur:\n\n```html\n<ids-input label=\"password\" reveal-on-edit revealable-password=\"true\" type=\"password\"></ids-input>\n```\n\nUse `margin-block-end` to apply standardized bottom spacing to an input using IDS spacing tokens. Accepted values map directly to the IDS spacing scale:\n\n```html\n<ids-input label=\"First Name\" margin-block-end=\"sm\"></ids-input>\n<ids-input label=\"Last Name\" margin-block-end=\"sm\"></ids-input>\n<ids-input label=\"Email\" margin-block-end=\"lg\"></ids-input>\n```\n\nAvailable token values: `none`, `4xs`, `3xs`, `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl`.\n\nThe setting is suppressed when `no-margins` is also present, so existing no-margins layouts are not affected:\n\n```html\n<ids-input label=\"Compact field\" margin-block-end=\"lg\" no-margins></ids-input>\n```\n\nSet up for autocomplete input. Not to disable browser autocomplete you can set `autocomplete=\"off\"` on the input.\n\n```html\n  <ids-input\n    id=\"input-autocomplete\"\n    placeholder=\"This input's label is visible\"\n    size=\"md\"\n    label=\"Autocomplete Input\"\n    autocomplete\n    search-field=\"label\"\n  >\n  </ids-input>\n```\n\n```js\nimport statesJSON from '../../../assets/data/states.json';\n\nconst input: any = document.querySelector('#input-autocomplete');\nconst url: any = statesJSON;\n\nconst setData = async () => {\n  const res = await fetch(url);\n  const data = await res.json();\n  input.data = data;\n};\n\nawait setData();\n```\n\n## Settings (Attributes)\n\n- `autocomplete` {boolean} can be set to `true` to enable autocomplete functionality.\n- `browserAutocomplete` Adds the autocomplete attribute to the input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `bgTransparent` {boolean} set the transparent background to readonly input.\n- `formName` {string} set the `name` for forms submission\n- `clearable` {boolean} set (x) button to clear text on click/key to input. See [Ids Clearable Mixin](../../mixins/ids-clearable-mixin/README.md) for more information.\n- `clearableForced` {boolean} set (x) button to clear text on click/key to input, forced to be on readonly.\n- `colorVariant` {string} set the current color variant.\n- `compact` {boolean} sets the component to be compact mode.\n- `caps-lock` {boolean} sets whether the   indicator appears when caps lock is on.\n- `data` when autocomplete is enabled an instance of [IdsDatasource](../../core/README.md)]\n- `dirty-tracker` {boolean} set dirty tracker to input. See [Ids Dirty Tracker Mixin](../../mixins/ids-dirty-tracker-mixin/README.md) for more information.\n- `disabled` {boolean} set disabled state. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `disable-tooltip` {boolean} sets whether to show tooltips when hovering input field.\n- `fieldHeight` {string} defines the height of the input field. See [Ids Field Height Mixin](../../mixins/ids-field-height-mixin/README.md) for more information.\n- `label` {string} set the label text.\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](../../mixins/ids-label-state-mixin/README.md) for more information.\n- `mask` {array|function} defines how to mask the input.  See [Ids Mask Mixin](../ids-mask/README.md) for more information.\n- `marginBlockEnd` {string} applies bottom spacing to the input using an IDS spacing token. Accepted values: `none`, `4xs`, `3xs`, `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl`. Has no effect when `no-margins` is also set.\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `password-visible` {boolean} sets whether the password is currently visible. Must be paired with `revealable-password` and `type=\"password\"`.\n- `placeholder` {string} set the placeholder text to input.\n- `size` {string} set the input size, it will set `md` as defaults.\n- `search-field` when autocomplete is enabled can be set to a string of the field to be searched in the dataset.\n- `value-field` when autocomplete is enabled can be set to a string of the field to be returned as value in selected event details\n- `revealable-password` {boolean} sets whether the show/hide button is available for password fields. Must be paired with `type=\"password\"`.\n- `reveal-on-edit` {boolean} when set, the reveal button only appears when the user edits the field and hides on blur. Must be used with `revealable-password`.\n- `readonly` {boolean} sets the input's readonly state. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `text-align` {string} sets the text alignment (default is `left`).\n- `type` {string} set the input type, (default is `text`)\n- `tooltip` {string} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the `overflow=\"ellipsis\"` and `tooltip=\"true\"`. You can also set `tooltip=\"false\"` to disable tooltip.\n- `required` {string} sets visible required indicator no matter what the validate is set to\n- `format` {string} if the validation rules include date/time, use the setting to set custom date/time format\n- `validationEvents` {string} set the events that fire for validation, use `space` to add multiple validation rules. We use `blur` as default. For example if you wanted to validate on keypress you could use `validation-events=\"keydown blur change\"`. Use any JS event here.\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `value` {string} sets the input value.\n- `maxlength` {number}  sets the input's `maxlength` property to the max characters you can type\n- `uppercase` {boolean} sets the input editor's to all uppercase\n- `lowercase` {boolean} sets the input editor's to all lowercase\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-break` {string} Controls how the label and input behave when space is constrained. Only applies to side labels (`label-position=\"inline-start\"` or `label-position=\"inline-end\"`). Options are:\n  - `shrink-value` (default): Label stays on the same line; the value area shrinks when space is constrained\n  - `break`: The value area moves below the label (for inline-start) or above the label (for inline-end) when space is constrained\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `label-alignment` {string} Controls the horizontal text alignment of the label when using inline positioning. Only applies to side labels (`label-position=\"inline-start\"` or `label-position=\"inline-end\"`). Options are:\n  - `start` (default): Aligns the label text to the start of the label area\n  - `end`: Aligns the label text to the end of the label area (right-aligns in LTR, left-aligns in RTL)\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `hidden` {boolean} Hides the input element from display\n\n## Keyboard Guidelines\n\nThe IDS Input doesn't contain any interactions beyond a standard HTMLInputElement:\n\n- <kbd>Tab</kbd> and <kbd>Shift Tab</kbd> moves focus into the edit field to/from the next focusable item in the tab order.\n\n## Responsive Guidelines\n\n- Default size is 300px wide but there are a number of widths.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Block grid / Image List partially replaces the carousel in 3.x\n\n**4.x to 5.x**\n\n- The Input component has been changed to a web component and renamed to ids-input.\n- Markup has changed to a custom element `<ids-input></ids-input>` (see examples above)\n- Actions next to the input is deprecated, if needed you can code it with a button, popupmenu and input\n- If using events, events are now plain JS events (custom events)\n- Can now be imported as a single JS file and used with encapsulated styles\n- Can now be use variation of sizes (width/height)\n- If using a clearable X on the input the x is now tabbable by default for accessibility\n\nMarkup comparison:\n\n```html\n<!-- 4.x input example -->\n<div class=\"field\">\n  <label class=\"required\" for=\"last-name\">Last Name</label>\n  <input type=\"text\" id=\"last-name\" aria-required=\"true\" name=\"last-name\" data-validate=\"required\"/>\n</div>\n\n<!-- this is the same input using the WebComponent -->\n<ids-input label=\"Last Name\" id=\"last-name\" name=\"last-name\" validate=\"required\"></ids-input>\n```\n\n## Accessibility Guidelines\n\nThere should be a label on all inputs to give an indication what the field is containing.\n"}},{"name":"ids-input-attributes","description":{"kind":"markdown","value":"# ids-input\n\n## Description\n\nThe IDS Input component is a simple wrapper around a standard HTMLInputElement that is styled with Infor branding, and contains some additional API that makes it easy to set input, label, and functionality.\n\n## Use Cases\n\n- Create standalone inputs\n- Create inputs, each with different styling to provide context for actions that are disabled, readonly, and various sizes, types.\n\n## Terminology\n\n- Input: A standard basic input element. It can set to various types, size, and functionality. IDS Input will add `aria-required` for required elements.\n- Label: HTMLLabelElement to keep matching with HTMLInputElement. Make sure the input label has a meaningful relative to input. IDS Input will add pseudo UI `*` for required elements.\n\n## Features (With Code Samples)\n\nA standard Text Input is a basic input element:\n\n```html\n<ids-input label=\"First Name\"></ids-input>\n```\n\nSet the types, available types are `'text'|'password'|'email'|'color'` and default type is `type=\"text\"`.\n\n```html\n<ids-input type=\"password\" label=\"Xtra Small\"></ids-input>\n```\n\nSet the sizes, available sizes are `'xs'|'sm'|'mm'|'md'|'lg'|'full'` and default type is `size=\"md\"`.\n\n```html\n<ids-input size=\"xs\" label=\"Xtra Small\"></ids-input>\n```\n\nAdd an Disabled Text Input this way:\n\n```html\n<ids-input label=\"Disabled\" disabled=\"true\"></ids-input>\n```\n\nAdd an Readonly Text Input this way:\n\n```html\n<ids-input label=\"Readonly\" readonly=\"true\"></ids-input>\n```\n\nSet the Dirty Tracking to Text Input this way. You can also call `resetDirtyTracker()` to reset the dirty tracking icon:\n\n```html\n<ids-input label=\"Dirty Tracking\" dirty-tracker=\"true\"></ids-input>\n```\n\nTo set the visible validation `required` indicator you can use the required attribute:\n\n```html\n<ids-input label=\"Last Name\" required></ids-input>\n```\n\nSet validation to `required` and the indicator you can use:\n\n```html\n<ids-input label=\"Last Name\" validate=\"required\"></ids-input>\n```\n\nSet the input to clearable and add a clear button:\n\n```html\n<ids-input label=\"Clearable\" clearable=\"true\"></ids-input>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-input>\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-input>\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap-no-stretch\"></ids-input>\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis-no-stretch\"></ids-input>\n```\n\nSet the `autoselect` to so that inputs get selected on focus using the `autoselect` attribute. For notes on this behavior see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n\n```html\n<ids-input label=\"Autoselect\" value=\"Text select on focus\" autoselect=\"true\"></ids-input>\n```\n\nSet the `text-align` to align text:\n\n```html\n<ids-input label=\"Default align (left)\" value=\"Default align\"></ids-input>\n<ids-input label=\"Left align\" value=\"Left align\" text-align=\"start\"></ids-input>\n<ids-input label=\"Center align\" value=\"Center align\" text-align=\"center\"></ids-input>\n<ids-input label=\"Right align\" value=\"Right align\" text-align=\"end\"></ids-input>\n```\n\nSet the caps lock alert indicator:\n\n```html\n<ids-input label=\"password\" caps-lock=\"true\" type=\"password\"></ids-input>\n```\n\nSet up for displaying the show/hide password button:\n\n```html\n<ids-input label=\"password\" revealable-password=\"true\" password-visible=\"false\" type=\"password\"></ids-input>\n```\n\nUse `reveal-on-edit` to show the reveal button only when the user edits the field. The button appears on input and hides on blur:\n\n```html\n<ids-input label=\"password\" reveal-on-edit revealable-password=\"true\" type=\"password\"></ids-input>\n```\n\nUse `margin-block-end` to apply standardized bottom spacing to an input using IDS spacing tokens. Accepted values map directly to the IDS spacing scale:\n\n```html\n<ids-input label=\"First Name\" margin-block-end=\"sm\"></ids-input>\n<ids-input label=\"Last Name\" margin-block-end=\"sm\"></ids-input>\n<ids-input label=\"Email\" margin-block-end=\"lg\"></ids-input>\n```\n\nAvailable token values: `none`, `4xs`, `3xs`, `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl`.\n\nThe setting is suppressed when `no-margins` is also present, so existing no-margins layouts are not affected:\n\n```html\n<ids-input label=\"Compact field\" margin-block-end=\"lg\" no-margins></ids-input>\n```\n\nSet up for autocomplete input. Not to disable browser autocomplete you can set `autocomplete=\"off\"` on the input.\n\n```html\n  <ids-input\n    id=\"input-autocomplete\"\n    placeholder=\"This input's label is visible\"\n    size=\"md\"\n    label=\"Autocomplete Input\"\n    autocomplete\n    search-field=\"label\"\n  >\n  </ids-input>\n```\n\n```js\nimport statesJSON from '../../../assets/data/states.json';\n\nconst input: any = document.querySelector('#input-autocomplete');\nconst url: any = statesJSON;\n\nconst setData = async () => {\n  const res = await fetch(url);\n  const data = await res.json();\n  input.data = data;\n};\n\nawait setData();\n```\n\n## Settings (Attributes)\n\n- `autocomplete` {boolean} can be set to `true` to enable autocomplete functionality.\n- `browserAutocomplete` Adds the autocomplete attribute to the input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `bgTransparent` {boolean} set the transparent background to readonly input.\n- `formName` {string} set the `name` for forms submission\n- `clearable` {boolean} set (x) button to clear text on click/key to input. See [Ids Clearable Mixin](../../mixins/ids-clearable-mixin/README.md) for more information.\n- `clearableForced` {boolean} set (x) button to clear text on click/key to input, forced to be on readonly.\n- `colorVariant` {string} set the current color variant.\n- `compact` {boolean} sets the component to be compact mode.\n- `caps-lock` {boolean} sets whether the   indicator appears when caps lock is on.\n- `data` when autocomplete is enabled an instance of [IdsDatasource](../../core/README.md)]\n- `dirty-tracker` {boolean} set dirty tracker to input. See [Ids Dirty Tracker Mixin](../../mixins/ids-dirty-tracker-mixin/README.md) for more information.\n- `disabled` {boolean} set disabled state. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `disable-tooltip` {boolean} sets whether to show tooltips when hovering input field.\n- `fieldHeight` {string} defines the height of the input field. See [Ids Field Height Mixin](../../mixins/ids-field-height-mixin/README.md) for more information.\n- `label` {string} set the label text.\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](../../mixins/ids-label-state-mixin/README.md) for more information.\n- `mask` {array|function} defines how to mask the input.  See [Ids Mask Mixin](../ids-mask/README.md) for more information.\n- `marginBlockEnd` {string} applies bottom spacing to the input using an IDS spacing token. Accepted values: `none`, `4xs`, `3xs`, `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl`. Has no effect when `no-margins` is also set.\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `password-visible` {boolean} sets whether the password is currently visible. Must be paired with `revealable-password` and `type=\"password\"`.\n- `placeholder` {string} set the placeholder text to input.\n- `size` {string} set the input size, it will set `md` as defaults.\n- `search-field` when autocomplete is enabled can be set to a string of the field to be searched in the dataset.\n- `value-field` when autocomplete is enabled can be set to a string of the field to be returned as value in selected event details\n- `revealable-password` {boolean} sets whether the show/hide button is available for password fields. Must be paired with `type=\"password\"`.\n- `reveal-on-edit` {boolean} when set, the reveal button only appears when the user edits the field and hides on blur. Must be used with `revealable-password`.\n- `readonly` {boolean} sets the input's readonly state. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `text-align` {string} sets the text alignment (default is `left`).\n- `type` {string} set the input type, (default is `text`)\n- `tooltip` {string} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the `overflow=\"ellipsis\"` and `tooltip=\"true\"`. You can also set `tooltip=\"false\"` to disable tooltip.\n- `required` {string} sets visible required indicator no matter what the validate is set to\n- `format` {string} if the validation rules include date/time, use the setting to set custom date/time format\n- `validationEvents` {string} set the events that fire for validation, use `space` to add multiple validation rules. We use `blur` as default. For example if you wanted to validate on keypress you could use `validation-events=\"keydown blur change\"`. Use any JS event here.\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `value` {string} sets the input value.\n- `maxlength` {number}  sets the input's `maxlength` property to the max characters you can type\n- `uppercase` {boolean} sets the input editor's to all uppercase\n- `lowercase` {boolean} sets the input editor's to all lowercase\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-break` {string} Controls how the label and input behave when space is constrained. Only applies to side labels (`label-position=\"inline-start\"` or `label-position=\"inline-end\"`). Options are:\n  - `shrink-value` (default): Label stays on the same line; the value area shrinks when space is constrained\n  - `break`: The value area moves below the label (for inline-start) or above the label (for inline-end) when space is constrained\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `label-alignment` {string} Controls the horizontal text alignment of the label when using inline positioning. Only applies to side labels (`label-position=\"inline-start\"` or `label-position=\"inline-end\"`). Options are:\n  - `start` (default): Aligns the label text to the start of the label area\n  - `end`: Aligns the label text to the end of the label area (right-aligns in LTR, left-aligns in RTL)\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `hidden` {boolean} Hides the input element from display\n\n## Keyboard Guidelines\n\nThe IDS Input doesn't contain any interactions beyond a standard HTMLInputElement:\n\n- <kbd>Tab</kbd> and <kbd>Shift Tab</kbd> moves focus into the edit field to/from the next focusable item in the tab order.\n\n## Responsive Guidelines\n\n- Default size is 300px wide but there are a number of widths.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Block grid / Image List partially replaces the carousel in 3.x\n\n**4.x to 5.x**\n\n- The Input component has been changed to a web component and renamed to ids-input.\n- Markup has changed to a custom element `<ids-input></ids-input>` (see examples above)\n- Actions next to the input is deprecated, if needed you can code it with a button, popupmenu and input\n- If using events, events are now plain JS events (custom events)\n- Can now be imported as a single JS file and used with encapsulated styles\n- Can now be use variation of sizes (width/height)\n- If using a clearable X on the input the x is now tabbable by default for accessibility\n\nMarkup comparison:\n\n```html\n<!-- 4.x input example -->\n<div class=\"field\">\n  <label class=\"required\" for=\"last-name\">Last Name</label>\n  <input type=\"text\" id=\"last-name\" aria-required=\"true\" name=\"last-name\" data-validate=\"required\"/>\n</div>\n\n<!-- this is the same input using the WebComponent -->\n<ids-input label=\"Last Name\" id=\"last-name\" name=\"last-name\" validate=\"required\"></ids-input>\n```\n\n## Accessibility Guidelines\n\nThere should be a label on all inputs to give an indication what the field is containing.\n"}},{"name":"ids-input","attributes":[{"name":"triggered-by-change","values":[]},{"name":"is-form-component","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"is-password-visible","description":"Check if this is a password field and the password should be shown as plain text","values":[]},{"name":"collapsible","description":"Get the collapsible state","values":[]},{"name":"input","description":"Get the inner input element","values":[]},{"name":"form-input","description":"Get the inner input element (for form input mixin)","values":[]},{"name":"caps-lock-icon","description":"Get the caps lock indicator icon","values":[]},{"name":"field-container","description":"Get the field container element","values":[]},{"name":"label-text-el","description":"Get the inner ids-text element which contains the label text","values":[]},{"name":"label-el","description":"Get the inner label element","values":[]},{"name":"reveal-on-edit","description":"Sets whether reveal on edit is enabled (shows button only when editing)","values":[]},{"name":"revealable-password","description":"sets whether password reveal functionality is available","values":[]},{"name":"caps-lock","description":"sets whether capslock indicatoris enabled or disabled","values":[]},{"name":"password-visible","description":"sets whether the password is currently visible","values":[]},{"name":"id","description":"Get the id","values":[]},{"name":"square","description":"Get whether the input has square corners","values":[]},{"name":"disable-tooltip","description":"Get whether tooltip is disabled","values":[]},{"name":"#native-event-handler","values":[]},{"name":"#input-event-handler","values":[]},{"name":"active","description":"Get the active state","values":[]},{"name":"bg-transparent","description":"Get the background transparent state","values":[]},{"name":"browser-autocomplete","description":"Get the browser autocomplete setting","values":[]},{"name":"text-ellipsis","description":"Get the text ellipsis state","values":[]},{"name":"disabled","description":"Get the disabled state","values":[]},{"name":"#label-el","description":"internal reference to a label element a user provides","values":[]},{"name":"placeholder","description":"Get the placeholder text","values":[]},{"name":"readonly","description":"Get the readonly state","values":[]},{"name":"readonly-background","description":"Get whether readonly background is enabled","values":[]},{"name":"label-wrap","description":"Get the label wrap setting","values":[]},{"name":"size","description":"Get the size","values":[]},{"name":"text-align","description":"Get the text alignment","values":[]},{"name":"type","description":"Get the input type","values":[]},{"name":"value","description":"Get the input value","values":[]},{"name":"cursor","description":"Get the cursor style","values":[]},{"name":"maxlength","description":"Get the max length","values":[]},{"name":"uppercase","description":"Get the uppercase state","values":[]},{"name":"lowercase","description":"Get the lowercase state","values":[]},{"name":"margin-block-end","description":"Gets the margin-block-end token key","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"padding","description":"Get the inner padding","values":[]},{"name":"format","description":"Get the format attribute","values":[]},{"name":"overflow","description":"Get how content overflows","values":[]}],"description":{"kind":"markdown","value":"# ids-input\n\n## Description\n\nThe IDS Input component is a simple wrapper around a standard HTMLInputElement that is styled with Infor branding, and contains some additional API that makes it easy to set input, label, and functionality.\n\n## Use Cases\n\n- Create standalone inputs\n- Create inputs, each with different styling to provide context for actions that are disabled, readonly, and various sizes, types.\n\n## Terminology\n\n- Input: A standard basic input element. It can set to various types, size, and functionality. IDS Input will add `aria-required` for required elements.\n- Label: HTMLLabelElement to keep matching with HTMLInputElement. Make sure the input label has a meaningful relative to input. IDS Input will add pseudo UI `*` for required elements.\n\n## Features (With Code Samples)\n\nA standard Text Input is a basic input element:\n\n```html\n<ids-input label=\"First Name\"></ids-input>\n```\n\nSet the types, available types are `'text'|'password'|'email'|'color'` and default type is `type=\"text\"`.\n\n```html\n<ids-input type=\"password\" label=\"Xtra Small\"></ids-input>\n```\n\nSet the sizes, available sizes are `'xs'|'sm'|'mm'|'md'|'lg'|'full'` and default type is `size=\"md\"`.\n\n```html\n<ids-input size=\"xs\" label=\"Xtra Small\"></ids-input>\n```\n\nAdd an Disabled Text Input this way:\n\n```html\n<ids-input label=\"Disabled\" disabled=\"true\"></ids-input>\n```\n\nAdd an Readonly Text Input this way:\n\n```html\n<ids-input label=\"Readonly\" readonly=\"true\"></ids-input>\n```\n\nSet the Dirty Tracking to Text Input this way. You can also call `resetDirtyTracker()` to reset the dirty tracking icon:\n\n```html\n<ids-input label=\"Dirty Tracking\" dirty-tracker=\"true\"></ids-input>\n```\n\nTo set the visible validation `required` indicator you can use the required attribute:\n\n```html\n<ids-input label=\"Last Name\" required></ids-input>\n```\n\nSet validation to `required` and the indicator you can use:\n\n```html\n<ids-input label=\"Last Name\" validate=\"required\"></ids-input>\n```\n\nSet the input to clearable and add a clear button:\n\n```html\n<ids-input label=\"Clearable\" clearable=\"true\"></ids-input>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-input>\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-input>\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap-no-stretch\"></ids-input>\n<ids-input label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis-no-stretch\"></ids-input>\n```\n\nSet the `autoselect` to so that inputs get selected on focus using the `autoselect` attribute. For notes on this behavior see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n\n```html\n<ids-input label=\"Autoselect\" value=\"Text select on focus\" autoselect=\"true\"></ids-input>\n```\n\nSet the `text-align` to align text:\n\n```html\n<ids-input label=\"Default align (left)\" value=\"Default align\"></ids-input>\n<ids-input label=\"Left align\" value=\"Left align\" text-align=\"start\"></ids-input>\n<ids-input label=\"Center align\" value=\"Center align\" text-align=\"center\"></ids-input>\n<ids-input label=\"Right align\" value=\"Right align\" text-align=\"end\"></ids-input>\n```\n\nSet the caps lock alert indicator:\n\n```html\n<ids-input label=\"password\" caps-lock=\"true\" type=\"password\"></ids-input>\n```\n\nSet up for displaying the show/hide password button:\n\n```html\n<ids-input label=\"password\" revealable-password=\"true\" password-visible=\"false\" type=\"password\"></ids-input>\n```\n\nUse `reveal-on-edit` to show the reveal button only when the user edits the field. The button appears on input and hides on blur:\n\n```html\n<ids-input label=\"password\" reveal-on-edit revealable-password=\"true\" type=\"password\"></ids-input>\n```\n\nUse `margin-block-end` to apply standardized bottom spacing to an input using IDS spacing tokens. Accepted values map directly to the IDS spacing scale:\n\n```html\n<ids-input label=\"First Name\" margin-block-end=\"sm\"></ids-input>\n<ids-input label=\"Last Name\" margin-block-end=\"sm\"></ids-input>\n<ids-input label=\"Email\" margin-block-end=\"lg\"></ids-input>\n```\n\nAvailable token values: `none`, `4xs`, `3xs`, `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl`.\n\nThe setting is suppressed when `no-margins` is also present, so existing no-margins layouts are not affected:\n\n```html\n<ids-input label=\"Compact field\" margin-block-end=\"lg\" no-margins></ids-input>\n```\n\nSet up for autocomplete input. Not to disable browser autocomplete you can set `autocomplete=\"off\"` on the input.\n\n```html\n  <ids-input\n    id=\"input-autocomplete\"\n    placeholder=\"This input's label is visible\"\n    size=\"md\"\n    label=\"Autocomplete Input\"\n    autocomplete\n    search-field=\"label\"\n  >\n  </ids-input>\n```\n\n```js\nimport statesJSON from '../../../assets/data/states.json';\n\nconst input: any = document.querySelector('#input-autocomplete');\nconst url: any = statesJSON;\n\nconst setData = async () => {\n  const res = await fetch(url);\n  const data = await res.json();\n  input.data = data;\n};\n\nawait setData();\n```\n\n## Settings (Attributes)\n\n- `autocomplete` {boolean} can be set to `true` to enable autocomplete functionality.\n- `browserAutocomplete` Adds the autocomplete attribute to the input element allowing for browser autocomplete. This can be `on`, `off` (default), or `name`, `email`, `street-address`, `postal-code`, `search`, `tel`, `url`, `username`, `off` ect. This not to be confused with the `autocomplete` setting which will enable additional autocomplete component functionality (see autocomplete examples).\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `bgTransparent` {boolean} set the transparent background to readonly input.\n- `formName` {string} set the `name` for forms submission\n- `clearable` {boolean} set (x) button to clear text on click/key to input. See [Ids Clearable Mixin](../../mixins/ids-clearable-mixin/README.md) for more information.\n- `clearableForced` {boolean} set (x) button to clear text on click/key to input, forced to be on readonly.\n- `colorVariant` {string} set the current color variant.\n- `compact` {boolean} sets the component to be compact mode.\n- `caps-lock` {boolean} sets whether the   indicator appears when caps lock is on.\n- `data` when autocomplete is enabled an instance of [IdsDatasource](../../core/README.md)]\n- `dirty-tracker` {boolean} set dirty tracker to input. See [Ids Dirty Tracker Mixin](../../mixins/ids-dirty-tracker-mixin/README.md) for more information.\n- `disabled` {boolean} set disabled state. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `disable-tooltip` {boolean} sets whether to show tooltips when hovering input field.\n- `fieldHeight` {string} defines the height of the input field. See [Ids Field Height Mixin](../../mixins/ids-field-height-mixin/README.md) for more information.\n- `label` {string} set the label text.\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](../../mixins/ids-label-state-mixin/README.md) for more information.\n- `mask` {array|function} defines how to mask the input.  See [Ids Mask Mixin](../ids-mask/README.md) for more information.\n- `marginBlockEnd` {string} applies bottom spacing to the input using an IDS spacing token. Accepted values: `none`, `4xs`, `3xs`, `2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`, `3xl`, `4xl`. Has no effect when `no-margins` is also set.\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `password-visible` {boolean} sets whether the password is currently visible. Must be paired with `revealable-password` and `type=\"password\"`.\n- `placeholder` {string} set the placeholder text to input.\n- `size` {string} set the input size, it will set `md` as defaults.\n- `search-field` when autocomplete is enabled can be set to a string of the field to be searched in the dataset.\n- `value-field` when autocomplete is enabled can be set to a string of the field to be returned as value in selected event details\n- `revealable-password` {boolean} sets whether the show/hide button is available for password fields. Must be paired with `type=\"password\"`.\n- `reveal-on-edit` {boolean} when set, the reveal button only appears when the user edits the field and hides on blur. Must be used with `revealable-password`.\n- `readonly` {boolean} sets the input's readonly state. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `text-align` {string} sets the text alignment (default is `left`).\n- `type` {string} set the input type, (default is `text`)\n- `tooltip` {string} Sets a tooltip on the input field. If you want to show the tooltip when the text is overflowed, set the `overflow=\"ellipsis\"` and `tooltip=\"true\"`. You can also set `tooltip=\"false\"` to disable tooltip.\n- `required` {string} sets visible required indicator no matter what the validate is set to\n- `format` {string} if the validation rules include date/time, use the setting to set custom date/time format\n- `validationEvents` {string} set the events that fire for validation, use `space` to add multiple validation rules. We use `blur` as default. For example if you wanted to validate on keypress you could use `validation-events=\"keydown blur change\"`. Use any JS event here.\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `value` {string} sets the input value.\n- `maxlength` {number}  sets the input's `maxlength` property to the max characters you can type\n- `uppercase` {boolean} sets the input editor's to all uppercase\n- `lowercase` {boolean} sets the input editor's to all lowercase\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-break` {string} Controls how the label and input behave when space is constrained. Only applies to side labels (`label-position=\"inline-start\"` or `label-position=\"inline-end\"`). Options are:\n  - `shrink-value` (default): Label stays on the same line; the value area shrinks when space is constrained\n  - `break`: The value area moves below the label (for inline-start) or above the label (for inline-end) when space is constrained\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `label-alignment` {string} Controls the horizontal text alignment of the label when using inline positioning. Only applies to side labels (`label-position=\"inline-start\"` or `label-position=\"inline-end\"`). Options are:\n  - `start` (default): Aligns the label text to the start of the label area\n  - `end`: Aligns the label text to the end of the label area (right-aligns in LTR, left-aligns in RTL)\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `hidden` {boolean} Hides the input element from display\n\n## Keyboard Guidelines\n\nThe IDS Input doesn't contain any interactions beyond a standard HTMLInputElement:\n\n- <kbd>Tab</kbd> and <kbd>Shift Tab</kbd> moves focus into the edit field to/from the next focusable item in the tab order.\n\n## Responsive Guidelines\n\n- Default size is 300px wide but there are a number of widths.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Block grid / Image List partially replaces the carousel in 3.x\n\n**4.x to 5.x**\n\n- The Input component has been changed to a web component and renamed to ids-input.\n- Markup has changed to a custom element `<ids-input></ids-input>` (see examples above)\n- Actions next to the input is deprecated, if needed you can code it with a button, popupmenu and input\n- If using events, events are now plain JS events (custom events)\n- Can now be imported as a single JS file and used with encapsulated styles\n- Can now be use variation of sizes (width/height)\n- If using a clearable X on the input the x is now tabbable by default for accessibility\n\nMarkup comparison:\n\n```html\n<!-- 4.x input example -->\n<div class=\"field\">\n  <label class=\"required\" for=\"last-name\">Last Name</label>\n  <input type=\"text\" id=\"last-name\" aria-required=\"true\" name=\"last-name\" data-validate=\"required\"/>\n</div>\n\n<!-- this is the same input using the WebComponent -->\n<ids-input label=\"Last Name\" id=\"last-name\" name=\"last-name\" validate=\"required\"></ids-input>\n```\n\n## Accessibility Guidelines\n\nThere should be a label on all inputs to give an indication what the field is containing.\n"}},{"name":"ids-input-group","attributes":[{"name":"#group-rule","values":[]},{"name":"#slotted-inputs","values":[]},{"name":"#validate-timeout","values":[]}],"description":{"kind":"markdown","value":"# ids-input-group\n\n## Description\n\nThe IDS Input Group Component consists of group of input components displayed `inline-block`.\nIt accepts any combination of IDS Form Components (ex. Input, Timepicker, Datepicker, Checkbox).\nIt also allows setting an `IdsGroupValidationRule` to check against the slotted collection of input components.\n\n## Type IdsGroupValidationRule\n```js\ntype IdsGroupValidationRule = {\n  /** The localized message text */\n  message: string;\n  /** The message ID for localization */\n  messageId?: string;\n  /** Custom group validation callback */\n  check: (inputComponents: Array<any>) => boolean;\n};\n```\n\n## Features (With Code Examples)\n\nHTML Code\n\n```html\n<ids-input-group>\n  <ids-input name=\"firstname\" label=\"First Name\" type=\"text\"></ids-input>\n  <ids-input name=\"lastname\" label=\"Last Name\" type=\"text\"></ids-input>\n</ids-input-group>\n```\n\nJS Code\n```js\nfunction findInputByName(formInputs: Array<any>, inputName: string) {\n  return formInputs.find((input) => input.getAttribute('name') === inputName);\n}\n\nconst noDuplicateNamesRule: IdsGroupValidationRule = {\n  message: 'Multiple employees share your name. Your company email will contain a serial number.',\n  check: (inputComponents: Array<any>) => {\n    const EXISTING_EMPLOYEES = ['John Smith', 'Jane Doe'];\n    const firstName = findInputByName(inputComponents, 'firstname').value;\n    const lastName = findInputByName(inputComponents, 'lastname').value;\n    const fullName = `${firstName} ${lastName}`;\n\n    return EXISTING_EMPLOYEES.indexOf(fullName) === -1;\n  }\n};\n\nconst inputGroup = document.querySelector<IdsInputGroup>('ids-input-group');\ninputGroup.setGroupValidationRule(noDuplicateNamesRule);\n```\n\n## Methods\n\n- `setGroupValidationRule(groupRule: IdsGroupValidationRule)` Sets group validation rule\n- `removeGroupValidationRule()` Sets group validation rule\n"}},{"name":"ids-kpi","attributes":[{"name":"compact","description":"Set the compact attribute","values":[]},{"name":"trend","description":"Set the trend of the KPI component (Optional).","values":[]},{"name":"trend-label","description":"Used to showcase price or amount trending up or down (Optional).","values":[]},{"name":"trend-label-color","description":"Set the trend label color","values":[]},{"name":"trend-label-icon-color","description":"Set the trend label icon color","values":[]},{"name":"trend-label-no-icon","description":"Set whether to hide the trend label icon","values":[]},{"name":"icon","description":"Use to call attention to status of the KPI.\nCan be colored to bring attention (via statusColor)\n(Optional in larger KPI format).","values":[]},{"name":"status-color","description":"Color that can be used for embellishment or to indicate status or bring attention","values":[]},{"name":"kpi","description":"Large center label. Show up to 6 characters in small size in the KPI area","values":[]},{"name":"main-label","description":"Main KPI Label. Will truncate if too big","values":[]},{"name":"subtitle","description":"Extra details on the KPI. Single line. Auto truncates.","values":[]},{"name":"col-span","description":"Get col-span attribute","values":[]},{"name":"formats","values":[]},{"name":"kpi-format","description":"Get col-span attribute","values":[]},{"name":"show-all","description":"Set the dropdown to combobox feature","values":[]},{"name":"trend-format","description":"Get col-span attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-kpi\n\n## Description\n\nKPIs are UI embellishments that are used in widgets to display statistical information. They are primarily used on widgets but may be used on other form areas if required. They consist of several elements in a layout with a trend value, a KPI, a main label and a sub label and are fixed size.\n\n## Use Cases\n\n- A newer version of the Counts component and a replacement for the Stats component.\n- Use when you want users to see an overview of the data.\n\n## Dos and Don'ts\n\n- Don't overcrowd your content with KPIs, so people can see the data clearly.\n\n## Terminology\n\n- **KPI**: Abbreviation for key performance indicator\n\n## Features (With Code Examples)\n\nA simple state component with all options. Note that you should only used one of the trend label or the trend icon since they are in the same location.\n\n```html\n<ids-kpi\n  icon=\"rocket\"\n  trend-label-color=\"green-50\"\n  status-color=\"error\"\n  kpi=\"$893\"\n  main-label=\"Revenue Calculation\"\n  subtitle=\"qa 2024\">\n</ids-kpi>\n```\n\n## Class Hierarchy\n\n- IdsKPI\n  - IdsElement\n- Mixins\n  - IdsEventsMixin\n  - IdsKeyboardMixin\n- Uses\n  - IdsIcon\n  - IdsText\n  - IdsLayoutFlex\n\n## Settings (Attributes)\n\n- `trendLabel` {string} Used to showcase price or amount trending up or down (Optional). Accepts both numeric and text values. For numeric values: if positive, shown in success color with up trend icon; if negative, shown in error color with down trend icon. For text values: defaults to neutral color and hides the trend icon (use `trend` attribute to control direction). This can be paired with `icon`.\n- `trend` {string} Controls the trend direction and styling when using text-based trend labels. Accepts 'positive', 'negative', or 'neutral'. When set, overrides automatic trend detection from numeric values.\n- `trendLabelColor` {string} Sets the color of the trend label and its associated icon. Accepts:\n  - IDS design token variables (e.g., 'var(--ids-color-green-50)')\n  - IDS color tokens (e.g., 'green-50', 'blue-100')\n  - Hex color values (e.g., '#FF0000')\n  If invalid or not set, defaults to 'success' (green) for positive trends and 'error' (red) for negative trends.\n- `trendLabelNoIcon` {boolean} When set to true, hides the trend icon and displays only the trend label text. Useful when you want to show trend information without visual indicators.\n- `icon` {string} Use to call attention to status of the KPI. Can be colored to bring attention via statusColor (Optional in larger KPI format). This can be paired with `trendLabel`.\n- `trendFormat` {object} Allows you to format the trend label using `Intl.NumberFormat` settings or can be set to empty string to have no formatting\n- `statusColor` {string} Sets the color of the icon. Can be error, info, success, warning or any palette color like blue, green, orange ect.\n- `kpi` {string} Large center label. Show up to 6 characters in small size in the KPI area.\n- `kpiFormat` {object} Allows you to format the KPI label using `Intl.NumberFormat` settings or can be set to empty string to have no formatting\n- `mainLabel` {string} Main KPI Label. Will truncate if too big.\n- `subtitle` {string} Extra details on the KPI. Single line. Auto truncates.\n\n## Themeable Parts\n\n- `kpi` allows you to further style the main container\n\n## States and Variations\n\n- Color\n- Status Color\n- Selected\n- Trend\n- Trend Label Icon Color\n- Trend Label Color\n\n## Responsive Guidelines\n\n- Fixed size but can flow within a ids-flex-layout, ids-layout-grid or ids-scroll-container\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- New Component but similar to stats in the older counts and stats components.\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The contents will flip to the alternate side in Right To Left mode. Consider that things like dollar signs, plus and minus need to be localized. Also note that due to the fixed size, the KPI contents may truncate in some languages or with large text or values.\n"}},{"name":"ids-layout-flex-item","description":{"kind":"markdown","value":"# ids-layout-flex\n\n## Description\n\nThe Ids Layout Flex is comprised of 2 web components, IdsLayoutFlex and IdsLayoutFlexItem. IdsLayoutFlex is the parent container in which the child items defined. IdsLayoutFlexItem is a child element of Layout Flex. These elements contain the UI contents. A Layout Flex can also be nested inside a layout flex item.\n\n## Use Cases\n\n- Use to layout complex forms\n- Use to layout a list\n\n## Terminology\n\n- **Flex**: Container that has the `display: flex` property set on it. We refer to this as `ids-layout-flex`.\n- **FlexItem** Child element of layout flex, we refer to this as `ids-layout-flex-item`.\n\n## Features (With Code Examples)\n\nBy default the layout flex is set as direction row.\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with gap (8).\nGap can set horizontal as (gap-x) and vertical as (gap-y)\nThe value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40\n\n```html\n<ids-layout-flex gap=\"8\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with align-content (center).\nThe value can be use: flex-start, flex-end, center, space-between, space-around, space-evenly, stretch, start, end, baseline\n\n```html\n<ids-layout-flex align-content=\"center\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with align-items (center).\nThe value can be use: start, end, flex-start, flex-end, center, baseline, stretch\n\n```html\n<ids-layout-flex align-items=\"center\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with direction (column).\nThe value can be use: row, row-reverse, column, column-reverse\n\n```html\n<ids-layout-flex direction=\"column\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with display (inline-flex).\nThe value can be use: flex, inline-flex\n\n```html\n<ids-layout-flex display=\"inline-flex\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with justify-content (center).\nThe value can be use: start, end, flex-start, flex-end, center, left, right, space-between, space-around, space-evenly\n\n```html\n<ids-layout-flex justify-content=\"center\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with wrap (wrap).\nThe value can be use: `nowrap`, `wrap`, `wrap-reverse`\n\n```html\n<ids-layout-flex wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item align-self (center).\nThe value can be use: auto, baseline, center, stretch, flex-start, flex-end\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item align-self=\"center\">\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item min-width.\nWhen using `flex` with `wrap`, flex items can shrink below their content size because the `flex` attribute sets `min-width: 0`. Use the `min-width` attribute to set a floor width that triggers proper wrapping behavior.\n\n```html\n<ids-layout-flex gap=\"8\" wrap=\"wrap\">\n  <ids-layout-flex-item flex=\"1\" min-width=\"120px\">\n    <ids-checkbox label=\"Checkbox 1\"></ids-checkbox>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item flex=\"1\" min-width=\"120px\">\n    <ids-checkbox label=\"Checkbox 2\"></ids-checkbox>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item flex=\"1\" min-width=\"120px\">\n    <ids-checkbox label=\"Checkbox 3\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item grow (1).\nThe value can be use: 0, 1\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item grow=\"1\">\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item shrink (0).\nThe value can be use: 0, 1\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item shrink=\"0\">\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\n## Aligning Mixed-Height Controls (`align-items=\"center-inputs\"`)\n\nUse `align-items=\"center-inputs\"` on an `ids-layout-flex` when a row mixes form controls that have different intrinsic heights (inputs, date pickers, time pickers, textareas, dropdowns) with controls that are shorter (like `ids-checkbox`). The flex container will apply `align-items: start` to its items and raise the checkbox onto the baseline of the surrounding input fields, so the checkbox's interactive target visually lines up with the middle of the input controls.\n\n```html\n<ids-layout-flex gap=\"16\" align-items=\"center-inputs\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-time-picker label=\"Time picker\" placeholder=\"Default\" no-margins></ids-time-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-checkbox label=\"Subscribe\" label-break=\"shrink-value\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nThe flex container automatically detects the `field-height` or `compact` attribute on its descendant inputs and reflects the detected size onto itself. The CSS variables that drive the checkbox offset (`--ids-checkbox-inline-min-height`, `--ids-checkbox-margin-top`) are then set for that field height. Supported field heights are `xs` (default when a child is `compact`), `sm`, `md` (default), and `lg`.\n\nSee the `example-align-center-inputs.html` demo for each field height in action.\n\n## Aligning Items in a Flex Layout\n\nWhen using `align-items=\"center\"` on a flex container, different types of child components (inputs, buttons, checkboxes, text) may not visually align as expected because they have different intrinsic heights and internal spacing. The `example-align-items-center` demo page illustrates several techniques for handling this.\n\n### Using `align-self` to Override Alignment on Individual Items\n\nWhen most items in a row should be centered but one item needs different alignment, use `align-self` on that item's `ids-layout-flex-item`. For example, a checkbox placed alongside input fields may look better aligned to the bottom of the row:\n\n```html\n<ids-layout-flex gap=\"16\" align-items=\"center\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item align-self=\"flex-end\">\n    <ids-checkbox label=\"Custom Tooltip\" tooltip=\"This is a custom tooltip message\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\n### Using Padding to Fine-Tune Item Position\n\nSome components (like checkboxes or plain text) do not have the same built-in label spacing as input fields. In these cases, you can apply `padding-y` on the `ids-layout-flex-item` to nudge the item into visual alignment with its siblings:\n\n```html\n<ids-layout-flex gap=\"16\" align-items=\"start\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins validate=\"required\"></ids-date-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins validate=\"required\"></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item padding-y=\"28\">\n    <ids-checkbox label=\"Custom Tooltip\" tooltip=\"This is a custom tooltip message\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nSimilarly, when aligning plain text alongside input fields, padding can help position the text at the correct vertical offset:\n\n```html\n<ids-layout-flex gap=\"8\" align-items=\"end\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item align-self=\"flex-end\" padding-y=\"9\">\n    <ids-text>My Text:</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\n### Using `no-margins` and `compact` for Tighter Layouts\n\nWhen aligning items in a flex row, use `no-margins` on input components to remove extra spacing that can throw off alignment. The `compact` attribute reduces component height for denser layouts. When using compact fields, the padding values for sibling items (like checkboxes) will need to be adjusted accordingly (e.g., `padding-y=\"22\"` instead of `padding-y=\"28\"`).\n\n### Using `label-position=\"inline-start\"` with Checkboxes\n\nForm components like checkboxes and inputs support `label-position=\"inline-start\"` to place labels to the left of the control. When using these in a flex layout, combine with `label-wrap` and `label-alignment` attributes to control label behavior:\n\n- `label-wrap=\"wrap-no-stretch\"` - Allows label text to wrap while keeping the label vertically centered\n- `label-wrap=\"ellipsis-no-stretch\"` - Truncates long labels with ellipsis while keeping the label vertically centered\n- `label-alignment=\"end\"` - Right-aligns the label text within its allocated width\n\n```html\n<ids-layout-flex gap=\"8\" wrap=\"wrap\" align-items=\"start\">\n  <ids-layout-flex-item>\n    <ids-input type=\"text\" label=\"My input\" label-position=\"inline-start\" size=\"full\"></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-checkbox label=\"Checkbox 1\" label-position=\"inline-start\" label-wrap=\"wrap-no-stretch\" label-alignment=\"end\"></ids-checkbox>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-checkbox label=\"Checkbox 2\" label-position=\"inline-start\" label-wrap=\"wrap-no-stretch\" label-alignment=\"end\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nThis pattern is useful when you need checkboxes to align with input fields that have side labels, ensuring consistent visual alignment across different form control types.\n\nYou can also make a flex item into a scrollable area using the `ids-scroll-container` separate min-component.\n\n```html\n  <ids-layout-flex direction=\"column\" gap=\"0\" full-height>\n    <ids-layout-flex-item>\n      <ids-header>\n      </ids-header>\n    </ids-layout-flex-item>\n\n    <ids-layout-flex-item grow=\"1\" overflow=\"hidden\">\n      <ids-scroll-container>\n        <!--Scrollable contents-->\n       </ids-scroll-container>\n    </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with height attributes.\nThese attributes are especially important when using column direction with flex-grow items.\n\n```html\n<ids-layout-flex direction=\"column\" height=\"300px\">\n  <ids-layout-flex-item grow=\"1\">\n    <div>Item 1</div>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <div>Item 2</div>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nStandalone CSS Example\n\n```html\n<div class=\"ids-layout-flex ids-layout-flex-gap-8\">\n  <div class=\"ids-layout-flex-item\">\n    <span class=\"ids-text\">test</span>\n  </div>\n  <div class=\"ids-layout-flex-item\">\n    <span class=\"ids-text\">test</span>\n  </div>\n  <div class=\"ids-layout-flex-item\">\n    <span class=\"ids-text\">test</span>\n  </div>\n</div>\n```\n\n## Settings and Attributes (IdsLayoutFlex)\n\n- `alignContent` {string} sets the align-content setting, value can be use: `flex-start`, `flex-end`, `center`, `space-between`, `space-around`, `space-evenly`, `stretch`, `start`, `end`, `baseline`.\n- `alignItems` {string} sets the align-items setting, value can be use: `start`, `end`, `flex-start`, `flex-end`, `center`, `center-inputs`, `baseline`, `stretch`. The `center-inputs` value vertically centers shorter controls (like `ids-checkbox`) against the input baseline in rows that mix input heights — see the \"Aligning Mixed-Height Controls\" section above.\n- `direction` {string} sets the direction setting, value can be use: `row`, `row-reverse`, `column`, `column-reverse`.\n- `display` {string} sets the display setting, value can be use: `flex`, `inline-flex`.\n- `gap` {string|number} sets the gap apply same for both horizontal and vertical sides, value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40.\n- `gapX` {string|number} sets the horizontal gap, value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40.\n- `gapY` {string|number} sets the vertical gap, value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40.\n- `height` {string} sets the height of the flex container (e.g.'300px'). This is especially important when using column direction with flex-grow items.\n- `hidden` {boolean} Hides the element from display.\n- `justifyContent` {string} sets the justify-content setting, value can be use: `start`, `end`, `flex-start`, `flex-end`, `center`, `left`, `right`, `space-between`, `space-around`, `space-evenly`.\n- `wrap` {string} sets the wrap setting, value can be use: `nowrap`, `wrap`, `wrap-reverse`.\n\n## Settings and Attributes (IdsLayoutFlexItem)\n\n- `alignSelf` {string} sets the align-self setting, value can be use: `auto`, `baseline`, `center`, `stretch`, `flex-start`, `flex-end`.\n- `flex` {string|number} sets the flex setting, value can be used: 0-24\n- `grow` {string|number} sets the grow setting, value can be used: 0, 1\n- `minWidth` {string} sets the minimum width of the flex item (e.g. `'120px'`, `'10rem'`). This is especially useful when using `flex` with `wrap` to prevent items from shrinking below a usable size and to ensure proper wrapping behavior.\n- `shrink` {string|number} sets the shrink setting, value can be used: 0, 1\n\n## Keyboard Guidelines\n\nA layout flex is not on its own keyboard focusable and has no keyboard interaction.\n\n## Responsive Guidelines\n\n- A Layout Flex will flow automatically with the screen size.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- New concept in 5.x\n\n## Regional Considerations\n\nThe entire flex will flip direction in Right-To-Left languages.\n"}},{"name":"ids-layout-flex","description":{"kind":"markdown","value":"# ids-layout-flex\n\n## Description\n\nThe Ids Layout Flex is comprised of 2 web components, IdsLayoutFlex and IdsLayoutFlexItem. IdsLayoutFlex is the parent container in which the child items defined. IdsLayoutFlexItem is a child element of Layout Flex. These elements contain the UI contents. A Layout Flex can also be nested inside a layout flex item.\n\n## Use Cases\n\n- Use to layout complex forms\n- Use to layout a list\n\n## Terminology\n\n- **Flex**: Container that has the `display: flex` property set on it. We refer to this as `ids-layout-flex`.\n- **FlexItem** Child element of layout flex, we refer to this as `ids-layout-flex-item`.\n\n## Features (With Code Examples)\n\nBy default the layout flex is set as direction row.\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with gap (8).\nGap can set horizontal as (gap-x) and vertical as (gap-y)\nThe value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40\n\n```html\n<ids-layout-flex gap=\"8\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with align-content (center).\nThe value can be use: flex-start, flex-end, center, space-between, space-around, space-evenly, stretch, start, end, baseline\n\n```html\n<ids-layout-flex align-content=\"center\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with align-items (center).\nThe value can be use: start, end, flex-start, flex-end, center, baseline, stretch\n\n```html\n<ids-layout-flex align-items=\"center\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with direction (column).\nThe value can be use: row, row-reverse, column, column-reverse\n\n```html\n<ids-layout-flex direction=\"column\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with display (inline-flex).\nThe value can be use: flex, inline-flex\n\n```html\n<ids-layout-flex display=\"inline-flex\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with justify-content (center).\nThe value can be use: start, end, flex-start, flex-end, center, left, right, space-between, space-around, space-evenly\n\n```html\n<ids-layout-flex justify-content=\"center\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with wrap (wrap).\nThe value can be use: `nowrap`, `wrap`, `wrap-reverse`\n\n```html\n<ids-layout-flex wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item align-self (center).\nThe value can be use: auto, baseline, center, stretch, flex-start, flex-end\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item align-self=\"center\">\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item min-width.\nWhen using `flex` with `wrap`, flex items can shrink below their content size because the `flex` attribute sets `min-width: 0`. Use the `min-width` attribute to set a floor width that triggers proper wrapping behavior.\n\n```html\n<ids-layout-flex gap=\"8\" wrap=\"wrap\">\n  <ids-layout-flex-item flex=\"1\" min-width=\"120px\">\n    <ids-checkbox label=\"Checkbox 1\"></ids-checkbox>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item flex=\"1\" min-width=\"120px\">\n    <ids-checkbox label=\"Checkbox 2\"></ids-checkbox>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item flex=\"1\" min-width=\"120px\">\n    <ids-checkbox label=\"Checkbox 3\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item grow (1).\nThe value can be use: 0, 1\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item grow=\"1\">\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item shrink (0).\nThe value can be use: 0, 1\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item shrink=\"0\">\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\n## Aligning Mixed-Height Controls (`align-items=\"center-inputs\"`)\n\nUse `align-items=\"center-inputs\"` on an `ids-layout-flex` when a row mixes form controls that have different intrinsic heights (inputs, date pickers, time pickers, textareas, dropdowns) with controls that are shorter (like `ids-checkbox`). The flex container will apply `align-items: start` to its items and raise the checkbox onto the baseline of the surrounding input fields, so the checkbox's interactive target visually lines up with the middle of the input controls.\n\n```html\n<ids-layout-flex gap=\"16\" align-items=\"center-inputs\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-time-picker label=\"Time picker\" placeholder=\"Default\" no-margins></ids-time-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-checkbox label=\"Subscribe\" label-break=\"shrink-value\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nThe flex container automatically detects the `field-height` or `compact` attribute on its descendant inputs and reflects the detected size onto itself. The CSS variables that drive the checkbox offset (`--ids-checkbox-inline-min-height`, `--ids-checkbox-margin-top`) are then set for that field height. Supported field heights are `xs` (default when a child is `compact`), `sm`, `md` (default), and `lg`.\n\nSee the `example-align-center-inputs.html` demo for each field height in action.\n\n## Aligning Items in a Flex Layout\n\nWhen using `align-items=\"center\"` on a flex container, different types of child components (inputs, buttons, checkboxes, text) may not visually align as expected because they have different intrinsic heights and internal spacing. The `example-align-items-center` demo page illustrates several techniques for handling this.\n\n### Using `align-self` to Override Alignment on Individual Items\n\nWhen most items in a row should be centered but one item needs different alignment, use `align-self` on that item's `ids-layout-flex-item`. For example, a checkbox placed alongside input fields may look better aligned to the bottom of the row:\n\n```html\n<ids-layout-flex gap=\"16\" align-items=\"center\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item align-self=\"flex-end\">\n    <ids-checkbox label=\"Custom Tooltip\" tooltip=\"This is a custom tooltip message\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\n### Using Padding to Fine-Tune Item Position\n\nSome components (like checkboxes or plain text) do not have the same built-in label spacing as input fields. In these cases, you can apply `padding-y` on the `ids-layout-flex-item` to nudge the item into visual alignment with its siblings:\n\n```html\n<ids-layout-flex gap=\"16\" align-items=\"start\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins validate=\"required\"></ids-date-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins validate=\"required\"></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item padding-y=\"28\">\n    <ids-checkbox label=\"Custom Tooltip\" tooltip=\"This is a custom tooltip message\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nSimilarly, when aligning plain text alongside input fields, padding can help position the text at the correct vertical offset:\n\n```html\n<ids-layout-flex gap=\"8\" align-items=\"end\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item align-self=\"flex-end\" padding-y=\"9\">\n    <ids-text>My Text:</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\n### Using `no-margins` and `compact` for Tighter Layouts\n\nWhen aligning items in a flex row, use `no-margins` on input components to remove extra spacing that can throw off alignment. The `compact` attribute reduces component height for denser layouts. When using compact fields, the padding values for sibling items (like checkboxes) will need to be adjusted accordingly (e.g., `padding-y=\"22\"` instead of `padding-y=\"28\"`).\n\n### Using `label-position=\"inline-start\"` with Checkboxes\n\nForm components like checkboxes and inputs support `label-position=\"inline-start\"` to place labels to the left of the control. When using these in a flex layout, combine with `label-wrap` and `label-alignment` attributes to control label behavior:\n\n- `label-wrap=\"wrap-no-stretch\"` - Allows label text to wrap while keeping the label vertically centered\n- `label-wrap=\"ellipsis-no-stretch\"` - Truncates long labels with ellipsis while keeping the label vertically centered\n- `label-alignment=\"end\"` - Right-aligns the label text within its allocated width\n\n```html\n<ids-layout-flex gap=\"8\" wrap=\"wrap\" align-items=\"start\">\n  <ids-layout-flex-item>\n    <ids-input type=\"text\" label=\"My input\" label-position=\"inline-start\" size=\"full\"></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-checkbox label=\"Checkbox 1\" label-position=\"inline-start\" label-wrap=\"wrap-no-stretch\" label-alignment=\"end\"></ids-checkbox>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-checkbox label=\"Checkbox 2\" label-position=\"inline-start\" label-wrap=\"wrap-no-stretch\" label-alignment=\"end\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nThis pattern is useful when you need checkboxes to align with input fields that have side labels, ensuring consistent visual alignment across different form control types.\n\nYou can also make a flex item into a scrollable area using the `ids-scroll-container` separate min-component.\n\n```html\n  <ids-layout-flex direction=\"column\" gap=\"0\" full-height>\n    <ids-layout-flex-item>\n      <ids-header>\n      </ids-header>\n    </ids-layout-flex-item>\n\n    <ids-layout-flex-item grow=\"1\" overflow=\"hidden\">\n      <ids-scroll-container>\n        <!--Scrollable contents-->\n       </ids-scroll-container>\n    </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with height attributes.\nThese attributes are especially important when using column direction with flex-grow items.\n\n```html\n<ids-layout-flex direction=\"column\" height=\"300px\">\n  <ids-layout-flex-item grow=\"1\">\n    <div>Item 1</div>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <div>Item 2</div>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nStandalone CSS Example\n\n```html\n<div class=\"ids-layout-flex ids-layout-flex-gap-8\">\n  <div class=\"ids-layout-flex-item\">\n    <span class=\"ids-text\">test</span>\n  </div>\n  <div class=\"ids-layout-flex-item\">\n    <span class=\"ids-text\">test</span>\n  </div>\n  <div class=\"ids-layout-flex-item\">\n    <span class=\"ids-text\">test</span>\n  </div>\n</div>\n```\n\n## Settings and Attributes (IdsLayoutFlex)\n\n- `alignContent` {string} sets the align-content setting, value can be use: `flex-start`, `flex-end`, `center`, `space-between`, `space-around`, `space-evenly`, `stretch`, `start`, `end`, `baseline`.\n- `alignItems` {string} sets the align-items setting, value can be use: `start`, `end`, `flex-start`, `flex-end`, `center`, `center-inputs`, `baseline`, `stretch`. The `center-inputs` value vertically centers shorter controls (like `ids-checkbox`) against the input baseline in rows that mix input heights — see the \"Aligning Mixed-Height Controls\" section above.\n- `direction` {string} sets the direction setting, value can be use: `row`, `row-reverse`, `column`, `column-reverse`.\n- `display` {string} sets the display setting, value can be use: `flex`, `inline-flex`.\n- `gap` {string|number} sets the gap apply same for both horizontal and vertical sides, value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40.\n- `gapX` {string|number} sets the horizontal gap, value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40.\n- `gapY` {string|number} sets the vertical gap, value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40.\n- `height` {string} sets the height of the flex container (e.g.'300px'). This is especially important when using column direction with flex-grow items.\n- `hidden` {boolean} Hides the element from display.\n- `justifyContent` {string} sets the justify-content setting, value can be use: `start`, `end`, `flex-start`, `flex-end`, `center`, `left`, `right`, `space-between`, `space-around`, `space-evenly`.\n- `wrap` {string} sets the wrap setting, value can be use: `nowrap`, `wrap`, `wrap-reverse`.\n\n## Settings and Attributes (IdsLayoutFlexItem)\n\n- `alignSelf` {string} sets the align-self setting, value can be use: `auto`, `baseline`, `center`, `stretch`, `flex-start`, `flex-end`.\n- `flex` {string|number} sets the flex setting, value can be used: 0-24\n- `grow` {string|number} sets the grow setting, value can be used: 0, 1\n- `minWidth` {string} sets the minimum width of the flex item (e.g. `'120px'`, `'10rem'`). This is especially useful when using `flex` with `wrap` to prevent items from shrinking below a usable size and to ensure proper wrapping behavior.\n- `shrink` {string|number} sets the shrink setting, value can be used: 0, 1\n\n## Keyboard Guidelines\n\nA layout flex is not on its own keyboard focusable and has no keyboard interaction.\n\n## Responsive Guidelines\n\n- A Layout Flex will flow automatically with the screen size.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- New concept in 5.x\n\n## Regional Considerations\n\nThe entire flex will flip direction in Right-To-Left languages.\n"}},{"name":"ids-scroll-container","attributes":[{"name":"height","description":"Get the current height","values":[]},{"name":"width","description":"Get the current width","values":[]}],"description":{"kind":"markdown","value":"# ids-layout-flex\n\n## Description\n\nThe Ids Layout Flex is comprised of 2 web components, IdsLayoutFlex and IdsLayoutFlexItem. IdsLayoutFlex is the parent container in which the child items defined. IdsLayoutFlexItem is a child element of Layout Flex. These elements contain the UI contents. A Layout Flex can also be nested inside a layout flex item.\n\n## Use Cases\n\n- Use to layout complex forms\n- Use to layout a list\n\n## Terminology\n\n- **Flex**: Container that has the `display: flex` property set on it. We refer to this as `ids-layout-flex`.\n- **FlexItem** Child element of layout flex, we refer to this as `ids-layout-flex-item`.\n\n## Features (With Code Examples)\n\nBy default the layout flex is set as direction row.\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with gap (8).\nGap can set horizontal as (gap-x) and vertical as (gap-y)\nThe value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40\n\n```html\n<ids-layout-flex gap=\"8\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with align-content (center).\nThe value can be use: flex-start, flex-end, center, space-between, space-around, space-evenly, stretch, start, end, baseline\n\n```html\n<ids-layout-flex align-content=\"center\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with align-items (center).\nThe value can be use: start, end, flex-start, flex-end, center, baseline, stretch\n\n```html\n<ids-layout-flex align-items=\"center\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with direction (column).\nThe value can be use: row, row-reverse, column, column-reverse\n\n```html\n<ids-layout-flex direction=\"column\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with display (inline-flex).\nThe value can be use: flex, inline-flex\n\n```html\n<ids-layout-flex display=\"inline-flex\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with justify-content (center).\nThe value can be use: start, end, flex-start, flex-end, center, left, right, space-between, space-around, space-evenly\n\n```html\n<ids-layout-flex justify-content=\"center\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with wrap (wrap).\nThe value can be use: `nowrap`, `wrap`, `wrap-reverse`\n\n```html\n<ids-layout-flex wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item align-self (center).\nThe value can be use: auto, baseline, center, stretch, flex-start, flex-end\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item align-self=\"center\">\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item min-width.\nWhen using `flex` with `wrap`, flex items can shrink below their content size because the `flex` attribute sets `min-width: 0`. Use the `min-width` attribute to set a floor width that triggers proper wrapping behavior.\n\n```html\n<ids-layout-flex gap=\"8\" wrap=\"wrap\">\n  <ids-layout-flex-item flex=\"1\" min-width=\"120px\">\n    <ids-checkbox label=\"Checkbox 1\"></ids-checkbox>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item flex=\"1\" min-width=\"120px\">\n    <ids-checkbox label=\"Checkbox 2\"></ids-checkbox>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item flex=\"1\" min-width=\"120px\">\n    <ids-checkbox label=\"Checkbox 3\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item grow (1).\nThe value can be use: 0, 1\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item grow=\"1\">\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with item shrink (0).\nThe value can be use: 0, 1\n\n```html\n<ids-layout-flex>\n  <ids-layout-flex-item shrink=\"0\">\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-text font-size=\"12\">test</ids-text>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\n## Aligning Mixed-Height Controls (`align-items=\"center-inputs\"`)\n\nUse `align-items=\"center-inputs\"` on an `ids-layout-flex` when a row mixes form controls that have different intrinsic heights (inputs, date pickers, time pickers, textareas, dropdowns) with controls that are shorter (like `ids-checkbox`). The flex container will apply `align-items: start` to its items and raise the checkbox onto the baseline of the surrounding input fields, so the checkbox's interactive target visually lines up with the middle of the input controls.\n\n```html\n<ids-layout-flex gap=\"16\" align-items=\"center-inputs\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-time-picker label=\"Time picker\" placeholder=\"Default\" no-margins></ids-time-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-checkbox label=\"Subscribe\" label-break=\"shrink-value\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nThe flex container automatically detects the `field-height` or `compact` attribute on its descendant inputs and reflects the detected size onto itself. The CSS variables that drive the checkbox offset (`--ids-checkbox-inline-min-height`, `--ids-checkbox-margin-top`) are then set for that field height. Supported field heights are `xs` (default when a child is `compact`), `sm`, `md` (default), and `lg`.\n\nSee the `example-align-center-inputs.html` demo for each field height in action.\n\n## Aligning Items in a Flex Layout\n\nWhen using `align-items=\"center\"` on a flex container, different types of child components (inputs, buttons, checkboxes, text) may not visually align as expected because they have different intrinsic heights and internal spacing. The `example-align-items-center` demo page illustrates several techniques for handling this.\n\n### Using `align-self` to Override Alignment on Individual Items\n\nWhen most items in a row should be centered but one item needs different alignment, use `align-self` on that item's `ids-layout-flex-item`. For example, a checkbox placed alongside input fields may look better aligned to the bottom of the row:\n\n```html\n<ids-layout-flex gap=\"16\" align-items=\"center\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item align-self=\"flex-end\">\n    <ids-checkbox label=\"Custom Tooltip\" tooltip=\"This is a custom tooltip message\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\n### Using Padding to Fine-Tune Item Position\n\nSome components (like checkboxes or plain text) do not have the same built-in label spacing as input fields. In these cases, you can apply `padding-y` on the `ids-layout-flex-item` to nudge the item into visual alignment with its siblings:\n\n```html\n<ids-layout-flex gap=\"16\" align-items=\"start\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins validate=\"required\"></ids-date-picker>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins validate=\"required\"></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item padding-y=\"28\">\n    <ids-checkbox label=\"Custom Tooltip\" tooltip=\"This is a custom tooltip message\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nSimilarly, when aligning plain text alongside input fields, padding can help position the text at the correct vertical offset:\n\n```html\n<ids-layout-flex gap=\"8\" align-items=\"end\" wrap=\"wrap\">\n  <ids-layout-flex-item>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item align-self=\"flex-end\" padding-y=\"9\">\n    <ids-text>My Text:</ids-text>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\n### Using `no-margins` and `compact` for Tighter Layouts\n\nWhen aligning items in a flex row, use `no-margins` on input components to remove extra spacing that can throw off alignment. The `compact` attribute reduces component height for denser layouts. When using compact fields, the padding values for sibling items (like checkboxes) will need to be adjusted accordingly (e.g., `padding-y=\"22\"` instead of `padding-y=\"28\"`).\n\n### Using `label-position=\"inline-start\"` with Checkboxes\n\nForm components like checkboxes and inputs support `label-position=\"inline-start\"` to place labels to the left of the control. When using these in a flex layout, combine with `label-wrap` and `label-alignment` attributes to control label behavior:\n\n- `label-wrap=\"wrap-no-stretch\"` - Allows label text to wrap while keeping the label vertically centered\n- `label-wrap=\"ellipsis-no-stretch\"` - Truncates long labels with ellipsis while keeping the label vertically centered\n- `label-alignment=\"end\"` - Right-aligns the label text within its allocated width\n\n```html\n<ids-layout-flex gap=\"8\" wrap=\"wrap\" align-items=\"start\">\n  <ids-layout-flex-item>\n    <ids-input type=\"text\" label=\"My input\" label-position=\"inline-start\" size=\"full\"></ids-input>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-checkbox label=\"Checkbox 1\" label-position=\"inline-start\" label-wrap=\"wrap-no-stretch\" label-alignment=\"end\"></ids-checkbox>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <ids-checkbox label=\"Checkbox 2\" label-position=\"inline-start\" label-wrap=\"wrap-no-stretch\" label-alignment=\"end\"></ids-checkbox>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nThis pattern is useful when you need checkboxes to align with input fields that have side labels, ensuring consistent visual alignment across different form control types.\n\nYou can also make a flex item into a scrollable area using the `ids-scroll-container` separate min-component.\n\n```html\n  <ids-layout-flex direction=\"column\" gap=\"0\" full-height>\n    <ids-layout-flex-item>\n      <ids-header>\n      </ids-header>\n    </ids-layout-flex-item>\n\n    <ids-layout-flex-item grow=\"1\" overflow=\"hidden\">\n      <ids-scroll-container>\n        <!--Scrollable contents-->\n       </ids-scroll-container>\n    </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nExample of flex with height attributes.\nThese attributes are especially important when using column direction with flex-grow items.\n\n```html\n<ids-layout-flex direction=\"column\" height=\"300px\">\n  <ids-layout-flex-item grow=\"1\">\n    <div>Item 1</div>\n  </ids-layout-flex-item>\n  <ids-layout-flex-item>\n    <div>Item 2</div>\n  </ids-layout-flex-item>\n</ids-layout-flex>\n```\n\nStandalone CSS Example\n\n```html\n<div class=\"ids-layout-flex ids-layout-flex-gap-8\">\n  <div class=\"ids-layout-flex-item\">\n    <span class=\"ids-text\">test</span>\n  </div>\n  <div class=\"ids-layout-flex-item\">\n    <span class=\"ids-text\">test</span>\n  </div>\n  <div class=\"ids-layout-flex-item\">\n    <span class=\"ids-text\">test</span>\n  </div>\n</div>\n```\n\n## Settings and Attributes (IdsLayoutFlex)\n\n- `alignContent` {string} sets the align-content setting, value can be use: `flex-start`, `flex-end`, `center`, `space-between`, `space-around`, `space-evenly`, `stretch`, `start`, `end`, `baseline`.\n- `alignItems` {string} sets the align-items setting, value can be use: `start`, `end`, `flex-start`, `flex-end`, `center`, `center-inputs`, `baseline`, `stretch`. The `center-inputs` value vertically centers shorter controls (like `ids-checkbox`) against the input baseline in rows that mix input heights — see the \"Aligning Mixed-Height Controls\" section above.\n- `direction` {string} sets the direction setting, value can be use: `row`, `row-reverse`, `column`, `column-reverse`.\n- `display` {string} sets the display setting, value can be use: `flex`, `inline-flex`.\n- `gap` {string|number} sets the gap apply same for both horizontal and vertical sides, value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40.\n- `gapX` {string|number} sets the horizontal gap, value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40.\n- `gapY` {string|number} sets the vertical gap, value can be use: 0, 1, 2, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40.\n- `height` {string} sets the height of the flex container (e.g.'300px'). This is especially important when using column direction with flex-grow items.\n- `hidden` {boolean} Hides the element from display.\n- `justifyContent` {string} sets the justify-content setting, value can be use: `start`, `end`, `flex-start`, `flex-end`, `center`, `left`, `right`, `space-between`, `space-around`, `space-evenly`.\n- `wrap` {string} sets the wrap setting, value can be use: `nowrap`, `wrap`, `wrap-reverse`.\n\n## Settings and Attributes (IdsLayoutFlexItem)\n\n- `alignSelf` {string} sets the align-self setting, value can be use: `auto`, `baseline`, `center`, `stretch`, `flex-start`, `flex-end`.\n- `flex` {string|number} sets the flex setting, value can be used: 0-24\n- `grow` {string|number} sets the grow setting, value can be used: 0, 1\n- `minWidth` {string} sets the minimum width of the flex item (e.g. `'120px'`, `'10rem'`). This is especially useful when using `flex` with `wrap` to prevent items from shrinking below a usable size and to ensure proper wrapping behavior.\n- `shrink` {string|number} sets the shrink setting, value can be used: 0, 1\n\n## Keyboard Guidelines\n\nA layout flex is not on its own keyboard focusable and has no keyboard interaction.\n\n## Responsive Guidelines\n\n- A Layout Flex will flow automatically with the screen size.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- New concept in 5.x\n\n## Regional Considerations\n\nThe entire flex will flip direction in Right-To-Left languages.\n"}},{"name":"ids-layout-grid-cell","attributes":[{"name":"close-button","values":[]},{"name":"#auto-fit-observer","values":[]},{"name":"#parent-grid-observer","values":[]},{"name":"#slot-element","values":[]},{"name":"align-content","description":"Get the grid align-content setting","values":[]},{"name":"col-end","description":"Get col-end attribute","values":[]},{"name":"col-end-xs","description":"Get col-end-xs attribute","values":[]},{"name":"col-end-sm","description":"Get col-end-sm attribute","values":[]},{"name":"col-end-md","description":"Get col-end-md attribute","values":[]},{"name":"col-end-lg","description":"Get col-end-lg attribute","values":[]},{"name":"col-end-xl","description":"Get col-end-xl attribute","values":[]},{"name":"col-end-xxl","description":"Get col-end-xxl attribute","values":[]},{"name":"col-span","description":"Get col-span attribute","values":[]},{"name":"col-span-xs","description":"Get col-span-xs attribute","values":[]},{"name":"col-span-sm","description":"Get col-span-sm attribute","values":[]},{"name":"col-span-md","description":"Get col-span-md attribute","values":[]},{"name":"col-span-lg","description":"Get col-span-lg attribute","values":[]},{"name":"col-span-xl","description":"Get col-span-xl attribute","values":[]},{"name":"col-span-xxl","description":"Get col-span-xxl attribute","values":[]},{"name":"col-start","description":"Get the col-start attribute","values":[]},{"name":"col-start-xs","description":"Get the col-start-xs attribute","values":[]},{"name":"col-start-sm","description":"Get the col-start-sm attribute","values":[]},{"name":"col-start-md","description":"Get the col-start-md attribute","values":[]},{"name":"col-start-lg","description":"Get the col-start-lg attribute","values":[]},{"name":"col-start-xl","description":"Get the col-start-xl attribute","values":[]},{"name":"col-start-xxl","description":"Get the col-start-xxl attribute","values":[]},{"name":"editable","description":"Get the editable attribute","values":[]},{"name":"fill","description":"Get the fill attribute","values":[]},{"name":"height","description":"Get the height attribute","values":[]},{"name":"hide","description":"Get the hide attribute","values":[]},{"name":"justify-content","description":"Get the grid justify setting","values":[]},{"name":"min-height","description":"Get the minHeight attribute","values":[]},{"name":"order","description":"Get the order attribute","values":[]},{"name":"order-xs","description":"Get the order-xs attribute","values":[]},{"name":"order-sm","description":"Get the order-sm attribute","values":[]},{"name":"order-md","description":"Get the order-md attribute","values":[]},{"name":"order-lg","description":"Get the order-lg attribute","values":[]},{"name":"order-xl","description":"Get the order-xl attribute","values":[]},{"name":"order-xxl","description":"Get the order-xxl attribute","values":[]},{"name":"padding","description":"Get the padding attribute","values":[]},{"name":"row-span","description":"Get the row-span attribute","values":[]},{"name":"row-span-xs","description":"Get the row-span attribute","values":[]},{"name":"row-span-sm","description":"Get the row-span-sm attribute","values":[]},{"name":"row-span-md","description":"Get the row-span-md attribute","values":[]},{"name":"row-span-lg","description":"Get the row-span-lg attribute","values":[]},{"name":"row-span-xl","description":"Get the row-span-xl attribute","values":[]},{"name":"row-span-xxl","description":"Get the row-span-xxl attribute","values":[]},{"name":"sticky","description":"Get the sticky attribute","values":[]},{"name":"sticky-position","description":"Get the sticky-position attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-layout-grid\n\n## Description\n\nThe Ids Layout Grid is comprised of 2 web components, IdsLayoutGrid and IdsLayoutGridCell. IdsLayoutGrid is the parent grid container in which the columns and rows are defined. IdsLayoutGridCell is a child element of Layout Grid. These elements contain the contents of your UI and can span multi columns or rows and be positioned along the tracks of the Layout Grid. A Layout Grid can also be nested inside a Layout Grid Cell.\n\n## Use Cases\n\n- Use to create full page layouts (i.e Header, Sidebar, Main Content, Footer).\n- Use to layout complex forms\n- Use to layout a list of IdsCards\n\n## Attributes\n\n### IdsLayoutGrid\n- **AutoFit**: Automatically adjust the width or height of a cell, row, or column to fit its contents.\n- **AutoFill**: Automatically fill a range of cells with a pattern or sequence.\n- **AlignItems**: Sets the vertical axis (align-items property) of the grid: `[null, start, end, center, center-inputs, stretch]`.\n- **Cols**: Specifies the number of columns by default in the grid.\n- **ColsXs**: Specifies the number of columns to use on extra small screens.\n- **ColsSm**: Specifies the number of columns to use on small screens.\n- **ColsMd**: Specifies the number of columns to use on medium screens.\n- **ColsLg**: Specifies the number of columns to use on large screens.\n- **ColsXl**: Specifies the number of columns to use on extra large screens.\n- **ColsXxl**: Specifies the number of columns to use on extra-extra large screens.\n- **Flow**: Specifies how the items in a grid should wrap or overflow when there isn't enough space.\n- **Gap**: Specifies the size of the gap between cells in a grid. If not assigned defaults to `md`. Valid values are `none, sm, md, lg, xl`\n- **RowGap**: Specifies the size of the row gap between cells in a grid. Valid values are `none, sm, md, lg, xl`\n- **ColGap**: Specifies the size of the column gap between cells in a grid. Valid values are `none, sm, md, lg, xl`\n- **Height**: Specifies the overall height of the grid.\n- **JustifyContent**: Specifies how to align the items in a grid along the main axis. If not assigned defaults to `start`.\n- **MinColWidth**: Specifies the minimum width of a column in a grid.\n- **MaxColWidth**: Specifies the maximum width of a column in a grid.\n- **MinRowHeight**: Specifies the minimum height of a row in a grid.\n- **MaxRowHeight**: Specifies the maximum height of a row in a grid.\n- **Margin**: Specifies the amount of space between a grid and its outer border.\n- **MarginY**: Specifies the amount of vertical space between a grid and its outer border.\n- **MaxWidth**: Specifies the maximum width of a grid and its outer border. Allows for setting the max-width attribute with predefined values (see Breakpoints) or custom values that end with 'px', providing flexibility for styling and dynamic updates.\n- **Overflow**: Controls how content that overflows the grid container is handled. Valid values are `visible`, `hidden`, `scroll`, `auto`, `clip`, `inherit`, `initial`, `unset`.\n- **Rows**: Specifies the number of rows by default in the grid.\n- **RowsXs**: Specifies the number of rows to use on extra small screens.\n- **RowsSm**: Specifies the number of rows to use on small screens.\n- **RowsMd**: Specifies the number of rows to use on medium screens.\n- **RowsLg**: Specifies the number of rows to use on large screens.\n- **RowsXl**: Specifies the number of rows to use on extra large screens.\n- **RowsXxl**: Specifies the number of rows to use on extra-extra large screens.\n- **RowHeight**: Specifies the height of a row in the grid.\n- **TemplateRows**: Specifies the grid-template-rows of the grid.\n- **Padding**: Specifies the amount of space between a grid content and its inner border.\n- **PaddingX**: Specifies the amount of horizontal space between a grid content and its inner border.\n- **PaddingY**: Specifies the amount of vertical space between a grid and its inner border.\n\n### IdsLayoutGridCell\n- **ColSpan**: Specifies the number of columns a cell should span by default in a grid.\n- **ColSpanXs**: Specifies the number of columns a cell should span on extra small screens.\n- **ColSpanSm**: Specifies the number of columns a cell should span on small screens.\n- **ColSpanMd**: Specifies the number of columns a cell should span on medium screens.\n- **ColSpanLg**: Specifies the number of columns a cell should span on large screens.\n- **ColSpanXl**: Specifies the number of columns a cell should span on extra large screens.\n- **ColSpanXxl**: Specifies the number of columns a cell should span on extra-extra large screens.\n- **ColStart**: Specifies the starting column for a cell by default in a grid.\n- **ColStartXs**: Specifies the starting column for a cell on extra small screens.\n- **ColStartSm**: Specifies the starting column for a cell on small screens.\n- **ColStartMd**: Specifies the starting column for a cell on medium screens.\n- **ColStartLg**: Specifies the starting column for a cell on large screens.\n- **ColStartXl**: Specifies the starting column for a cell on extra large screens.\n- **ColStartXxl**: Specifies the starting column for a cell on extra-extra large screens.\n- **ColEnd**: Specifies the ending column for a cell by default in a grid.\n- **ColEndXs**: Specifies the ending column for a cell on extra small screens.\n- **ColEndSm**: Specifies the ending column for a cell on small screens.\n- **ColEndMd**: Specifies the ending column for a cell on medium screens.\n- **ColEndLg**: Specifies the ending column for a cell on large screens.\n- **ColEndXl**: Specifies the ending column for a cell on extra large screens.\n- **ColEndXxl**: Specifies the ending column for a cell on extra-extra large screens.\n- **Editable**: Specifies whether the content of an element can be edited by the user.\n- **Fill**: Specifies whether an element should fill the available space in its container.\n- **Height**: Specifies the height of an element. If no unit is specified in the attribute the value will default to px.\n- **Hide**: Sets or removes the `hide` attribute to control the visibility of the grid cell based on the specified breakpoint. Options are as follows: `xxl | xl | lg | md | sm | xs | always`. `always` Hides the grid cell regardless of the breakpoint.\n- **MinHeight**: Specifies the minimum height of an element. If no unit is specified in the attribute the value will default to px.\n- **Order**: Specifies the order in which an element should appear by default in a container.\n- **OrderXs**: Specifies the order in which an element should appear on extra small screens.\n- **OrderSm**: Specifies the order in which an element should appear on small screens.\n- **OrderMd**: Specifies the order in which an element should appear on medium screens.\n- **OrderLg**: Specifies the order in which an element should appear on large screens.\n- **OrderXl**: Specifies the order in which an element should appear on extra large screens.\n- **OrderXxl**: Specifies the order in which an element should appear on extra-extra large screens.\n- **RowSpan**: Specifies the number of rows a cell should span by default in a grid.\n- **RowSpanXs**: Specifies the number of rows a cell should span on extra small screens.\n- **RowSpanSm**: Specifies the number of rows a cell should span on small screens.\n- **RowSpanMd**: Specifies the number of rows a cell should span on medium screens.\n- **RowSpanLg**: Specifies the number of rows a cell should span on large screens.\n- **RowSpanXl**: Specifies the number of rows a cell should span on extra large screens.\n- **RowSpanXxl**: Specifies the number of rows a cell should span on extra-extra large screens.\n- **Sticky**: Specifies whether an element should be \"stuck\" to a viewport\n\n## Responsive Breakpoints\n\n- **XS**: 320-575px\n- **SM**: 576-767px\n- **MD**: 768-927px\n- **LG**: 928-1183px\n- **XL**: 1184-2463px\n- **XXL**: 2464px+\n\n## Enabling Container Queries\n\nThe IdsLayoutGrid component supports a flexible container query setup via the enableContainer attribute. This feature allows you to decide whether the layout grid itself or its direct parent should act as the container for responsive queries. Based on the setup, you can control the grid’s behavior and cell configurations.\n\n### Overview\n- `enableContainer` Attribute: When this attribute is set on IdsLayoutGrid, it enables container query responsiveness.\n- `container-queries` Attribute on Parent: When the direct parent of IdsLayoutGrid has the `container-queries` attribute, it becomes the container, giving you additional flexibility.\n\n### Configuration Options\nThere are two ways to configure the container queries, each offering different responsive behaviors:\n\n#### `enableContainer` Only (Grid is the Container)\n\n- When `enableContainer` is set on IdsLayoutGrid without a `container-queries` attribute on the parent, the grid component itself becomes the container.\n- You can define responsive column spans using `col-span-{size}=\"\"` attributes on the `ids-layout-grid-cell` elements.\n- This configuration is best when you want the grid to resize based on its own dimensions, rather than its parent’s or when using a 12 column grid.\n\n```html\n<ids-layout-grid cols=\"12\" enable-container>\n  <ids-layout-grid-cell col-span=\"12\" col-span-sm=\"6\" col-span-lg=\"4\" height=\"200px\" fill></ids-layout-grid-cell>\n  <!-- Additional cells here -->\n</ids-layout-grid>\n```\n\n#### `enableContainer` with `container-queries` on Parent\n\n- When `enableContainer` is set on IdsLayoutGrid and its direct parent has the `container-queries` attribute, the parent becomes the container.\n- In this configuration, you can use `cols-{size}=\"\"` on `ids-layout-grid` to control the grid’s column structure based on the parent’s size.\n\n```html\n<ids-container id=\"my-container\" title=\"Responsive Container\" container-queries>\n  <ids-layout-grid cols=\"1\" cols-sm=\"3\" cols-lg=\"4\" enable-container>\n    <ids-layout-grid-cell fill></ids-layout-grid-cell>\n    <!-- Additional cells here -->\n  </ids-layout-grid>\n</ids-container>\n```\n\n```html\n<ids-splitter-pane container-queries>\n  <ids-layout-grid cols=\"1\" cols-sm=\"3\" cols-lg=\"4\" enable-container>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n  </ids-layout-grid>\n</ids-splitter-pane>\n```\n\n## Using Responsive Nested Grids Inside a Splitter\n\nWhen using layout grids inside an `ids-splitter-pane`, you can create deeply nested, responsive grid structures that adapt to the splitter pane's width. This is particularly useful for building complex forms or layouts that need to reflow as the splitter is resized.\n\n### Key Principles\n\n- **Enable Container Queries on the Splitter Pane**: Add the `container-queries` attribute to the `ids-splitter-pane` to make it act as the container query context.\n- **Enable Container Queries on Nested Grids**: Add the `enable-container` attribute to each `ids-layout-grid` that needs to be responsive within the splitter.\n- **Use Col-Span to Control Full-Width Cells**: When nesting grids, use `col-span` and responsive variants (like `col-span-md`) to ensure the grid cell spans the full width of its parent grid. This is crucial for nested grids to properly fill their container.\n- **Responsive Columns**: Use responsive column attributes (`cols-md`, `cols-lg`, etc.) on nested grids to control how many columns appear at different container sizes.\n\n### Example: Nested Responsive Grids in a Splitter\n\n```html\n<ids-splitter>\n  <ids-splitter-pane container-queries>\n    <!-- Parent grid with responsive columns -->\n    <ids-layout-grid cols=\"1\" cols-md=\"2\" enable-container>\n      <ids-layout-grid-cell>\n        <ids-input label=\"Field 1\"></ids-input>\n      </ids-layout-grid-cell>\n      <ids-layout-grid-cell>\n        <ids-input label=\"Field 2\"></ids-input>\n      </ids-layout-grid-cell>\n\n      <!-- Cell that spans full width at medium breakpoint to contain nested grid -->\n      <ids-layout-grid-cell col-span=\"1\" col-span-md=\"2\">\n        <ids-input label=\"Field 3\"></ids-input>\n\n        <!-- Nested grid that will be responsive within the parent cell -->\n        <ids-layout-grid cols=\"1\" cols-md=\"2\" enable-container>\n          <ids-layout-grid-cell>\n            <ids-input label=\"Nested Field 1\"></ids-input>\n          </ids-layout-grid-cell>\n          <ids-layout-grid-cell>\n            <ids-input label=\"Nested Field 2\"></ids-input>\n          </ids-layout-grid-cell>\n\n          <!-- Further nesting with full-width cell -->\n          <ids-layout-grid-cell col-span=\"1\" col-span-md=\"2\">\n            <ids-input label=\"Nested Field 3\"></ids-input>\n\n            <!-- Third level nested grid -->\n            <ids-layout-grid cols=\"1\" cols-md=\"2\" enable-container>\n              <ids-layout-grid-cell>\n                <ids-input label=\"Deep Nested Field 1\"></ids-input>\n              </ids-layout-grid-cell>\n              <ids-layout-grid-cell>\n                <ids-input label=\"Deep Nested Field 2\"></ids-input>\n              </ids-layout-grid-cell>\n            </ids-layout-grid>\n          </ids-layout-grid-cell>\n        </ids-layout-grid>\n      </ids-layout-grid-cell>\n    </ids-layout-grid>\n  </ids-splitter-pane>\n</ids-splitter>\n```\n\n### Important Notes\n\n- **Col-Span for Nested Grids**: When placing a nested grid inside a cell, that cell should typically use `col-span-md=\"2\"` (or the appropriate number) to span the full width of the parent grid at the medium breakpoint. This ensures the nested grid has enough space to properly display its columns.\n- **Multiple Nesting Levels**: You can nest grids multiple levels deep. Each nested grid should have `enable-container` and can define its own responsive column structure using `cols-md`, `cols-lg`, etc.\n- **Responsive Behavior**: As the splitter pane is resized, the nested grids will automatically adjust their column count based on the container width. For example, a grid with `cols=\"1\" cols-md=\"2\"` will show 1 column when narrow and 2 columns when wider than the medium breakpoint.\n- **Use with Other Components**: This pattern works well inside accordions, tabs, and other components that may be placed within a splitter pane. See the `splitter-responsive.html` demo for a complete example.\n\n**Example Usage**\n## Features (With Code Examples)\n\n```html\n<ids-layout-grid cols=\"2\" cols-lg=\"4\" cols-xl=\"6\" cols-xxl=\"8\">\n```\n\nThis `<ids-layout-grid>` element has four attributes (cols, cols-lg, cols-xl, and cols-xxl) that are used to define the number of columns in the grid layout at different breakpoint sizes. The `cols` attribute sets the number of columns in the grid layout by default. The `cols-lg` attribute sets the number of columns in the grid layout at the lg breakpoint size (large devices/screen sizes). The `cols-xl` attribute sets the number of columns in the grid layout at the xl breakpoint size (extra-large devices/screen sizes).\n\nFinally, the `cols-xxl` attribute sets the number of columns in the grid layout at the xxl breakpoint size (extra-extra-large devices/screen sizes). Overall, this code is defining a grid layout that will display two columns by default and adjust the number of columns displayed at different breakpoint sizes for different device types.\n\n---\n\n```html\n<ids-layout-grid-cell col-span=\"2\" col-span-lg=\"4\">\n```\n\nThis `<ids-layout-grid-cell>` element is used to define a cell within a grid layout. It has two attributes (`col-span` and `col-span-lg`) that define the number of columns a cell should span at different breakpoint sizes. The `col-span` attribute sets the number of columns that the cell should span by default. The `col-span-lg` attribute sets the number of columns that the cell should span at the lg breakpoint size (large devices) and its value is set to 4. Overall, this code is defining a cell within a grid layout that will span two columns by default and adjust the number of columns it spans at the lg breakpoint size.\n\n---\n\n```html\n<ids-layout-grid\n    auto-fit\n    min-col-width=\"100px\"\n    max-col-width=\"1fr\"\n>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nFor AutoFit layout the grid cells in this example have a min/max value of 100px and 1fr respectively. The cells will take up as much space as is available until they reach the threshold of the MinColWidth, then they will automatically shift until they reach that threshold again. This removes the need for media queries in many cases.\n\n---\n\n```html\n<ids-layout-grid cols=\"4\">\n   <ids-layout-grid-cell col-span=\"3\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell row-span=\"2\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nAn Ids Layout Grid with a custom number of columns or rows. The example above shows a 4 column grid where the first cell spans 3 columns and the 3rd cell spans 2 rows.\n\n---\n\n```html\n<ids-layout-grid\n    id=\"eight-column-grid\"\n    cols=\"8\"\n    padding-x=\"md\"\n    justify-content=\"center\"\n    max-width=\"lg\"\n    margin=\"auto\"\n>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nAbove is an example of a contained and centered grid. The max-width attribute is set to \"lg\", which represents a predefined breakpoint value for the maximum width of the grid. This controls how wide the grid can become. The margin attribute is set to \"auto\" to horizontally center the entire grid on the page by applying equal left and right margins.\n\n*Note*:\nThe available sizes for maxWidth are based on the current predefined breakpoint sizes. These breakpoint sizes provide convenient options for setting the maximum width of the grid, ensuring responsiveness and compatibility with different screen sizes. However, the maxWidth attribute also allows users to specify a custom width if needed, giving them flexibility in defining the maximum width according to their specific requirements. While custom widths can be used, it is generally recommended to utilize the predefined breakpoint sizes whenever possible for consistency and responsiveness across different devices and viewports.\n\n---\n\nExamples of grid with responsive col-spans\n\n```html\n<ids-layout-grid\n    cols=\"12\"\n>\n  <ids-layout-grid-cell col-span=\"12\" col-span-sm=\"6\" fill>\n    <ids-text font-size=\"12\">2 Cols</ids-text>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell col-span=\"12\" col-span-sm=\"6\" col-span-md=\"4\" fill>\n    <ids-text font-size=\"12\">2 Cols</ids-text>\n  </ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\n--\n\nNested Grid. An IdsLayoutGrid component can be nested inside an IdsLayoutGridCell.\n\n```html\n<ids-layout-grid cols=\"4\">\n   <ids-layout-grid-cell col-span=\"3\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell row-span=\"2\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill>\n      <ids-layout-grid auto>\n        <ids-layout-grid-cell fill></ids-layout-grid-cell>\n        <ids-layout-grid-cell fill></ids-layout-grid-cell>\n        <ids-layout-grid-cell fill></ids-layout-grid-cell>\n      </ids-layout-grid>\n   </ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nStandalone CSS Example\n\n```html\n<div class=\"ids-layout-grid ids-layout-grid-cols-3\">\n  <div class=\"ids-layout-grid-cell ids-layout-grid-col-span-2 fill\"><ids-text font-size=\"12\">A</ids-text></div>\n  <div class=\"ids-layout-grid-cell fill\"><ids-text font-size=\"12\">B</ids-text></div>\n</div>\n```\n\n--\n\n## Aligning Mixed-Height Controls (`align-items=\"center-inputs\"`)\n\nUse `align-items=\"center-inputs\"` on an `ids-layout-grid` when a row mixes form controls that have different intrinsic heights (inputs, date pickers, time pickers, textareas, dropdowns) with controls that are shorter (like `ids-checkbox`). The grid will apply `align-items: start` to its cells and raise the checkbox onto the baseline of the surrounding input fields, so the checkbox's interactive target visually lines up with the middle of the input controls.\n\n```html\n<ids-layout-grid cols=\"4\" gap=\"md\" align-items=\"center-inputs\">\n  <ids-layout-grid-cell>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell>\n    <ids-time-picker label=\"Time picker\" placeholder=\"Default\" no-margins></ids-time-picker>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell>\n    <ids-checkbox label=\"Subscribe\" label-break=\"shrink-value\"></ids-checkbox>\n  </ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nThe grid automatically detects the `field-height` or `compact` attribute on its descendant inputs and reflects the detected size onto itself. The CSS variables that drive the checkbox offset (`--ids-checkbox-inline-min-height`, `--ids-checkbox-margin-top`) are then set for that field height. Supported field heights are `xs` (default when a child is `compact`), `sm`, `md` (default), and `lg`.\n\nSee the `example-align-center-inputs.html` demo for each field height in action.\n\n## Keyboard Guidelines\n\nA layout grid is not on its own keyboard focusable and has no keyboard interaction.\n\n## Responsive Guidelines\n\n- A Layout Grid set to auto-fit or auto-fill will flow automatically with the screen size.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- New concept in 4.x\n\n**4.x to 5.x**\n\n- The Layout grid replaces the former grid entirely. Apply the new markup.\n- Using a 8pt style grid https://builttoadapt.io/intro-to-the-8-point-grid-system-d2573cde8632\n- Markup has changed to a custom element `<ids-layout-grid></ids-layout-grid>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Regional Considerations\n\nThe entire grid will flip direction in Right-To-Left languages.\n"}},{"name":"ids-layout-grid-common","description":{"kind":"markdown","value":"# ids-layout-grid\n\n## Description\n\nThe Ids Layout Grid is comprised of 2 web components, IdsLayoutGrid and IdsLayoutGridCell. IdsLayoutGrid is the parent grid container in which the columns and rows are defined. IdsLayoutGridCell is a child element of Layout Grid. These elements contain the contents of your UI and can span multi columns or rows and be positioned along the tracks of the Layout Grid. A Layout Grid can also be nested inside a Layout Grid Cell.\n\n## Use Cases\n\n- Use to create full page layouts (i.e Header, Sidebar, Main Content, Footer).\n- Use to layout complex forms\n- Use to layout a list of IdsCards\n\n## Attributes\n\n### IdsLayoutGrid\n- **AutoFit**: Automatically adjust the width or height of a cell, row, or column to fit its contents.\n- **AutoFill**: Automatically fill a range of cells with a pattern or sequence.\n- **AlignItems**: Sets the vertical axis (align-items property) of the grid: `[null, start, end, center, center-inputs, stretch]`.\n- **Cols**: Specifies the number of columns by default in the grid.\n- **ColsXs**: Specifies the number of columns to use on extra small screens.\n- **ColsSm**: Specifies the number of columns to use on small screens.\n- **ColsMd**: Specifies the number of columns to use on medium screens.\n- **ColsLg**: Specifies the number of columns to use on large screens.\n- **ColsXl**: Specifies the number of columns to use on extra large screens.\n- **ColsXxl**: Specifies the number of columns to use on extra-extra large screens.\n- **Flow**: Specifies how the items in a grid should wrap or overflow when there isn't enough space.\n- **Gap**: Specifies the size of the gap between cells in a grid. If not assigned defaults to `md`. Valid values are `none, sm, md, lg, xl`\n- **RowGap**: Specifies the size of the row gap between cells in a grid. Valid values are `none, sm, md, lg, xl`\n- **ColGap**: Specifies the size of the column gap between cells in a grid. Valid values are `none, sm, md, lg, xl`\n- **Height**: Specifies the overall height of the grid.\n- **JustifyContent**: Specifies how to align the items in a grid along the main axis. If not assigned defaults to `start`.\n- **MinColWidth**: Specifies the minimum width of a column in a grid.\n- **MaxColWidth**: Specifies the maximum width of a column in a grid.\n- **MinRowHeight**: Specifies the minimum height of a row in a grid.\n- **MaxRowHeight**: Specifies the maximum height of a row in a grid.\n- **Margin**: Specifies the amount of space between a grid and its outer border.\n- **MarginY**: Specifies the amount of vertical space between a grid and its outer border.\n- **MaxWidth**: Specifies the maximum width of a grid and its outer border. Allows for setting the max-width attribute with predefined values (see Breakpoints) or custom values that end with 'px', providing flexibility for styling and dynamic updates.\n- **Overflow**: Controls how content that overflows the grid container is handled. Valid values are `visible`, `hidden`, `scroll`, `auto`, `clip`, `inherit`, `initial`, `unset`.\n- **Rows**: Specifies the number of rows by default in the grid.\n- **RowsXs**: Specifies the number of rows to use on extra small screens.\n- **RowsSm**: Specifies the number of rows to use on small screens.\n- **RowsMd**: Specifies the number of rows to use on medium screens.\n- **RowsLg**: Specifies the number of rows to use on large screens.\n- **RowsXl**: Specifies the number of rows to use on extra large screens.\n- **RowsXxl**: Specifies the number of rows to use on extra-extra large screens.\n- **RowHeight**: Specifies the height of a row in the grid.\n- **TemplateRows**: Specifies the grid-template-rows of the grid.\n- **Padding**: Specifies the amount of space between a grid content and its inner border.\n- **PaddingX**: Specifies the amount of horizontal space between a grid content and its inner border.\n- **PaddingY**: Specifies the amount of vertical space between a grid and its inner border.\n\n### IdsLayoutGridCell\n- **ColSpan**: Specifies the number of columns a cell should span by default in a grid.\n- **ColSpanXs**: Specifies the number of columns a cell should span on extra small screens.\n- **ColSpanSm**: Specifies the number of columns a cell should span on small screens.\n- **ColSpanMd**: Specifies the number of columns a cell should span on medium screens.\n- **ColSpanLg**: Specifies the number of columns a cell should span on large screens.\n- **ColSpanXl**: Specifies the number of columns a cell should span on extra large screens.\n- **ColSpanXxl**: Specifies the number of columns a cell should span on extra-extra large screens.\n- **ColStart**: Specifies the starting column for a cell by default in a grid.\n- **ColStartXs**: Specifies the starting column for a cell on extra small screens.\n- **ColStartSm**: Specifies the starting column for a cell on small screens.\n- **ColStartMd**: Specifies the starting column for a cell on medium screens.\n- **ColStartLg**: Specifies the starting column for a cell on large screens.\n- **ColStartXl**: Specifies the starting column for a cell on extra large screens.\n- **ColStartXxl**: Specifies the starting column for a cell on extra-extra large screens.\n- **ColEnd**: Specifies the ending column for a cell by default in a grid.\n- **ColEndXs**: Specifies the ending column for a cell on extra small screens.\n- **ColEndSm**: Specifies the ending column for a cell on small screens.\n- **ColEndMd**: Specifies the ending column for a cell on medium screens.\n- **ColEndLg**: Specifies the ending column for a cell on large screens.\n- **ColEndXl**: Specifies the ending column for a cell on extra large screens.\n- **ColEndXxl**: Specifies the ending column for a cell on extra-extra large screens.\n- **Editable**: Specifies whether the content of an element can be edited by the user.\n- **Fill**: Specifies whether an element should fill the available space in its container.\n- **Height**: Specifies the height of an element. If no unit is specified in the attribute the value will default to px.\n- **Hide**: Sets or removes the `hide` attribute to control the visibility of the grid cell based on the specified breakpoint. Options are as follows: `xxl | xl | lg | md | sm | xs | always`. `always` Hides the grid cell regardless of the breakpoint.\n- **MinHeight**: Specifies the minimum height of an element. If no unit is specified in the attribute the value will default to px.\n- **Order**: Specifies the order in which an element should appear by default in a container.\n- **OrderXs**: Specifies the order in which an element should appear on extra small screens.\n- **OrderSm**: Specifies the order in which an element should appear on small screens.\n- **OrderMd**: Specifies the order in which an element should appear on medium screens.\n- **OrderLg**: Specifies the order in which an element should appear on large screens.\n- **OrderXl**: Specifies the order in which an element should appear on extra large screens.\n- **OrderXxl**: Specifies the order in which an element should appear on extra-extra large screens.\n- **RowSpan**: Specifies the number of rows a cell should span by default in a grid.\n- **RowSpanXs**: Specifies the number of rows a cell should span on extra small screens.\n- **RowSpanSm**: Specifies the number of rows a cell should span on small screens.\n- **RowSpanMd**: Specifies the number of rows a cell should span on medium screens.\n- **RowSpanLg**: Specifies the number of rows a cell should span on large screens.\n- **RowSpanXl**: Specifies the number of rows a cell should span on extra large screens.\n- **RowSpanXxl**: Specifies the number of rows a cell should span on extra-extra large screens.\n- **Sticky**: Specifies whether an element should be \"stuck\" to a viewport\n\n## Responsive Breakpoints\n\n- **XS**: 320-575px\n- **SM**: 576-767px\n- **MD**: 768-927px\n- **LG**: 928-1183px\n- **XL**: 1184-2463px\n- **XXL**: 2464px+\n\n## Enabling Container Queries\n\nThe IdsLayoutGrid component supports a flexible container query setup via the enableContainer attribute. This feature allows you to decide whether the layout grid itself or its direct parent should act as the container for responsive queries. Based on the setup, you can control the grid’s behavior and cell configurations.\n\n### Overview\n- `enableContainer` Attribute: When this attribute is set on IdsLayoutGrid, it enables container query responsiveness.\n- `container-queries` Attribute on Parent: When the direct parent of IdsLayoutGrid has the `container-queries` attribute, it becomes the container, giving you additional flexibility.\n\n### Configuration Options\nThere are two ways to configure the container queries, each offering different responsive behaviors:\n\n#### `enableContainer` Only (Grid is the Container)\n\n- When `enableContainer` is set on IdsLayoutGrid without a `container-queries` attribute on the parent, the grid component itself becomes the container.\n- You can define responsive column spans using `col-span-{size}=\"\"` attributes on the `ids-layout-grid-cell` elements.\n- This configuration is best when you want the grid to resize based on its own dimensions, rather than its parent’s or when using a 12 column grid.\n\n```html\n<ids-layout-grid cols=\"12\" enable-container>\n  <ids-layout-grid-cell col-span=\"12\" col-span-sm=\"6\" col-span-lg=\"4\" height=\"200px\" fill></ids-layout-grid-cell>\n  <!-- Additional cells here -->\n</ids-layout-grid>\n```\n\n#### `enableContainer` with `container-queries` on Parent\n\n- When `enableContainer` is set on IdsLayoutGrid and its direct parent has the `container-queries` attribute, the parent becomes the container.\n- In this configuration, you can use `cols-{size}=\"\"` on `ids-layout-grid` to control the grid’s column structure based on the parent’s size.\n\n```html\n<ids-container id=\"my-container\" title=\"Responsive Container\" container-queries>\n  <ids-layout-grid cols=\"1\" cols-sm=\"3\" cols-lg=\"4\" enable-container>\n    <ids-layout-grid-cell fill></ids-layout-grid-cell>\n    <!-- Additional cells here -->\n  </ids-layout-grid>\n</ids-container>\n```\n\n```html\n<ids-splitter-pane container-queries>\n  <ids-layout-grid cols=\"1\" cols-sm=\"3\" cols-lg=\"4\" enable-container>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n  </ids-layout-grid>\n</ids-splitter-pane>\n```\n\n## Using Responsive Nested Grids Inside a Splitter\n\nWhen using layout grids inside an `ids-splitter-pane`, you can create deeply nested, responsive grid structures that adapt to the splitter pane's width. This is particularly useful for building complex forms or layouts that need to reflow as the splitter is resized.\n\n### Key Principles\n\n- **Enable Container Queries on the Splitter Pane**: Add the `container-queries` attribute to the `ids-splitter-pane` to make it act as the container query context.\n- **Enable Container Queries on Nested Grids**: Add the `enable-container` attribute to each `ids-layout-grid` that needs to be responsive within the splitter.\n- **Use Col-Span to Control Full-Width Cells**: When nesting grids, use `col-span` and responsive variants (like `col-span-md`) to ensure the grid cell spans the full width of its parent grid. This is crucial for nested grids to properly fill their container.\n- **Responsive Columns**: Use responsive column attributes (`cols-md`, `cols-lg`, etc.) on nested grids to control how many columns appear at different container sizes.\n\n### Example: Nested Responsive Grids in a Splitter\n\n```html\n<ids-splitter>\n  <ids-splitter-pane container-queries>\n    <!-- Parent grid with responsive columns -->\n    <ids-layout-grid cols=\"1\" cols-md=\"2\" enable-container>\n      <ids-layout-grid-cell>\n        <ids-input label=\"Field 1\"></ids-input>\n      </ids-layout-grid-cell>\n      <ids-layout-grid-cell>\n        <ids-input label=\"Field 2\"></ids-input>\n      </ids-layout-grid-cell>\n\n      <!-- Cell that spans full width at medium breakpoint to contain nested grid -->\n      <ids-layout-grid-cell col-span=\"1\" col-span-md=\"2\">\n        <ids-input label=\"Field 3\"></ids-input>\n\n        <!-- Nested grid that will be responsive within the parent cell -->\n        <ids-layout-grid cols=\"1\" cols-md=\"2\" enable-container>\n          <ids-layout-grid-cell>\n            <ids-input label=\"Nested Field 1\"></ids-input>\n          </ids-layout-grid-cell>\n          <ids-layout-grid-cell>\n            <ids-input label=\"Nested Field 2\"></ids-input>\n          </ids-layout-grid-cell>\n\n          <!-- Further nesting with full-width cell -->\n          <ids-layout-grid-cell col-span=\"1\" col-span-md=\"2\">\n            <ids-input label=\"Nested Field 3\"></ids-input>\n\n            <!-- Third level nested grid -->\n            <ids-layout-grid cols=\"1\" cols-md=\"2\" enable-container>\n              <ids-layout-grid-cell>\n                <ids-input label=\"Deep Nested Field 1\"></ids-input>\n              </ids-layout-grid-cell>\n              <ids-layout-grid-cell>\n                <ids-input label=\"Deep Nested Field 2\"></ids-input>\n              </ids-layout-grid-cell>\n            </ids-layout-grid>\n          </ids-layout-grid-cell>\n        </ids-layout-grid>\n      </ids-layout-grid-cell>\n    </ids-layout-grid>\n  </ids-splitter-pane>\n</ids-splitter>\n```\n\n### Important Notes\n\n- **Col-Span for Nested Grids**: When placing a nested grid inside a cell, that cell should typically use `col-span-md=\"2\"` (or the appropriate number) to span the full width of the parent grid at the medium breakpoint. This ensures the nested grid has enough space to properly display its columns.\n- **Multiple Nesting Levels**: You can nest grids multiple levels deep. Each nested grid should have `enable-container` and can define its own responsive column structure using `cols-md`, `cols-lg`, etc.\n- **Responsive Behavior**: As the splitter pane is resized, the nested grids will automatically adjust their column count based on the container width. For example, a grid with `cols=\"1\" cols-md=\"2\"` will show 1 column when narrow and 2 columns when wider than the medium breakpoint.\n- **Use with Other Components**: This pattern works well inside accordions, tabs, and other components that may be placed within a splitter pane. See the `splitter-responsive.html` demo for a complete example.\n\n**Example Usage**\n## Features (With Code Examples)\n\n```html\n<ids-layout-grid cols=\"2\" cols-lg=\"4\" cols-xl=\"6\" cols-xxl=\"8\">\n```\n\nThis `<ids-layout-grid>` element has four attributes (cols, cols-lg, cols-xl, and cols-xxl) that are used to define the number of columns in the grid layout at different breakpoint sizes. The `cols` attribute sets the number of columns in the grid layout by default. The `cols-lg` attribute sets the number of columns in the grid layout at the lg breakpoint size (large devices/screen sizes). The `cols-xl` attribute sets the number of columns in the grid layout at the xl breakpoint size (extra-large devices/screen sizes).\n\nFinally, the `cols-xxl` attribute sets the number of columns in the grid layout at the xxl breakpoint size (extra-extra-large devices/screen sizes). Overall, this code is defining a grid layout that will display two columns by default and adjust the number of columns displayed at different breakpoint sizes for different device types.\n\n---\n\n```html\n<ids-layout-grid-cell col-span=\"2\" col-span-lg=\"4\">\n```\n\nThis `<ids-layout-grid-cell>` element is used to define a cell within a grid layout. It has two attributes (`col-span` and `col-span-lg`) that define the number of columns a cell should span at different breakpoint sizes. The `col-span` attribute sets the number of columns that the cell should span by default. The `col-span-lg` attribute sets the number of columns that the cell should span at the lg breakpoint size (large devices) and its value is set to 4. Overall, this code is defining a cell within a grid layout that will span two columns by default and adjust the number of columns it spans at the lg breakpoint size.\n\n---\n\n```html\n<ids-layout-grid\n    auto-fit\n    min-col-width=\"100px\"\n    max-col-width=\"1fr\"\n>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nFor AutoFit layout the grid cells in this example have a min/max value of 100px and 1fr respectively. The cells will take up as much space as is available until they reach the threshold of the MinColWidth, then they will automatically shift until they reach that threshold again. This removes the need for media queries in many cases.\n\n---\n\n```html\n<ids-layout-grid cols=\"4\">\n   <ids-layout-grid-cell col-span=\"3\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell row-span=\"2\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nAn Ids Layout Grid with a custom number of columns or rows. The example above shows a 4 column grid where the first cell spans 3 columns and the 3rd cell spans 2 rows.\n\n---\n\n```html\n<ids-layout-grid\n    id=\"eight-column-grid\"\n    cols=\"8\"\n    padding-x=\"md\"\n    justify-content=\"center\"\n    max-width=\"lg\"\n    margin=\"auto\"\n>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nAbove is an example of a contained and centered grid. The max-width attribute is set to \"lg\", which represents a predefined breakpoint value for the maximum width of the grid. This controls how wide the grid can become. The margin attribute is set to \"auto\" to horizontally center the entire grid on the page by applying equal left and right margins.\n\n*Note*:\nThe available sizes for maxWidth are based on the current predefined breakpoint sizes. These breakpoint sizes provide convenient options for setting the maximum width of the grid, ensuring responsiveness and compatibility with different screen sizes. However, the maxWidth attribute also allows users to specify a custom width if needed, giving them flexibility in defining the maximum width according to their specific requirements. While custom widths can be used, it is generally recommended to utilize the predefined breakpoint sizes whenever possible for consistency and responsiveness across different devices and viewports.\n\n---\n\nExamples of grid with responsive col-spans\n\n```html\n<ids-layout-grid\n    cols=\"12\"\n>\n  <ids-layout-grid-cell col-span=\"12\" col-span-sm=\"6\" fill>\n    <ids-text font-size=\"12\">2 Cols</ids-text>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell col-span=\"12\" col-span-sm=\"6\" col-span-md=\"4\" fill>\n    <ids-text font-size=\"12\">2 Cols</ids-text>\n  </ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\n--\n\nNested Grid. An IdsLayoutGrid component can be nested inside an IdsLayoutGridCell.\n\n```html\n<ids-layout-grid cols=\"4\">\n   <ids-layout-grid-cell col-span=\"3\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell row-span=\"2\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill>\n      <ids-layout-grid auto>\n        <ids-layout-grid-cell fill></ids-layout-grid-cell>\n        <ids-layout-grid-cell fill></ids-layout-grid-cell>\n        <ids-layout-grid-cell fill></ids-layout-grid-cell>\n      </ids-layout-grid>\n   </ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nStandalone CSS Example\n\n```html\n<div class=\"ids-layout-grid ids-layout-grid-cols-3\">\n  <div class=\"ids-layout-grid-cell ids-layout-grid-col-span-2 fill\"><ids-text font-size=\"12\">A</ids-text></div>\n  <div class=\"ids-layout-grid-cell fill\"><ids-text font-size=\"12\">B</ids-text></div>\n</div>\n```\n\n--\n\n## Aligning Mixed-Height Controls (`align-items=\"center-inputs\"`)\n\nUse `align-items=\"center-inputs\"` on an `ids-layout-grid` when a row mixes form controls that have different intrinsic heights (inputs, date pickers, time pickers, textareas, dropdowns) with controls that are shorter (like `ids-checkbox`). The grid will apply `align-items: start` to its cells and raise the checkbox onto the baseline of the surrounding input fields, so the checkbox's interactive target visually lines up with the middle of the input controls.\n\n```html\n<ids-layout-grid cols=\"4\" gap=\"md\" align-items=\"center-inputs\">\n  <ids-layout-grid-cell>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell>\n    <ids-time-picker label=\"Time picker\" placeholder=\"Default\" no-margins></ids-time-picker>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell>\n    <ids-checkbox label=\"Subscribe\" label-break=\"shrink-value\"></ids-checkbox>\n  </ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nThe grid automatically detects the `field-height` or `compact` attribute on its descendant inputs and reflects the detected size onto itself. The CSS variables that drive the checkbox offset (`--ids-checkbox-inline-min-height`, `--ids-checkbox-margin-top`) are then set for that field height. Supported field heights are `xs` (default when a child is `compact`), `sm`, `md` (default), and `lg`.\n\nSee the `example-align-center-inputs.html` demo for each field height in action.\n\n## Keyboard Guidelines\n\nA layout grid is not on its own keyboard focusable and has no keyboard interaction.\n\n## Responsive Guidelines\n\n- A Layout Grid set to auto-fit or auto-fill will flow automatically with the screen size.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- New concept in 4.x\n\n**4.x to 5.x**\n\n- The Layout grid replaces the former grid entirely. Apply the new markup.\n- Using a 8pt style grid https://builttoadapt.io/intro-to-the-8-point-grid-system-d2573cde8632\n- Markup has changed to a custom element `<ids-layout-grid></ids-layout-grid>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Regional Considerations\n\nThe entire grid will flip direction in Right-To-Left languages.\n"}},{"name":"ids-layout-grid","attributes":[{"name":"align-content","description":"Get the grid align-content setting","values":[]},{"name":"align-items","description":"Get the grid align-items setting","values":[]},{"name":"auto-fit","description":"Get auto-fit attribute","values":[]},{"name":"overflow","description":"Set the overflow CSS property","values":[]},{"name":"auto-fill","description":"Get auto-fill attribute","values":[]},{"name":"cols","description":"Get columns attribute","values":[]},{"name":"cols-xs","description":"Get XS columns attribute","values":[]},{"name":"cols-sm","description":"Get SM columns attribute","values":[]},{"name":"cols-md","description":"Get MD columns attribute","values":[]},{"name":"cols-lg","description":"Get LG columns attribute","values":[]},{"name":"cols-xl","description":"Get XL columns attribute","values":[]},{"name":"cols-xxl","description":"Get XXL columns attribute","values":[]},{"name":"min-col-width","description":"Get the minColWidth attribute","values":[]},{"name":"min-row-height","description":"Get the minRowHeight attribute","values":[]},{"name":"max-col-width","description":"Get the maxColWidth attribute","values":[]},{"name":"max-row-height","description":"Get the maxRowHeight attribute","values":[]},{"name":"gap","description":"Handle The Gap Setting","values":[]},{"name":"row-gap","description":"Handle The Row Gap Setting","values":[]},{"name":"col-gap","description":"Handle The Column Gap Setting","values":[]},{"name":"margin","description":"Get the margin attribute","values":[]},{"name":"margin-y","description":"Get the margin attribute","values":[]},{"name":"max-width","description":"Get the maxWidth attribute","values":[]},{"name":"padding","description":"Get the padding attribute","values":[]},{"name":"padding-x","description":"Get the paddingX attribute","values":[]},{"name":"padding-y","description":"Get the paddingY attribute","values":[]},{"name":"justify-content","description":"Get the grid justify setting","values":[]},{"name":"flow","description":"Get the flow attribute","values":[]},{"name":"flow-xs","description":"Get the flow-xs attribute","values":[]},{"name":"flow-sm","description":"Get the flow-sm attribute","values":[]},{"name":"flow-md","description":"Get the flow-md attribute","values":[]},{"name":"flow-lg","description":"Get the flow-lg attribute","values":[]},{"name":"flow-xl","description":"Get the flow-xl attribute","values":[]},{"name":"flow-xxl","description":"Get the flow-xxl attribute","values":[]},{"name":"height","description":"Get the height attribute","values":[]},{"name":"rows","description":"Get the row attribute","values":[]},{"name":"rows-xs","description":"Get the rowXs attribute","values":[]},{"name":"rows-sm","description":"Get the rowSm attribute","values":[]},{"name":"rows-md","description":"Get the rowMd attribute","values":[]},{"name":"rows-lg","description":"Get the rowLg attribute","values":[]},{"name":"rows-xl","description":"Get the rowXl attribute","values":[]},{"name":"rows-xxl","description":"Get the rowXxl attribute","values":[]},{"name":"row-height","description":"Get the rowHeight attribute","values":[]},{"name":"template-rows","description":"Get the templateRows attribute","values":[]},{"name":"enable-container","description":"Get the enable-container attribute","values":[]},{"name":"#child-observer","values":[]}],"description":{"kind":"markdown","value":"# ids-layout-grid\n\n## Description\n\nThe Ids Layout Grid is comprised of 2 web components, IdsLayoutGrid and IdsLayoutGridCell. IdsLayoutGrid is the parent grid container in which the columns and rows are defined. IdsLayoutGridCell is a child element of Layout Grid. These elements contain the contents of your UI and can span multi columns or rows and be positioned along the tracks of the Layout Grid. A Layout Grid can also be nested inside a Layout Grid Cell.\n\n## Use Cases\n\n- Use to create full page layouts (i.e Header, Sidebar, Main Content, Footer).\n- Use to layout complex forms\n- Use to layout a list of IdsCards\n\n## Attributes\n\n### IdsLayoutGrid\n- **AutoFit**: Automatically adjust the width or height of a cell, row, or column to fit its contents.\n- **AutoFill**: Automatically fill a range of cells with a pattern or sequence.\n- **AlignItems**: Sets the vertical axis (align-items property) of the grid: `[null, start, end, center, center-inputs, stretch]`.\n- **Cols**: Specifies the number of columns by default in the grid.\n- **ColsXs**: Specifies the number of columns to use on extra small screens.\n- **ColsSm**: Specifies the number of columns to use on small screens.\n- **ColsMd**: Specifies the number of columns to use on medium screens.\n- **ColsLg**: Specifies the number of columns to use on large screens.\n- **ColsXl**: Specifies the number of columns to use on extra large screens.\n- **ColsXxl**: Specifies the number of columns to use on extra-extra large screens.\n- **Flow**: Specifies how the items in a grid should wrap or overflow when there isn't enough space.\n- **Gap**: Specifies the size of the gap between cells in a grid. If not assigned defaults to `md`. Valid values are `none, sm, md, lg, xl`\n- **RowGap**: Specifies the size of the row gap between cells in a grid. Valid values are `none, sm, md, lg, xl`\n- **ColGap**: Specifies the size of the column gap between cells in a grid. Valid values are `none, sm, md, lg, xl`\n- **Height**: Specifies the overall height of the grid.\n- **JustifyContent**: Specifies how to align the items in a grid along the main axis. If not assigned defaults to `start`.\n- **MinColWidth**: Specifies the minimum width of a column in a grid.\n- **MaxColWidth**: Specifies the maximum width of a column in a grid.\n- **MinRowHeight**: Specifies the minimum height of a row in a grid.\n- **MaxRowHeight**: Specifies the maximum height of a row in a grid.\n- **Margin**: Specifies the amount of space between a grid and its outer border.\n- **MarginY**: Specifies the amount of vertical space between a grid and its outer border.\n- **MaxWidth**: Specifies the maximum width of a grid and its outer border. Allows for setting the max-width attribute with predefined values (see Breakpoints) or custom values that end with 'px', providing flexibility for styling and dynamic updates.\n- **Overflow**: Controls how content that overflows the grid container is handled. Valid values are `visible`, `hidden`, `scroll`, `auto`, `clip`, `inherit`, `initial`, `unset`.\n- **Rows**: Specifies the number of rows by default in the grid.\n- **RowsXs**: Specifies the number of rows to use on extra small screens.\n- **RowsSm**: Specifies the number of rows to use on small screens.\n- **RowsMd**: Specifies the number of rows to use on medium screens.\n- **RowsLg**: Specifies the number of rows to use on large screens.\n- **RowsXl**: Specifies the number of rows to use on extra large screens.\n- **RowsXxl**: Specifies the number of rows to use on extra-extra large screens.\n- **RowHeight**: Specifies the height of a row in the grid.\n- **TemplateRows**: Specifies the grid-template-rows of the grid.\n- **Padding**: Specifies the amount of space between a grid content and its inner border.\n- **PaddingX**: Specifies the amount of horizontal space between a grid content and its inner border.\n- **PaddingY**: Specifies the amount of vertical space between a grid and its inner border.\n\n### IdsLayoutGridCell\n- **ColSpan**: Specifies the number of columns a cell should span by default in a grid.\n- **ColSpanXs**: Specifies the number of columns a cell should span on extra small screens.\n- **ColSpanSm**: Specifies the number of columns a cell should span on small screens.\n- **ColSpanMd**: Specifies the number of columns a cell should span on medium screens.\n- **ColSpanLg**: Specifies the number of columns a cell should span on large screens.\n- **ColSpanXl**: Specifies the number of columns a cell should span on extra large screens.\n- **ColSpanXxl**: Specifies the number of columns a cell should span on extra-extra large screens.\n- **ColStart**: Specifies the starting column for a cell by default in a grid.\n- **ColStartXs**: Specifies the starting column for a cell on extra small screens.\n- **ColStartSm**: Specifies the starting column for a cell on small screens.\n- **ColStartMd**: Specifies the starting column for a cell on medium screens.\n- **ColStartLg**: Specifies the starting column for a cell on large screens.\n- **ColStartXl**: Specifies the starting column for a cell on extra large screens.\n- **ColStartXxl**: Specifies the starting column for a cell on extra-extra large screens.\n- **ColEnd**: Specifies the ending column for a cell by default in a grid.\n- **ColEndXs**: Specifies the ending column for a cell on extra small screens.\n- **ColEndSm**: Specifies the ending column for a cell on small screens.\n- **ColEndMd**: Specifies the ending column for a cell on medium screens.\n- **ColEndLg**: Specifies the ending column for a cell on large screens.\n- **ColEndXl**: Specifies the ending column for a cell on extra large screens.\n- **ColEndXxl**: Specifies the ending column for a cell on extra-extra large screens.\n- **Editable**: Specifies whether the content of an element can be edited by the user.\n- **Fill**: Specifies whether an element should fill the available space in its container.\n- **Height**: Specifies the height of an element. If no unit is specified in the attribute the value will default to px.\n- **Hide**: Sets or removes the `hide` attribute to control the visibility of the grid cell based on the specified breakpoint. Options are as follows: `xxl | xl | lg | md | sm | xs | always`. `always` Hides the grid cell regardless of the breakpoint.\n- **MinHeight**: Specifies the minimum height of an element. If no unit is specified in the attribute the value will default to px.\n- **Order**: Specifies the order in which an element should appear by default in a container.\n- **OrderXs**: Specifies the order in which an element should appear on extra small screens.\n- **OrderSm**: Specifies the order in which an element should appear on small screens.\n- **OrderMd**: Specifies the order in which an element should appear on medium screens.\n- **OrderLg**: Specifies the order in which an element should appear on large screens.\n- **OrderXl**: Specifies the order in which an element should appear on extra large screens.\n- **OrderXxl**: Specifies the order in which an element should appear on extra-extra large screens.\n- **RowSpan**: Specifies the number of rows a cell should span by default in a grid.\n- **RowSpanXs**: Specifies the number of rows a cell should span on extra small screens.\n- **RowSpanSm**: Specifies the number of rows a cell should span on small screens.\n- **RowSpanMd**: Specifies the number of rows a cell should span on medium screens.\n- **RowSpanLg**: Specifies the number of rows a cell should span on large screens.\n- **RowSpanXl**: Specifies the number of rows a cell should span on extra large screens.\n- **RowSpanXxl**: Specifies the number of rows a cell should span on extra-extra large screens.\n- **Sticky**: Specifies whether an element should be \"stuck\" to a viewport\n\n## Responsive Breakpoints\n\n- **XS**: 320-575px\n- **SM**: 576-767px\n- **MD**: 768-927px\n- **LG**: 928-1183px\n- **XL**: 1184-2463px\n- **XXL**: 2464px+\n\n## Enabling Container Queries\n\nThe IdsLayoutGrid component supports a flexible container query setup via the enableContainer attribute. This feature allows you to decide whether the layout grid itself or its direct parent should act as the container for responsive queries. Based on the setup, you can control the grid’s behavior and cell configurations.\n\n### Overview\n- `enableContainer` Attribute: When this attribute is set on IdsLayoutGrid, it enables container query responsiveness.\n- `container-queries` Attribute on Parent: When the direct parent of IdsLayoutGrid has the `container-queries` attribute, it becomes the container, giving you additional flexibility.\n\n### Configuration Options\nThere are two ways to configure the container queries, each offering different responsive behaviors:\n\n#### `enableContainer` Only (Grid is the Container)\n\n- When `enableContainer` is set on IdsLayoutGrid without a `container-queries` attribute on the parent, the grid component itself becomes the container.\n- You can define responsive column spans using `col-span-{size}=\"\"` attributes on the `ids-layout-grid-cell` elements.\n- This configuration is best when you want the grid to resize based on its own dimensions, rather than its parent’s or when using a 12 column grid.\n\n```html\n<ids-layout-grid cols=\"12\" enable-container>\n  <ids-layout-grid-cell col-span=\"12\" col-span-sm=\"6\" col-span-lg=\"4\" height=\"200px\" fill></ids-layout-grid-cell>\n  <!-- Additional cells here -->\n</ids-layout-grid>\n```\n\n#### `enableContainer` with `container-queries` on Parent\n\n- When `enableContainer` is set on IdsLayoutGrid and its direct parent has the `container-queries` attribute, the parent becomes the container.\n- In this configuration, you can use `cols-{size}=\"\"` on `ids-layout-grid` to control the grid’s column structure based on the parent’s size.\n\n```html\n<ids-container id=\"my-container\" title=\"Responsive Container\" container-queries>\n  <ids-layout-grid cols=\"1\" cols-sm=\"3\" cols-lg=\"4\" enable-container>\n    <ids-layout-grid-cell fill></ids-layout-grid-cell>\n    <!-- Additional cells here -->\n  </ids-layout-grid>\n</ids-container>\n```\n\n```html\n<ids-splitter-pane container-queries>\n  <ids-layout-grid cols=\"1\" cols-sm=\"3\" cols-lg=\"4\" enable-container>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n    <ids-layout-grid-cell fill height=\"176px\"></ids-layout-grid-cell>\n  </ids-layout-grid>\n</ids-splitter-pane>\n```\n\n## Using Responsive Nested Grids Inside a Splitter\n\nWhen using layout grids inside an `ids-splitter-pane`, you can create deeply nested, responsive grid structures that adapt to the splitter pane's width. This is particularly useful for building complex forms or layouts that need to reflow as the splitter is resized.\n\n### Key Principles\n\n- **Enable Container Queries on the Splitter Pane**: Add the `container-queries` attribute to the `ids-splitter-pane` to make it act as the container query context.\n- **Enable Container Queries on Nested Grids**: Add the `enable-container` attribute to each `ids-layout-grid` that needs to be responsive within the splitter.\n- **Use Col-Span to Control Full-Width Cells**: When nesting grids, use `col-span` and responsive variants (like `col-span-md`) to ensure the grid cell spans the full width of its parent grid. This is crucial for nested grids to properly fill their container.\n- **Responsive Columns**: Use responsive column attributes (`cols-md`, `cols-lg`, etc.) on nested grids to control how many columns appear at different container sizes.\n\n### Example: Nested Responsive Grids in a Splitter\n\n```html\n<ids-splitter>\n  <ids-splitter-pane container-queries>\n    <!-- Parent grid with responsive columns -->\n    <ids-layout-grid cols=\"1\" cols-md=\"2\" enable-container>\n      <ids-layout-grid-cell>\n        <ids-input label=\"Field 1\"></ids-input>\n      </ids-layout-grid-cell>\n      <ids-layout-grid-cell>\n        <ids-input label=\"Field 2\"></ids-input>\n      </ids-layout-grid-cell>\n\n      <!-- Cell that spans full width at medium breakpoint to contain nested grid -->\n      <ids-layout-grid-cell col-span=\"1\" col-span-md=\"2\">\n        <ids-input label=\"Field 3\"></ids-input>\n\n        <!-- Nested grid that will be responsive within the parent cell -->\n        <ids-layout-grid cols=\"1\" cols-md=\"2\" enable-container>\n          <ids-layout-grid-cell>\n            <ids-input label=\"Nested Field 1\"></ids-input>\n          </ids-layout-grid-cell>\n          <ids-layout-grid-cell>\n            <ids-input label=\"Nested Field 2\"></ids-input>\n          </ids-layout-grid-cell>\n\n          <!-- Further nesting with full-width cell -->\n          <ids-layout-grid-cell col-span=\"1\" col-span-md=\"2\">\n            <ids-input label=\"Nested Field 3\"></ids-input>\n\n            <!-- Third level nested grid -->\n            <ids-layout-grid cols=\"1\" cols-md=\"2\" enable-container>\n              <ids-layout-grid-cell>\n                <ids-input label=\"Deep Nested Field 1\"></ids-input>\n              </ids-layout-grid-cell>\n              <ids-layout-grid-cell>\n                <ids-input label=\"Deep Nested Field 2\"></ids-input>\n              </ids-layout-grid-cell>\n            </ids-layout-grid>\n          </ids-layout-grid-cell>\n        </ids-layout-grid>\n      </ids-layout-grid-cell>\n    </ids-layout-grid>\n  </ids-splitter-pane>\n</ids-splitter>\n```\n\n### Important Notes\n\n- **Col-Span for Nested Grids**: When placing a nested grid inside a cell, that cell should typically use `col-span-md=\"2\"` (or the appropriate number) to span the full width of the parent grid at the medium breakpoint. This ensures the nested grid has enough space to properly display its columns.\n- **Multiple Nesting Levels**: You can nest grids multiple levels deep. Each nested grid should have `enable-container` and can define its own responsive column structure using `cols-md`, `cols-lg`, etc.\n- **Responsive Behavior**: As the splitter pane is resized, the nested grids will automatically adjust their column count based on the container width. For example, a grid with `cols=\"1\" cols-md=\"2\"` will show 1 column when narrow and 2 columns when wider than the medium breakpoint.\n- **Use with Other Components**: This pattern works well inside accordions, tabs, and other components that may be placed within a splitter pane. See the `splitter-responsive.html` demo for a complete example.\n\n**Example Usage**\n## Features (With Code Examples)\n\n```html\n<ids-layout-grid cols=\"2\" cols-lg=\"4\" cols-xl=\"6\" cols-xxl=\"8\">\n```\n\nThis `<ids-layout-grid>` element has four attributes (cols, cols-lg, cols-xl, and cols-xxl) that are used to define the number of columns in the grid layout at different breakpoint sizes. The `cols` attribute sets the number of columns in the grid layout by default. The `cols-lg` attribute sets the number of columns in the grid layout at the lg breakpoint size (large devices/screen sizes). The `cols-xl` attribute sets the number of columns in the grid layout at the xl breakpoint size (extra-large devices/screen sizes).\n\nFinally, the `cols-xxl` attribute sets the number of columns in the grid layout at the xxl breakpoint size (extra-extra-large devices/screen sizes). Overall, this code is defining a grid layout that will display two columns by default and adjust the number of columns displayed at different breakpoint sizes for different device types.\n\n---\n\n```html\n<ids-layout-grid-cell col-span=\"2\" col-span-lg=\"4\">\n```\n\nThis `<ids-layout-grid-cell>` element is used to define a cell within a grid layout. It has two attributes (`col-span` and `col-span-lg`) that define the number of columns a cell should span at different breakpoint sizes. The `col-span` attribute sets the number of columns that the cell should span by default. The `col-span-lg` attribute sets the number of columns that the cell should span at the lg breakpoint size (large devices) and its value is set to 4. Overall, this code is defining a cell within a grid layout that will span two columns by default and adjust the number of columns it spans at the lg breakpoint size.\n\n---\n\n```html\n<ids-layout-grid\n    auto-fit\n    min-col-width=\"100px\"\n    max-col-width=\"1fr\"\n>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nFor AutoFit layout the grid cells in this example have a min/max value of 100px and 1fr respectively. The cells will take up as much space as is available until they reach the threshold of the MinColWidth, then they will automatically shift until they reach that threshold again. This removes the need for media queries in many cases.\n\n---\n\n```html\n<ids-layout-grid cols=\"4\">\n   <ids-layout-grid-cell col-span=\"3\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell row-span=\"2\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nAn Ids Layout Grid with a custom number of columns or rows. The example above shows a 4 column grid where the first cell spans 3 columns and the 3rd cell spans 2 rows.\n\n---\n\n```html\n<ids-layout-grid\n    id=\"eight-column-grid\"\n    cols=\"8\"\n    padding-x=\"md\"\n    justify-content=\"center\"\n    max-width=\"lg\"\n    margin=\"auto\"\n>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n    <ids-layout-grid-cell col-span=\"1\" fill height=\"176px\">\n        <ids-text font-size=\"12\">1 Col</ids-text>\n    </ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nAbove is an example of a contained and centered grid. The max-width attribute is set to \"lg\", which represents a predefined breakpoint value for the maximum width of the grid. This controls how wide the grid can become. The margin attribute is set to \"auto\" to horizontally center the entire grid on the page by applying equal left and right margins.\n\n*Note*:\nThe available sizes for maxWidth are based on the current predefined breakpoint sizes. These breakpoint sizes provide convenient options for setting the maximum width of the grid, ensuring responsiveness and compatibility with different screen sizes. However, the maxWidth attribute also allows users to specify a custom width if needed, giving them flexibility in defining the maximum width according to their specific requirements. While custom widths can be used, it is generally recommended to utilize the predefined breakpoint sizes whenever possible for consistency and responsiveness across different devices and viewports.\n\n---\n\nExamples of grid with responsive col-spans\n\n```html\n<ids-layout-grid\n    cols=\"12\"\n>\n  <ids-layout-grid-cell col-span=\"12\" col-span-sm=\"6\" fill>\n    <ids-text font-size=\"12\">2 Cols</ids-text>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell col-span=\"12\" col-span-sm=\"6\" col-span-md=\"4\" fill>\n    <ids-text font-size=\"12\">2 Cols</ids-text>\n  </ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\n--\n\nNested Grid. An IdsLayoutGrid component can be nested inside an IdsLayoutGridCell.\n\n```html\n<ids-layout-grid cols=\"4\">\n   <ids-layout-grid-cell col-span=\"3\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell row-span=\"2\" fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill>\n      <ids-layout-grid auto>\n        <ids-layout-grid-cell fill></ids-layout-grid-cell>\n        <ids-layout-grid-cell fill></ids-layout-grid-cell>\n        <ids-layout-grid-cell fill></ids-layout-grid-cell>\n      </ids-layout-grid>\n   </ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n   <ids-layout-grid-cell fill></ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nStandalone CSS Example\n\n```html\n<div class=\"ids-layout-grid ids-layout-grid-cols-3\">\n  <div class=\"ids-layout-grid-cell ids-layout-grid-col-span-2 fill\"><ids-text font-size=\"12\">A</ids-text></div>\n  <div class=\"ids-layout-grid-cell fill\"><ids-text font-size=\"12\">B</ids-text></div>\n</div>\n```\n\n--\n\n## Aligning Mixed-Height Controls (`align-items=\"center-inputs\"`)\n\nUse `align-items=\"center-inputs\"` on an `ids-layout-grid` when a row mixes form controls that have different intrinsic heights (inputs, date pickers, time pickers, textareas, dropdowns) with controls that are shorter (like `ids-checkbox`). The grid will apply `align-items: start` to its cells and raise the checkbox onto the baseline of the surrounding input fields, so the checkbox's interactive target visually lines up with the middle of the input controls.\n\n```html\n<ids-layout-grid cols=\"4\" gap=\"md\" align-items=\"center-inputs\">\n  <ids-layout-grid-cell>\n    <ids-date-picker label=\"Date field\" value=\"3/4/2026\" mask no-margins></ids-date-picker>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell>\n    <ids-time-picker label=\"Time picker\" placeholder=\"Default\" no-margins></ids-time-picker>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell>\n    <ids-input label=\"First Name\" size=\"full\" no-margins></ids-input>\n  </ids-layout-grid-cell>\n  <ids-layout-grid-cell>\n    <ids-checkbox label=\"Subscribe\" label-break=\"shrink-value\"></ids-checkbox>\n  </ids-layout-grid-cell>\n</ids-layout-grid>\n```\n\nThe grid automatically detects the `field-height` or `compact` attribute on its descendant inputs and reflects the detected size onto itself. The CSS variables that drive the checkbox offset (`--ids-checkbox-inline-min-height`, `--ids-checkbox-margin-top`) are then set for that field height. Supported field heights are `xs` (default when a child is `compact`), `sm`, `md` (default), and `lg`.\n\nSee the `example-align-center-inputs.html` demo for each field height in action.\n\n## Keyboard Guidelines\n\nA layout grid is not on its own keyboard focusable and has no keyboard interaction.\n\n## Responsive Guidelines\n\n- A Layout Grid set to auto-fit or auto-fill will flow automatically with the screen size.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- New concept in 4.x\n\n**4.x to 5.x**\n\n- The Layout grid replaces the former grid entirely. Apply the new markup.\n- Using a 8pt style grid https://builttoadapt.io/intro-to-the-8-point-grid-system-d2573cde8632\n- Markup has changed to a custom element `<ids-layout-grid></ids-layout-grid>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Regional Considerations\n\nThe entire grid will flip direction in Right-To-Left languages.\n"}},{"name":"ids-line-chart","attributes":[{"name":"selection-elements","description":"Return chart elements that get selection","values":[]},{"name":"marker-size","description":"Set the size of the markers (aka dots/ticks) in the chart","values":[]},{"name":"default-selectable","values":[]},{"name":"initialized","values":[]},{"name":"data-loaded","values":[]},{"name":"svg","values":[]},{"name":"canvas","values":[]},{"name":"empty-message","values":[]},{"name":"legend","values":[]},{"name":"section-widths","values":[]},{"name":"section-width","values":[]},{"name":"section-heights","values":[]},{"name":"section-height","values":[]},{"name":"resize-to-parent-height","values":[]},{"name":"resize-to-parent-width","values":[]},{"name":"datasource","description":"Reference to datasource API","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"is-grouped","values":[]},{"name":"#x-max-text-width","description":"Max width for x-labels text","values":[]},{"name":"#y-max-text-width","description":"Max width for y-labels text","values":[]},{"name":"#resize-observer","description":"Holds the resize observer object","values":[]},{"name":"marker-data","description":"The marker data to use to draw the chart","values":[]},{"name":"#axis-labels-text","description":"Holds the axis labels text object","values":[]},{"name":"title","description":"Get the chart title","values":[]},{"name":"height","description":"Get the chart height","values":[]},{"name":"horizontal","description":"Get the horizontal orientation state","values":[]},{"name":"width","description":"Get the chart width","values":[]},{"name":"chart-container","description":"Get the chart container element","values":[]},{"name":"margins","description":"Get the chart margins","values":[]},{"name":"left-rotate-margin","description":"Get left rotate margin for rotated labels","values":[]},{"name":"right-rotate-margin","description":"Get right rotate margin for rotated labels","values":[]},{"name":"bottom-rotate-margin","description":"Get bottom rotate margin for rotated labels","values":[]},{"name":"axis-labels-margin","description":"Get axis labels margin values","values":[]},{"name":"text-widths","description":"Get text widths for chart dimensions","values":[]},{"name":"data","description":"Get the chart data","values":[]},{"name":"y-axis-min","description":"Get the minimum value on the y axis","values":[]},{"name":"ticks","description":"Get the number of ticks to show","values":[]},{"name":"show-tooltip","description":"Get the show tooltip state","values":[]},{"name":"show-vertical-grid-lines","description":"Get the show vertical grid lines state","values":[]},{"name":"show-horizontal-grid-lines","description":"Get the show horizontal grid lines state","values":[]},{"name":"colors","description":"Get the colors series being used in this chart","values":[]},{"name":"x-axis-formatter","description":"Get the x axis formatter","values":[]},{"name":"y-axis-formatter","description":"Get the y axis formatter","values":[]},{"name":"cubic-bezier","description":"Get a reusable snippet to ease the animation","values":[]},{"name":"animated","description":"Get the animation state","values":[]},{"name":"animation-speed","description":"Get the animation speed","values":[]},{"name":"align-xlabels","description":"Get the x axis label alignment","values":[]},{"name":"stacked","description":"Get the stacked state","values":[]},{"name":"axis-label-bottom","description":"Get the bottom axis label text","values":[]},{"name":"axis-label-end","description":"Get the end axis label text","values":[]},{"name":"axis-label-margin","description":"Get the margin for axis label text","values":[]},{"name":"axis-label-start","description":"Get the start axis label text","values":[]},{"name":"axis-label-top","description":"Get the top axis label text","values":[]},{"name":"rotate-name-labels","description":"Get the rotation for the axis name label text","values":[]},{"name":"use-log-scale","description":"Get the log scale state","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-line-chart\n\n## Description\n\nA line chart or line graph is a type of chart which displays information as a series of data points connected by straight line segments. Often Line charts convey a series of data over periods over time. Line charts can use both single and multiple variables to emphasize trends over several series. Users can interact by clicking or tapping on chart lines to focus on a certain series of data on a line chart. And users can also interact by hovering data points to reveal additional information in a tooltip.\n\nFor more information on line charts check out the article [Line Charts Made Simple](https://uxdesign.cc/line-chart-design-made-simple-a1b823510674).\n\n## Use Cases\n\n- Use when you want to show change over time.\n- Use when you want to show trends.\n- Use when you want to show comparison of change for several groups.\n- Use when you want to aid prediction.\n\n## Usage Considerations\n\n- Do not show too many lines at once as it may be difficult to interpret. Studies say 8 max is  a good number.\n- Hover tooltips should only be used to reveal additional non-critical information.\n\n## Terminology\n\n- **Marker**: A UI embellishments that shows the data points (i.e. the dots on a line chart).\n- **Domain**: The domain is all x-values (the values of the graph from left to right)\n- **Range**: The domain is all y-values (the values of the graph from down to up)\n- **Scale**: The range of values in the graph (the values of the graph from down to up) and the amount of steps between each value.\n\n## Features (With Code Examples)\n\nA line chart is defined with a custom element with a width and height. This chart does support negative values.\n\n```html\n<ids-line-chart title=\"A line chart showing component usage\" width=\"800\" height=\"500\"></ids-line-chart>\n```\n\nDatasets can be added to the line chart by passing in an array of objects. Each object must have a `data` and object with `name` and `values` from the data points. Also a name should be given for each data object which will be used as the legend text. The `shortName` is used to show the short name of the legend text and the `abbrName` is used to show an even shorter name of the legend text in responsive situations.\n\n```html\nconst lineData2 = [{\n  data: [{\n    name: 'Jan',\n    value: 1\n  }, {\n    name: 'Feb',\n    value: 2\n  }, {\n    name: 'Mar',\n    value: 3\n  }, {\n    name: 'Apr',\n    value: 5\n  }, {\n    name: 'May',\n    value: 7\n  }, {\n    name: 'Jun',\n    value: 10\n  }],\n  name: 'Component A',\n  shortName: 'Comp A',\n  abbrName: 'A',\n}];\n\ndocument.querySelector('ids-line-chart').data = lineData;\n```\n\nAnother type of chart you can use is a sequential color chart. A sequence of colors is used to represent various concepts of range in low-high density, quantity, and concentration situations. I.E. The data is highly related and should be represented with a single color.\n\nTo achieve this it is recommended to use the `color` setting and pick one of the Ids Colors in the color palette and use variables in its range. For example:\n\n```js\n[{\n   \"data\": [],\n   \"name\": \"Component A\",\n   \"color\": \"var(--ids-color-blue-60)\n }, {\n   \"data\": [],\n   \"name\": \"Component B\",\n   \"shortName\": \"Comp B\",\n   \"abbreviatedName\": \"B\",\n   \"color\": \"var(--ids-color-blue-40)\"\n }, {\n   \"data\": [{\n   ],\n   \"name\": \"Component C\",\n   \"color\": \"var(--ids-color-blue-20)\"\n }]\n```\n\n## Class Hierarchy\n\n- IdsLineChart\n  - IdsAxisChart\n    - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Data Settings\n\nThe following data attributes can be used on the data passed to a chart.\n\n- `data` {object} A data group with one or more `name` and `value` pairs.\n- `shortName` {string} The short name of the legend text.\n- `abbrName` {string} A very short name of the legend text (one or two characters).\n- `color` {string} The color of this line group. This can be either a hex value for example `#FF0000` or a color name like `red` or an ids variable like `var(--ids-color-blue-20)`.\n\n## Settings\n\n- `title` {string} Sets the internal title of the chart (for accessibility).\n- `height` {number} Generally this is calculated automatically but can be used to set a specific height.\n- `width` {number} Generally this is calculated automatically but can be used to set a specific width.\n- `textWidths` {object} Generally this is calculated automatically but can be overridden by setting the amount of space to allocate for margins on the `{ left, right, top, bottom }` sides.\n- `textWidths` {object} Generally this is calculated automatically but can be overridden by setting the amount of space to allocate for text on the `{ left, right, top, bottom }` sides.\n- `yAxisMin` {number}  Set the minimum value on the y axis  (default: 0)\n- `showVerticalGridLines` {boolean}  Show the vertical axis grid lines (default: false)\n- `showHorizontalGridLines` {boolean}  Show the horizontal axis grid lines (default: true)\n- `animated` {boolean}  Set the animation on/off (default: true)\n\n## Events\n\n- `rendered` Fires each time the chart is rendered or rerendered (on resize).\n\n## Themeable Parts\n\n- `chart` the svg outer element\n- `svg` - the outside svg element\n- `marker` - the dots/markers in the chart\n- `line` - the lines in the chart\n\n## Animation\n\nAll points in the line rise along the y-axis from 0 to the appropriate values. Lines build and load at the same time.\n\n## States and Variations\n\n- Color\n- Disabled\n- Animation\n- Marker Style\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the tab is focusable this will focus or unfocus the markers and legend elements\n- <kbd>Space</kbd>: If a marker or legend is focused this act as if clicking it.\n\n## Responsive Guidelines\n\n- Sizes to the given width/height defaulting to that of the immediate parent. In smaller breakpoints the abbreviated name(s) will be shown.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- The line chart was added after version 3.6 so new in 4.x and had a new way to invoke it.\n\n**5.x to 5.x**\n- Line Chart now uses all new markup and classes for web components (see above)\n- Now called IdsAccordion with a namespace\n- The data object is the same format except for two changes.\n  - `shortName` is now `shortName`\n  - `abbreviatedName` is now `abbrName`\n- If using side by side the old line chart requires the height and width of the parent to be visible. So you may need to toggle the visibility of `ids-container` or some new element if its nested in it.\n\n## Designs\n\n[Design Specs 4.5](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n[Design Specs 4.6](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information.\n\n## Regional Considerations\n\nChart labels should be localized in the current language. The chart will flip in RTL mode. For some color blind users the svg patterns should be used.\n"}},{"name":"ids-list-box-option","attributes":[{"name":"child-checkbox","description":"Get nested ids-checkbox child","values":[]},{"name":"child-icon","values":[]},{"name":"label","values":[]},{"name":"group-label","values":[]},{"name":"value","values":[]},{"name":"selected","description":"Set the selected state on the list-box-option","values":[]},{"name":"row-index","description":"Gets the row index # of this row.","values":[]},{"name":"disabled","description":"Get the disabled on the list-box-option","values":[]}],"description":{"kind":"markdown","value":"# ids-list-box\n\n## Description\n\nThe List Box Component is used in the dropdown and autocomplete to form a aria list with options and give the right accessibility. It shouldn't need to be used directly.\nYou might want the listview component if considering using it directly or we might expand on it later.\n\n## Use Cases\n\n- Used with in dropdown and autocomplete\n\n## Terminology\n\n- **listbox**: The aria role for the outside container.\n- **option**: The aria role for the inner options\n\n## Features (With Code Examples)\n\nA normal ids-list-box with options\n\n```html\n<ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\" tooltip=\"Additional Info on Option One\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\" tooltip=\"Additional Info on Option Two\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\" tooltip=\"Additional Info on Option Three\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\" tooltip=\"Additional Info on Option Four\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\" tooltip=\"Additional Info on Option Five\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\" tooltip=\"Additional Info on Option Six\">Option Six</ids-list-box-option>\n</ids-list-box>\n```\n\n## Settings and Attributes\n\n- `value` {string} The value for use when the option is selected.\n- `id` {string} The id for the option (value is still always needed)\n- `group-label` {string} When set the option will act as group label when used `ids-dropdown`\n\n## Keyboard Guidelines\n\nThe board is done in the dropdown and autocomplete but we might change this.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions\n\n- 3.x: Did not exist\n- 4.x: Did not exist\n\n## Regional Considerations\n\nLabels should be localized in the current language. The icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-list-box","attributes":[{"name":"options","description":"Get list of options","values":[]},{"name":"options-sorted","values":[]},{"name":"max-height","description":"Set the max height value","values":[]},{"name":"disabled","description":"Sets the disabled attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-list-box\n\n## Description\n\nThe List Box Component is used in the dropdown and autocomplete to form a aria list with options and give the right accessibility. It shouldn't need to be used directly.\nYou might want the listview component if considering using it directly or we might expand on it later.\n\n## Use Cases\n\n- Used with in dropdown and autocomplete\n\n## Terminology\n\n- **listbox**: The aria role for the outside container.\n- **option**: The aria role for the inner options\n\n## Features (With Code Examples)\n\nA normal ids-list-box with options\n\n```html\n<ids-list-box>\n    <ids-list-box-option value=\"opt1\" id=\"opt1\" tooltip=\"Additional Info on Option One\">Option One</ids-list-box-option>\n    <ids-list-box-option value=\"opt2\" id=\"opt2\" tooltip=\"Additional Info on Option Two\">Option Two</ids-list-box-option>\n    <ids-list-box-option value=\"opt3\" id=\"opt3\" tooltip=\"Additional Info on Option Three\">Option Three</ids-list-box-option>\n    <ids-list-box-option value=\"opt4\" id=\"opt4\" tooltip=\"Additional Info on Option Four\">Option Four</ids-list-box-option>\n    <ids-list-box-option value=\"opt5\" id=\"opt5\" tooltip=\"Additional Info on Option Five\">Option Five</ids-list-box-option>\n    <ids-list-box-option value=\"opt6\" id=\"opt6\" tooltip=\"Additional Info on Option Six\">Option Six</ids-list-box-option>\n</ids-list-box>\n```\n\n## Settings and Attributes\n\n- `value` {string} The value for use when the option is selected.\n- `id` {string} The id for the option (value is still always needed)\n- `group-label` {string} When set the option will act as group label when used `ids-dropdown`\n\n## Keyboard Guidelines\n\nThe board is done in the dropdown and autocomplete but we might change this.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions\n\n- 3.x: Did not exist\n- 4.x: Did not exist\n\n## Regional Considerations\n\nLabels should be localized in the current language. The icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-list-builder","attributes":[{"name":"placeholder","description":"A clone of the list item being dragged,\nit appears during drag to help visualize where the dragged item's position","values":[]},{"name":"actions","description":"List of actions can be performed","values":[]},{"name":"parent-el","description":"Get the parent element","values":[]},{"name":"toolbar","description":"Get the toolbar element","values":[]},{"name":"data-keys","description":"Get the data keys","values":[]},{"name":"data","description":"Set the data set of the list","values":[]},{"name":"virtual-scroll","description":"List builder does not support VS","values":[]},{"name":"mouse-active","values":[]},{"name":"input-focused","values":[]},{"name":"initialized","description":"Is the component initialized","values":[]},{"name":"#size","description":"The currently list size","values":[]},{"name":"datasource","description":"The datasource container","values":[]},{"name":"default-template","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"item-count","description":"Get the total item count","values":[]},{"name":"item-focused","description":"Get the currently focused item","values":[]},{"name":"items","description":"Get all list view items","values":[]},{"name":"items-activated","description":"Get all activated items","values":[]},{"name":"items-disabled","description":"Get all disabled items","values":[]},{"name":"items-filtered","description":"Get all filtered items (not hidden by search)","values":[]},{"name":"items-checked","description":"Get all checked items","values":[]},{"name":"items-selected","description":"Get all selected items","values":[]},{"name":"items-slotted","description":"Get all slotted items","values":[]},{"name":"items-swappable","description":"Get all swappable items","values":[]},{"name":"items-tabbable","description":"Get all tabbable items","values":[]},{"name":"#last-selected-row","description":"Keep flag for last selected row","values":[]},{"name":"#initially-selected-row","description":"Keep flag for initially selected row","values":[]},{"name":"#redraw-lazy-raf","description":"Used in IdsListView.redrawLazy()","values":[]},{"name":"virtual-scroll-container","description":"Get the virtual scroll container","values":[]},{"name":"body","description":"Get the list view body element","values":[]},{"name":"ds","description":"Get the list of all data from dataset","values":[]},{"name":"loaded","description":"Get whether data has been loaded","values":[]},{"name":"height","description":"Get the expected height of the viewport","values":[]},{"name":"item-height","description":"Get the expected height of each item","values":[]},{"name":"selected","description":"Helper setter to set selected items.","values":[]},{"name":"selectable","description":"Get the selection mode","values":[]},{"name":"bordered","description":"Get whether the list view has borders","values":[]},{"name":"sortable","description":"Get whether the list is sortable","values":[]},{"name":"suppress-deactivation","description":"Get whether deactivation is suppressed for mixed selection","values":[]},{"name":"suppress-deselection","description":"Get whether deselection is suppressed for single selection","values":[]},{"name":"hide-checkboxes","description":"Get whether checkboxes are hidden","values":[]},{"name":"label","description":"Get the aria label text","values":[]},{"name":"max-width","description":"Get the max width","values":[]},{"name":"tooltip","description":"Get the tooltip text","values":[]},{"name":"overflow","description":"Get the overflow setting","values":[]},{"name":"tooltip-plain-text","description":"Get the tooltip plain text attribute","values":[]},{"name":"#update-list-item-in-datasource","description":"Update item instance in datasource object via datasource.update function","values":[]}],"description":{"kind":"markdown","value":"# Ids ListBuilder\n\n## Description\n\nAn interactive list where you can add, move up/down, edit, and delete items which supports both mouse and keyboard navigation for accessibility.\n\nSelecting an item can be toggled by a mouse click or by tabbing to the list item and hitting 'Space'.\n\nMoving a selected list item up/down can be done by clicking and dragging list items up/down or by toggling the toolbar up/down buttons with mouse or keyboard.\n\nEditing a selected list item can be done by hitting 'Enter' or by toggling the toolbar edit button with mouse or keyboard.\n\nDeleting a selected list item can be done by toggling the toolbar delete button with mouse or keyboard.\n\nAdding a new list item can be done by toggling the toolbar add button with mouse or keyboard.\n\n## Use Cases\n\n- Allows for users to create and edit lists of varying content. After importing JSON or array of objects, allowing user to edit, order, add, and/or delete items.\n\n## Terminology\n\n- **Selected list item**: The currently toggled selected list item, indicated by a blue background and white text\n- **Toolbar**: At the top of the list builder, contains 5 buttons for interacting with the list items\n- **Template**: The pattern or structure of data to display for each list item\n\n## Features (With Code Samples)\n\n### A List Builder with a template to display productNames\n\n```html\n<ids-list-builder>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n  </template>\n</ids-list-builder>\n```\n\nTo inject data you would do something like:\n\n```js\n  document.querySelector('ids-list-builder').data = [\n    {\n      id: 1,\n      productId: '7439937961',\n      productName: 'Steampan Lid',\n      inStock: true,\n      units: '9',\n      unitPrice: 23,\n      color: 'Green'\n    },\n    {\n      id: 2,\n      productId: '3672150959',\n      productName: 'Coconut - Creamed, Pure',\n      inStock: true,\n      units: '588',\n      unitPrice: 18,\n      color: 'Yellow'\n    },\n    {\n      id: 3,\n      productId: '8233719404',\n      productName: 'Onions - Red',\n      inStock: false,\n      units: '68',\n      unitPrice: 58,\n      color: 'Green'\n    },\n  ]\n```\n\nand if you want to display more data you could modify the template like so:\n\n```html\n<ids-list-builder>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">Item: ${productName}</ids-text>\n    <ids-text font-size=\"16\" type=\"h2\">Price: ${unitPrice}</ids-text>\n    <ids-text font-size=\"16\" type=\"h2\">Stock: ${units}</ids-text>\n  </template>\n</ids-list-builder>\n```\n\nShow this list builder as a customized toolbar buttons\n\n```html\n  <ids-list-builder>\n    <ids-toolbar slot=\"toolbar\" type=\"formatter\" tabbable>\n      <ids-toolbar-section type=\"buttonset\">\n        <ids-button list-builder-action=\"edit\" tooltip=\"Edit\" color-variant=\"alternate-formatter\">\n          <span class=\"audible\">Edit list item</span>\n          <ids-icon icon=\"edit\"></ids-icon>\n        </ids-button>\n        <ids-separator vertical></ids-separator>\n        <ids-button list-builder-action=\"move-up\" tooltip=\"Move Up\" color-variant=\"alternate-formatter\">\n          <span class=\"audible\">Move up list item</span>\n          <ids-icon icon=\"arrow-up\"></ids-icon>\n        </ids-button>\n        <ids-button list-builder-action=\"move-down\" tooltip=\"Move Down\" color-variant=\"alternate-formatter\">\n          <span class=\"audible\">Move down list item</span>\n          <ids-icon icon=\"arrow-down\"></ids-icon>\n        </ids-button>\n      </ids-toolbar-section>\n    </ids-toolbar>\n    <template>\n      <ids-text font-size=\"16\" type=\"span\">${manufacturerName}</ids-text>\n    </template>\n  </ids-list-builder>\n```\n\n## Settings (Attributes)\n\nSince this component inherits [IdsListView](../ids-list-view/README.md), it will have all of its properties. The only property that should be of concern, and overrides that of its super class, is `data`.\n\n- `data` {array} the list of items to populate the list builder with\n\n## Events\n\n- `itemclick` - Fires when a list item is clicked. Detail contains the clicked item and list builder element.\n- `itemselect` - Fires when a list item is selected. Detail contains the selected item and list builder element.\n- `itemadd` - Fires when a new item is added to the list. Detail contains the new item data and list builder element.\n- `itemdelete` - Fires when an item is deleted from the list. Detail contains the deleted item data and list builder element.\n- `itemmoveup` - Fires when an item is moved up in the list. Detail contains the dataset and list builder element.\n- `itemmovedown` - Fires when an item is moved down in the list. Detail contains the dataset and list builder element.\n- `listdatachange` - Fires when the list data changes in any way. Detail contains the updated dataset and list builder element.\n- `itemchange `- Fires when an item is edited or changed. Detail contains the changed item data and list builder element.\n\n## Methods\n\n- `add()` Let insert a new list item, will deselect if selected more than one item\n- `delete()` It will remove selected list items\n- `edit()` Edit the selected list item, will edit first if selected more than one item\n- `moveUp()` Move up the selected list item, if selected more than one item will move up to the first selected and move together if selected not next to each other\n- `moveDown()` Move down the selected list item, if selected more than one item will move down to the last selected and move together if selected not next to each other\n\n## Responsive Guidelines\n\n- This component stretches to 100% width of its container\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- New pattern for 4.x\n\n**4.x to 5.x**\n\n- The Ids ListBuilder is now a Web Component\n- Instead of using classes to define it, it is done directly with a custom element and attributes\n- Markup has changed to a custom element `<ids-list-builder></ids-list-builder>` (see examples above)\n- Can now be imported as a single JS file and used with encapsulated styles\n\n```html\n<!-- 4.x example -->\n<div class=\"listbuilder\" id=\"example-listbuilder\" data-init=\"false\">\n  <div class=\"toolbar formatter-toolbar\">\n    <div class=\"buttonset\">\n\n      <button type=\"button\" class=\"btn-secondary\" title=\"Add New\" data-action=\"add\">\n        <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n          <use href=\"#icon-add\"></use>\n        </svg>\n        <span class=\"audible\">Add New</span>\n      </button>\n\n      <div class=\"separator\"></div>\n\n      <button type=\"button\" class=\"btn-secondary\" title=\"Go Up\" data-action=\"goup\">\n          <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n          <use href=\"#icon-up-arrow\"></use>\n          </svg>\n          <span class=\"audible\">Go Up</span>\n      </button>\n\n      <button type=\"button\" class=\"btn-secondary\" title=\"Go Down\" data-action=\"godown\">\n        <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n          <use href=\"#icon-down-arrow\"></use>\n        </svg>\n        <span class=\"audible\">Go Down</span>\n      </button>\n\n      <div class=\"separator\"></div>\n\n      <button type=\"button\" class=\"btn-secondary\" title=\"Edit\" data-action=\"edit\">\n        <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n          <use href=\"#icon-edit\"></use>\n        </svg>\n        <span class=\"audible\">Edit</span>\n      </button>\n      <button type=\"button\" class=\"btn-secondary\" title=\"Delete\" data-action=\"delete\">\n        <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n          <use href=\"#icon-delete\"></use>\n        </svg>\n        <span class=\"audible\">Delete</span>\n      </button>\n\n    </div>\n  </div>\n  <div class=\"listbuilder-content\">\n    <div class=\"listview\"></div>\n  </div>\n</div>\n\n<!-- this is the same using the WebComponent -->\n<ids-list-builder>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n  </template>\n</ids-list-builder>\n```\n"}},{"name":"ids-list-view-group-header","attributes":[{"name":"height","description":"Change the height of the header","values":[]}],"description":{"kind":"markdown","value":"# ids-list-view\n\n## Description\n\nDisplays a set of related data objects and their attributes in list format.\n\n## Use Cases\n\n- Best for limited attribute data that may or may not include clear differentiators like status.\n- Used to display relevant objects. The list view container can feature checkboxes, search bar, hyperlinks, and other elements.\n- Allows users to assign/remove objects. Displays when one or more rows are selected.\n- Can alert users of updates on objects.\n- Lists may be single, multiple or mixed selected\n- Lists can be filter data by using the search field\n- You can have a fixed list toolbar on top, which may contain a title and filtering/search options\n- You can have a contextual toolbar for selected items\n- Pagination is supported\n\n## Terminology\n\n- Card: UI design pattern that groups related information that resembles a card\n- Group Action: A special toolbar inside the card content area that can be used to act on the content.\n\n## Features (With Code Examples)\n\nThis example shows using a list view with an html template element bound to a dataset. This example is showing the list in a card but the card is optional.\n\nThe template shows the use of a string substitution to access the data element. Note that `dataset` is required to loop over the dataset option passed into the control.\n\n```html\n  <ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-list-view id=\"list-view-1\" virtual-scroll=\"true\">\n      <template>\n        <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n      </template>\n    </ids-list-view>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view using `<ids-list-view-item />` child components.\n\n```html\n<ids-list-view selectable=\"mixed\" sortable>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">First Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 1</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: One</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item active>\n    <ids-text font-size=\"16\" type=\"h2\">Second Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 2</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Two</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item disabled>\n    <ids-text font-size=\"16\" type=\"h2\">Third Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 3</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Three</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item selected>\n    <ids-text font-size=\"16\" type=\"h2\">Third Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 3</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Three</ids-text>\n  </ids-list-view-item>\n</ids-list-view>\n```\n\nList view with pagination and mixed selectable type.\n\n```html\n<ids-list-view\n  id=\"list-view-1\"\n  item-height=\"76\"\n  selectable=\"mixed\"\n  pagination=\"client-side\"\n  page-size=\"5\"\n>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\nList view with checkbox and text alignment.\n\n```html\n<ids-list-view\n  id=\"demo-lv-selectable-multiple\"\n  selectable=\"multiple\"\n  item-height=\"76\"\n>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">First Item</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">Second Item</ids-text>\n  </ids-list-view-item>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view with pagination with card footer.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Product List</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-list-view\n      id=\"list-view-1\"\n      pagination=\"client-side\"\n      page-size=\"10\",\n      pager-container=\"#cardfooter-list-view-1\"\n    >\n      <template>\n        <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n      </template>\n    </ids-list-view>\n  </div>\n  <div id=\"cardfooter-list-view-1\" slot=\"card-footer\" no-padding>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view with embellishment types.\n\n```html\n<ids-list-view id=\"list-view-1\">\n  <template>\n    ${#escalated}\n      ${#disabled}\n        <ids-text font-size=\"12\" type=\"span\" status=\"error\" disabled>Escalated (${escalated}X)</ids-text>\n      ${/disabled}\n      ${^disabled}\n        <ids-text font-size=\"12\" type=\"span\" status=\"error\">Escalated (${escalated}X)</ids-text>\n      ${/disabled}\n    ${/escalated}\n    <ids-text font-size=\"16\" font-weight=\"semi-bold\" type=\"p\">${productName}</ids-text>\n    <ids-hyperlink href=\"https://www.example.com/${productId}\" target=\"_blank\">${productId}</ids-hyperlink>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\" text-align=\"end\">$ ${totalPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view using search field.\n\n```html\n<ids-list-view id=\"list-view-1\" searchable>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field thru slot.\n\n```html\n<ids-list-view id=\"list-view-1\">\n  <ids-search-field slot=\"search\" label=\"List view search field\" label-state=\"collapsed\" size=\"full\" clearable no-margins></ids-search-field>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field thru ID.\n\n```html\n  <ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-search-field\n      placeholder=\"Search products\"\n      label=\"List view search field\"\n      color-variant=\"card\"\n      label-state=\"collapsed\"\n      id=\"list-view-1-search-field\"\n      size=\"full\"\n      clearable\n      no-margins\n    ></ids-search-field>\n    <div class=\"list-container\">\n      <ids-list-view id=\"list-view-1\" search-field-id=\"list-view-1-search-field\">\n        <template>\n          <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n          <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n          <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n        </template>\n      </ids-list-view>\n    </div>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field with custom search filter.\n\n```html\n<ids-list-view id=\"list-view-1\" searchable>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n\n  // Set custom search filter to match\n  listView.searchFilterCallback = (term: string) => {\n    const response = (item: any): boolean => {\n      const lcTerm = (term || '').toLowerCase();\n      const lcText = (item.comments || '').toLowerCase();\n\n      const match = lcText.indexOf(lcTerm) >= 0;\n      return !match;\n    };\n    return response;\n  };\n\n  // Set data to list\n  listView.data = products;\n```\n\nList view with Group Headers\n\nTo make a listview with group headers, you can add a `<ids-list-view-group>` element. This can either be added in the markup directly or dynamically added via adding `{idsGroupHeader: true, title: 'My Title'}` in the dataset. Note that the group headers cannot be used in virtual scroll since they are different size and cannot be accurately calculated.\n\n```html\n<ids-list-view>\n  <ids-list-view-group-header>Group one</ids-list-view-group-header>\n  <ids-list-view-item>Item one</ids-list-view-item>\n    <ids-list-view-group-header>Group two</ids-list-view-group-header>\n  <ids-list-view-item>Item two</ids-list-view-item>\n</ids-list-view>\n```\n\n## Settings and Attributes\n\n- `bordered` {boolean} sets whether the list view has borders\n- `height` {number|string} sets the expected height of the viewport for virtual scrolling\n- `hideCheckboxes` {boolean} sets the checkboxes to not render if true, only apply to multiple selection\n- `hidden` {boolean} Hides the element from display\n- `itemHeight` {number|string} sets the expected height of each item\n- `label` {string} sets the aria label text\n- `list` {string} sets the list identifier or configuration\n- `loaded` {boolean} indicates whether data has been loaded into the list view\n- `maxWidth` {string} sets the maximum width of the text (used for ellipsis)\n- `overflow` {string} sets how content overflows; can specify 'ellipsis', or undefined or 'none'\n- `searchFieldId` {string} ID of the search field element to use for the search\n- `searchFilterMode` {'contains'|'keyword'|'phrase-starts-with'|'word-starts-with'} sets the search filter mode\n- `searchTermCaseSensitive` {boolean} sets search term case sensitive\n- `searchTermMinSize` {number} sets search term min size, will trigger filtering only when its length is greater than or equals to term value.\n- `searchable` {boolean} sets searchable which allows list view to be filtered.\n- `selectable` {string} sets the selection mode of the listview: `single`, `multiple`, `mixed`\n- `sortable` {boolean} sets the items to be sortable\n- `suppressDeactivation` {boolean} sets the items to be suppress deactivation for mixed selection only\n- `suppressDeselection` {boolean} sets the items to be suppress deselection for single selection only\n- `suppressHighlight` {boolean} sets search term text to be suppress highlight when using searchable\n- `tooltip` {string} sets the tooltip text for list items\n- `tooltipPlainText` {boolean} sets whether tooltip should be rendered as plain text\n- `virtualScroll` {boolean} sets the list view to use virtual scrolling for a large amount of items. Note that virtual scroll has some limitations. First you must have fixed size items and use the `itemHeight` setting, second you must use the `data` method to feed the data because it used the height and the data to hold the items in the calculation.\n\n## Themeable Parts\n\n- `container` allows you to further style the root container element\n- `listitem` allows you to further style the `<li>` elements text element\n- `search` allows you to further style the list view search slot element\n- `searchfield-container` allows you to further style the list view search-field container element\n- `searchfield-field-container` allows you to further style the list view search-field field container element\n- `searchfield-input` allows you to further style the list view search-field input element\n- `searchfield-popup` allows you to further style the list view search-field popup element\n\n## Events\n\n- `beforeselected` Fires before selected an item, you can return false in the response to veto\n- `selected` Fires after selected an item\n- `click` Fires after clicking an item (consider using activated or selected depending on use case)\n- `dblclick` Fires after double clicking an item (consider using activated or selected depending on use case). Also consider double clicking is not mobile friendly.\n- `beforedeselected` Fires before deselected an item, you can return false in the response to veto\n- `deselected` Fires after deselected an item\n- `beforeactivated` Fires before activated an item, you can return false in the response to veto\n- `activated` Fires after activated an item\n- `beforedeactivated` Fires before deactivated an item, you can return false in the response to veto\n- `deactivated` Fires after deactivated an item\n- `selectionchanged` Fires after selection changed, when use with selectAll(), deselectAll() or toggleAll()\n- `filtered` Fires after search term changed have detail type: 'apply' | 'clear'\n\n## Methods\n\n- `dataIndex(index: number): number|null` Get data index for given page index\n- `items: IdsListViewItem[]` Get all list view items\n- `focusItem(item: IdsListViewItem): void` Set the focus for given list item\n- `activateItem(dataIndex: number): void` Activates an item in mixed mode\n- `deactivateItem(dataIndex: number): void` Deactivates an item in mixed mode\n- `select(dataIndex: number): void` Select an item by data index\n- `deselect(dataIndex: number): void` Deselect an item by data index\n- `itemByIndex(rowIndex: number): IdsListViewItem|undefined` Get the list item DOM element by row index\n- `selectItem(item: IdsListViewItem, selected: boolean): void` Set a list item to be selected; default is true\n- `selectAll(itemsToSelect: Array<{ index: number, selected: boolean }>): void` Select specific (or all) items in list view\n- `deselectAll(): void` Deselect all list items\n- `resetSearch(): void` Reset/Clear the search input and search results\n- `redraw(): void` Re-render the list by reapplying the template\n- `redrawLazy(): void` Calls redraw() asynchronously\n- `appendToBottom(data: Array): void` Add data array to the bottom of the listview\n- `searchFilterCallback(term: string): Function` Set search filter callback, use for custom filter to match\n- `searchableTextCallback(item: object): string` Set searchable text callback\n\n## Properties\n\n- `itemCount` {number} Returns the total number of items in the list view\n- `itemFocused` {IdsListViewItem|null} Returns the currently focused list item element, or null if none is focused\n- `items` {IdsListViewItem[]} Returns an array of all list view item elements\n- `itemsActivated` {IdsListViewItem[]} Returns an array of all currently activated list items\n- `itemsDisabled` {IdsListViewItem[]} Returns an array of all disabled list items\n- `itemsFiltered` {IdsListViewItem[]} Returns an array of all items that match the current search filter (visible items)\n- `itemsChecked` {IdsListViewItem[]} Returns an array of all checked/selected list items in multiple selection mode\n- `itemsSelected` {IdsListViewItem[]} Returns an array of all currently selected list items\n- `itemsSlotted` {IdsListViewItem[]} Returns an array of all list items that are slotted into the component\n- `itemsSwappable` {IdsSwappableItem[]} Returns an array of all items that can be reordered via drag and drop\n- `itemsTabbable` {IdsListViewItem[]} Returns an array of all list items that can receive keyboard focus\n\n## States and Variations (With Code Examples)\n\n- Hover\n- Selected\n- Disabled\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> When a list is tabbed to, select the first item if nothing else is already selected. A second tab will take the user out of the widget to the next tab stop on the page.\n- <kbd>Up/down arrow</kbd> navigate up and down the list.\n- <kbd>Shift+F10</kbd> If the current item has an associated context menu, then this key combination will launch that menu.\n- <kbd>Space</kbd> In mixed mode toggles the selection state. In single and mixed selection mode toggles both the the selection and activates the item\n- <kbd>Enter</kbd> In mixed mode toggles the activation state. In single and mixed selection mode toggles both the selection and activates the item\n\n## Responsive Guidelines\n\n- The list is 100% of the parent container in height and width so can be used in a widget object or responsive grid object.\n- The list body will expand vertically and horizontally to fill it the size of its parent container.\n- When used in homepages, special rules apply with sizes.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Single select roughly replaces the inforListBox component.\n- Multi select is a new feature, however it replaces the listbox with checkboxes construct.\n\n**4.x to 5.x**\n\n- The List View component has been changed to a web component and renamed to ids-list-view.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-list-view></ids-list-view>`\n- If using events events are now plain JS events for example\n- The template is now a template element that uses simple string substitution\n- Can now be imported as a single JS file and used with encapsulated styles (in some browsers)\n- Alternate row colors is deprecated\n\n## Accessibility Guidelines\n\n- 1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1.  All statuses and objects must pass.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n\n## Regional Considerations\n\nTitles should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German) and in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n"}},{"name":"ids-list-view-item","attributes":[{"name":"root-node","values":[]},{"name":"list-view","description":"Reference to the ids-list-view parent element","values":[]},{"name":"next-enabled","values":[]},{"name":"prev-enabled","values":[]},{"name":"data","values":[]},{"name":"row-data","values":[]},{"name":"checkbox","values":[]},{"name":"swappable-parent","values":[]},{"name":"checkbox-hidden","values":[]},{"name":"row-index","description":"Get the row index. This index can be used to lazy-load data from IdsListView.data.","values":[]},{"name":"item-activated","description":"Wrapper function that adds interface to match dataset interface.","values":[]},{"name":"activated","description":"Set the list-item activated state.","values":[]},{"name":"disabled","description":"Get the list-item disabled state.","values":[]},{"name":"item-selected","description":"Wrapper function that adds interface to match dataset interface.","values":[]},{"name":"selectable","description":"Is this list-item selectable","values":[]},{"name":"sortable","description":"Is this list-item sortable","values":[]},{"name":"item-checked","description":"Wrapper function that adds interface to match dataset interface.","values":[]},{"name":"badge","description":"Get the badge text","values":[]},{"name":"badge-color","description":"Get the badge color","values":[]},{"name":"escalated","description":"Get the escalated count","values":[]},{"name":"checked","description":"Set the list-item checked state.","values":[]},{"name":"selected","description":"Set the list-item selected state.","values":[]},{"name":"max-width","description":"Set the max-width of the text (used for ellipsis)","values":[]},{"name":"overflow","description":"Set how content overflows; can specify 'ellipsis', or undefined or 'none'","values":[]}],"description":{"kind":"markdown","value":"# ids-list-view\n\n## Description\n\nDisplays a set of related data objects and their attributes in list format.\n\n## Use Cases\n\n- Best for limited attribute data that may or may not include clear differentiators like status.\n- Used to display relevant objects. The list view container can feature checkboxes, search bar, hyperlinks, and other elements.\n- Allows users to assign/remove objects. Displays when one or more rows are selected.\n- Can alert users of updates on objects.\n- Lists may be single, multiple or mixed selected\n- Lists can be filter data by using the search field\n- You can have a fixed list toolbar on top, which may contain a title and filtering/search options\n- You can have a contextual toolbar for selected items\n- Pagination is supported\n\n## Terminology\n\n- Card: UI design pattern that groups related information that resembles a card\n- Group Action: A special toolbar inside the card content area that can be used to act on the content.\n\n## Features (With Code Examples)\n\nThis example shows using a list view with an html template element bound to a dataset. This example is showing the list in a card but the card is optional.\n\nThe template shows the use of a string substitution to access the data element. Note that `dataset` is required to loop over the dataset option passed into the control.\n\n```html\n  <ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-list-view id=\"list-view-1\" virtual-scroll=\"true\">\n      <template>\n        <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n      </template>\n    </ids-list-view>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view using `<ids-list-view-item />` child components.\n\n```html\n<ids-list-view selectable=\"mixed\" sortable>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">First Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 1</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: One</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item active>\n    <ids-text font-size=\"16\" type=\"h2\">Second Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 2</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Two</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item disabled>\n    <ids-text font-size=\"16\" type=\"h2\">Third Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 3</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Three</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item selected>\n    <ids-text font-size=\"16\" type=\"h2\">Third Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 3</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Three</ids-text>\n  </ids-list-view-item>\n</ids-list-view>\n```\n\nList view with pagination and mixed selectable type.\n\n```html\n<ids-list-view\n  id=\"list-view-1\"\n  item-height=\"76\"\n  selectable=\"mixed\"\n  pagination=\"client-side\"\n  page-size=\"5\"\n>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\nList view with checkbox and text alignment.\n\n```html\n<ids-list-view\n  id=\"demo-lv-selectable-multiple\"\n  selectable=\"multiple\"\n  item-height=\"76\"\n>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">First Item</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">Second Item</ids-text>\n  </ids-list-view-item>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view with pagination with card footer.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Product List</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-list-view\n      id=\"list-view-1\"\n      pagination=\"client-side\"\n      page-size=\"10\",\n      pager-container=\"#cardfooter-list-view-1\"\n    >\n      <template>\n        <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n      </template>\n    </ids-list-view>\n  </div>\n  <div id=\"cardfooter-list-view-1\" slot=\"card-footer\" no-padding>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view with embellishment types.\n\n```html\n<ids-list-view id=\"list-view-1\">\n  <template>\n    ${#escalated}\n      ${#disabled}\n        <ids-text font-size=\"12\" type=\"span\" status=\"error\" disabled>Escalated (${escalated}X)</ids-text>\n      ${/disabled}\n      ${^disabled}\n        <ids-text font-size=\"12\" type=\"span\" status=\"error\">Escalated (${escalated}X)</ids-text>\n      ${/disabled}\n    ${/escalated}\n    <ids-text font-size=\"16\" font-weight=\"semi-bold\" type=\"p\">${productName}</ids-text>\n    <ids-hyperlink href=\"https://www.example.com/${productId}\" target=\"_blank\">${productId}</ids-hyperlink>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\" text-align=\"end\">$ ${totalPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view using search field.\n\n```html\n<ids-list-view id=\"list-view-1\" searchable>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field thru slot.\n\n```html\n<ids-list-view id=\"list-view-1\">\n  <ids-search-field slot=\"search\" label=\"List view search field\" label-state=\"collapsed\" size=\"full\" clearable no-margins></ids-search-field>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field thru ID.\n\n```html\n  <ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-search-field\n      placeholder=\"Search products\"\n      label=\"List view search field\"\n      color-variant=\"card\"\n      label-state=\"collapsed\"\n      id=\"list-view-1-search-field\"\n      size=\"full\"\n      clearable\n      no-margins\n    ></ids-search-field>\n    <div class=\"list-container\">\n      <ids-list-view id=\"list-view-1\" search-field-id=\"list-view-1-search-field\">\n        <template>\n          <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n          <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n          <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n        </template>\n      </ids-list-view>\n    </div>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field with custom search filter.\n\n```html\n<ids-list-view id=\"list-view-1\" searchable>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n\n  // Set custom search filter to match\n  listView.searchFilterCallback = (term: string) => {\n    const response = (item: any): boolean => {\n      const lcTerm = (term || '').toLowerCase();\n      const lcText = (item.comments || '').toLowerCase();\n\n      const match = lcText.indexOf(lcTerm) >= 0;\n      return !match;\n    };\n    return response;\n  };\n\n  // Set data to list\n  listView.data = products;\n```\n\nList view with Group Headers\n\nTo make a listview with group headers, you can add a `<ids-list-view-group>` element. This can either be added in the markup directly or dynamically added via adding `{idsGroupHeader: true, title: 'My Title'}` in the dataset. Note that the group headers cannot be used in virtual scroll since they are different size and cannot be accurately calculated.\n\n```html\n<ids-list-view>\n  <ids-list-view-group-header>Group one</ids-list-view-group-header>\n  <ids-list-view-item>Item one</ids-list-view-item>\n    <ids-list-view-group-header>Group two</ids-list-view-group-header>\n  <ids-list-view-item>Item two</ids-list-view-item>\n</ids-list-view>\n```\n\n## Settings and Attributes\n\n- `bordered` {boolean} sets whether the list view has borders\n- `height` {number|string} sets the expected height of the viewport for virtual scrolling\n- `hideCheckboxes` {boolean} sets the checkboxes to not render if true, only apply to multiple selection\n- `hidden` {boolean} Hides the element from display\n- `itemHeight` {number|string} sets the expected height of each item\n- `label` {string} sets the aria label text\n- `list` {string} sets the list identifier or configuration\n- `loaded` {boolean} indicates whether data has been loaded into the list view\n- `maxWidth` {string} sets the maximum width of the text (used for ellipsis)\n- `overflow` {string} sets how content overflows; can specify 'ellipsis', or undefined or 'none'\n- `searchFieldId` {string} ID of the search field element to use for the search\n- `searchFilterMode` {'contains'|'keyword'|'phrase-starts-with'|'word-starts-with'} sets the search filter mode\n- `searchTermCaseSensitive` {boolean} sets search term case sensitive\n- `searchTermMinSize` {number} sets search term min size, will trigger filtering only when its length is greater than or equals to term value.\n- `searchable` {boolean} sets searchable which allows list view to be filtered.\n- `selectable` {string} sets the selection mode of the listview: `single`, `multiple`, `mixed`\n- `sortable` {boolean} sets the items to be sortable\n- `suppressDeactivation` {boolean} sets the items to be suppress deactivation for mixed selection only\n- `suppressDeselection` {boolean} sets the items to be suppress deselection for single selection only\n- `suppressHighlight` {boolean} sets search term text to be suppress highlight when using searchable\n- `tooltip` {string} sets the tooltip text for list items\n- `tooltipPlainText` {boolean} sets whether tooltip should be rendered as plain text\n- `virtualScroll` {boolean} sets the list view to use virtual scrolling for a large amount of items. Note that virtual scroll has some limitations. First you must have fixed size items and use the `itemHeight` setting, second you must use the `data` method to feed the data because it used the height and the data to hold the items in the calculation.\n\n## Themeable Parts\n\n- `container` allows you to further style the root container element\n- `listitem` allows you to further style the `<li>` elements text element\n- `search` allows you to further style the list view search slot element\n- `searchfield-container` allows you to further style the list view search-field container element\n- `searchfield-field-container` allows you to further style the list view search-field field container element\n- `searchfield-input` allows you to further style the list view search-field input element\n- `searchfield-popup` allows you to further style the list view search-field popup element\n\n## Events\n\n- `beforeselected` Fires before selected an item, you can return false in the response to veto\n- `selected` Fires after selected an item\n- `click` Fires after clicking an item (consider using activated or selected depending on use case)\n- `dblclick` Fires after double clicking an item (consider using activated or selected depending on use case). Also consider double clicking is not mobile friendly.\n- `beforedeselected` Fires before deselected an item, you can return false in the response to veto\n- `deselected` Fires after deselected an item\n- `beforeactivated` Fires before activated an item, you can return false in the response to veto\n- `activated` Fires after activated an item\n- `beforedeactivated` Fires before deactivated an item, you can return false in the response to veto\n- `deactivated` Fires after deactivated an item\n- `selectionchanged` Fires after selection changed, when use with selectAll(), deselectAll() or toggleAll()\n- `filtered` Fires after search term changed have detail type: 'apply' | 'clear'\n\n## Methods\n\n- `dataIndex(index: number): number|null` Get data index for given page index\n- `items: IdsListViewItem[]` Get all list view items\n- `focusItem(item: IdsListViewItem): void` Set the focus for given list item\n- `activateItem(dataIndex: number): void` Activates an item in mixed mode\n- `deactivateItem(dataIndex: number): void` Deactivates an item in mixed mode\n- `select(dataIndex: number): void` Select an item by data index\n- `deselect(dataIndex: number): void` Deselect an item by data index\n- `itemByIndex(rowIndex: number): IdsListViewItem|undefined` Get the list item DOM element by row index\n- `selectItem(item: IdsListViewItem, selected: boolean): void` Set a list item to be selected; default is true\n- `selectAll(itemsToSelect: Array<{ index: number, selected: boolean }>): void` Select specific (or all) items in list view\n- `deselectAll(): void` Deselect all list items\n- `resetSearch(): void` Reset/Clear the search input and search results\n- `redraw(): void` Re-render the list by reapplying the template\n- `redrawLazy(): void` Calls redraw() asynchronously\n- `appendToBottom(data: Array): void` Add data array to the bottom of the listview\n- `searchFilterCallback(term: string): Function` Set search filter callback, use for custom filter to match\n- `searchableTextCallback(item: object): string` Set searchable text callback\n\n## Properties\n\n- `itemCount` {number} Returns the total number of items in the list view\n- `itemFocused` {IdsListViewItem|null} Returns the currently focused list item element, or null if none is focused\n- `items` {IdsListViewItem[]} Returns an array of all list view item elements\n- `itemsActivated` {IdsListViewItem[]} Returns an array of all currently activated list items\n- `itemsDisabled` {IdsListViewItem[]} Returns an array of all disabled list items\n- `itemsFiltered` {IdsListViewItem[]} Returns an array of all items that match the current search filter (visible items)\n- `itemsChecked` {IdsListViewItem[]} Returns an array of all checked/selected list items in multiple selection mode\n- `itemsSelected` {IdsListViewItem[]} Returns an array of all currently selected list items\n- `itemsSlotted` {IdsListViewItem[]} Returns an array of all list items that are slotted into the component\n- `itemsSwappable` {IdsSwappableItem[]} Returns an array of all items that can be reordered via drag and drop\n- `itemsTabbable` {IdsListViewItem[]} Returns an array of all list items that can receive keyboard focus\n\n## States and Variations (With Code Examples)\n\n- Hover\n- Selected\n- Disabled\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> When a list is tabbed to, select the first item if nothing else is already selected. A second tab will take the user out of the widget to the next tab stop on the page.\n- <kbd>Up/down arrow</kbd> navigate up and down the list.\n- <kbd>Shift+F10</kbd> If the current item has an associated context menu, then this key combination will launch that menu.\n- <kbd>Space</kbd> In mixed mode toggles the selection state. In single and mixed selection mode toggles both the the selection and activates the item\n- <kbd>Enter</kbd> In mixed mode toggles the activation state. In single and mixed selection mode toggles both the selection and activates the item\n\n## Responsive Guidelines\n\n- The list is 100% of the parent container in height and width so can be used in a widget object or responsive grid object.\n- The list body will expand vertically and horizontally to fill it the size of its parent container.\n- When used in homepages, special rules apply with sizes.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Single select roughly replaces the inforListBox component.\n- Multi select is a new feature, however it replaces the listbox with checkboxes construct.\n\n**4.x to 5.x**\n\n- The List View component has been changed to a web component and renamed to ids-list-view.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-list-view></ids-list-view>`\n- If using events events are now plain JS events for example\n- The template is now a template element that uses simple string substitution\n- Can now be imported as a single JS file and used with encapsulated styles (in some browsers)\n- Alternate row colors is deprecated\n\n## Accessibility Guidelines\n\n- 1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1.  All statuses and objects must pass.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n\n## Regional Considerations\n\nTitles should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German) and in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n"}},{"name":"ids-list-view-search-mixin","attributes":[{"name":"search-filter-modes","description":"Possible Filter Modes","values":[]},{"name":"search-filter-callback","description":"Search filter callback, use for custom filter to match","values":[]},{"name":"searchable-text-callback","description":"Searchable text callback","values":[]},{"name":"search-term","description":"Current search term","values":[]},{"name":"search-container","description":"Get search container element","values":[]},{"name":"search-field","description":"Get search field element","values":[]},{"name":"search-field-id","description":"Set ID of the search field element to use for the search","values":[]},{"name":"search-filter-mode","description":"Set search filter mode","values":[]},{"name":"search-term-case-sensitive","description":"Set search term case sensitive","values":[]},{"name":"search-term-min-size","description":"Set search term min size, will trigger filtering only when its length is greater than or equals to term value.","values":[]},{"name":"searchable","description":"Set searchable which allows list view to be filtered","values":[]},{"name":"suppress-highlight","description":"Set search term text to be suppress highlight when using searchable","values":[]}],"description":{"kind":"markdown","value":"# ids-list-view\n\n## Description\n\nDisplays a set of related data objects and their attributes in list format.\n\n## Use Cases\n\n- Best for limited attribute data that may or may not include clear differentiators like status.\n- Used to display relevant objects. The list view container can feature checkboxes, search bar, hyperlinks, and other elements.\n- Allows users to assign/remove objects. Displays when one or more rows are selected.\n- Can alert users of updates on objects.\n- Lists may be single, multiple or mixed selected\n- Lists can be filter data by using the search field\n- You can have a fixed list toolbar on top, which may contain a title and filtering/search options\n- You can have a contextual toolbar for selected items\n- Pagination is supported\n\n## Terminology\n\n- Card: UI design pattern that groups related information that resembles a card\n- Group Action: A special toolbar inside the card content area that can be used to act on the content.\n\n## Features (With Code Examples)\n\nThis example shows using a list view with an html template element bound to a dataset. This example is showing the list in a card but the card is optional.\n\nThe template shows the use of a string substitution to access the data element. Note that `dataset` is required to loop over the dataset option passed into the control.\n\n```html\n  <ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-list-view id=\"list-view-1\" virtual-scroll=\"true\">\n      <template>\n        <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n      </template>\n    </ids-list-view>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view using `<ids-list-view-item />` child components.\n\n```html\n<ids-list-view selectable=\"mixed\" sortable>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">First Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 1</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: One</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item active>\n    <ids-text font-size=\"16\" type=\"h2\">Second Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 2</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Two</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item disabled>\n    <ids-text font-size=\"16\" type=\"h2\">Third Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 3</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Three</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item selected>\n    <ids-text font-size=\"16\" type=\"h2\">Third Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 3</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Three</ids-text>\n  </ids-list-view-item>\n</ids-list-view>\n```\n\nList view with pagination and mixed selectable type.\n\n```html\n<ids-list-view\n  id=\"list-view-1\"\n  item-height=\"76\"\n  selectable=\"mixed\"\n  pagination=\"client-side\"\n  page-size=\"5\"\n>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\nList view with checkbox and text alignment.\n\n```html\n<ids-list-view\n  id=\"demo-lv-selectable-multiple\"\n  selectable=\"multiple\"\n  item-height=\"76\"\n>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">First Item</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">Second Item</ids-text>\n  </ids-list-view-item>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view with pagination with card footer.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Product List</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-list-view\n      id=\"list-view-1\"\n      pagination=\"client-side\"\n      page-size=\"10\",\n      pager-container=\"#cardfooter-list-view-1\"\n    >\n      <template>\n        <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n      </template>\n    </ids-list-view>\n  </div>\n  <div id=\"cardfooter-list-view-1\" slot=\"card-footer\" no-padding>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view with embellishment types.\n\n```html\n<ids-list-view id=\"list-view-1\">\n  <template>\n    ${#escalated}\n      ${#disabled}\n        <ids-text font-size=\"12\" type=\"span\" status=\"error\" disabled>Escalated (${escalated}X)</ids-text>\n      ${/disabled}\n      ${^disabled}\n        <ids-text font-size=\"12\" type=\"span\" status=\"error\">Escalated (${escalated}X)</ids-text>\n      ${/disabled}\n    ${/escalated}\n    <ids-text font-size=\"16\" font-weight=\"semi-bold\" type=\"p\">${productName}</ids-text>\n    <ids-hyperlink href=\"https://www.example.com/${productId}\" target=\"_blank\">${productId}</ids-hyperlink>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\" text-align=\"end\">$ ${totalPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view using search field.\n\n```html\n<ids-list-view id=\"list-view-1\" searchable>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field thru slot.\n\n```html\n<ids-list-view id=\"list-view-1\">\n  <ids-search-field slot=\"search\" label=\"List view search field\" label-state=\"collapsed\" size=\"full\" clearable no-margins></ids-search-field>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field thru ID.\n\n```html\n  <ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-search-field\n      placeholder=\"Search products\"\n      label=\"List view search field\"\n      color-variant=\"card\"\n      label-state=\"collapsed\"\n      id=\"list-view-1-search-field\"\n      size=\"full\"\n      clearable\n      no-margins\n    ></ids-search-field>\n    <div class=\"list-container\">\n      <ids-list-view id=\"list-view-1\" search-field-id=\"list-view-1-search-field\">\n        <template>\n          <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n          <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n          <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n        </template>\n      </ids-list-view>\n    </div>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field with custom search filter.\n\n```html\n<ids-list-view id=\"list-view-1\" searchable>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n\n  // Set custom search filter to match\n  listView.searchFilterCallback = (term: string) => {\n    const response = (item: any): boolean => {\n      const lcTerm = (term || '').toLowerCase();\n      const lcText = (item.comments || '').toLowerCase();\n\n      const match = lcText.indexOf(lcTerm) >= 0;\n      return !match;\n    };\n    return response;\n  };\n\n  // Set data to list\n  listView.data = products;\n```\n\nList view with Group Headers\n\nTo make a listview with group headers, you can add a `<ids-list-view-group>` element. This can either be added in the markup directly or dynamically added via adding `{idsGroupHeader: true, title: 'My Title'}` in the dataset. Note that the group headers cannot be used in virtual scroll since they are different size and cannot be accurately calculated.\n\n```html\n<ids-list-view>\n  <ids-list-view-group-header>Group one</ids-list-view-group-header>\n  <ids-list-view-item>Item one</ids-list-view-item>\n    <ids-list-view-group-header>Group two</ids-list-view-group-header>\n  <ids-list-view-item>Item two</ids-list-view-item>\n</ids-list-view>\n```\n\n## Settings and Attributes\n\n- `bordered` {boolean} sets whether the list view has borders\n- `height` {number|string} sets the expected height of the viewport for virtual scrolling\n- `hideCheckboxes` {boolean} sets the checkboxes to not render if true, only apply to multiple selection\n- `hidden` {boolean} Hides the element from display\n- `itemHeight` {number|string} sets the expected height of each item\n- `label` {string} sets the aria label text\n- `list` {string} sets the list identifier or configuration\n- `loaded` {boolean} indicates whether data has been loaded into the list view\n- `maxWidth` {string} sets the maximum width of the text (used for ellipsis)\n- `overflow` {string} sets how content overflows; can specify 'ellipsis', or undefined or 'none'\n- `searchFieldId` {string} ID of the search field element to use for the search\n- `searchFilterMode` {'contains'|'keyword'|'phrase-starts-with'|'word-starts-with'} sets the search filter mode\n- `searchTermCaseSensitive` {boolean} sets search term case sensitive\n- `searchTermMinSize` {number} sets search term min size, will trigger filtering only when its length is greater than or equals to term value.\n- `searchable` {boolean} sets searchable which allows list view to be filtered.\n- `selectable` {string} sets the selection mode of the listview: `single`, `multiple`, `mixed`\n- `sortable` {boolean} sets the items to be sortable\n- `suppressDeactivation` {boolean} sets the items to be suppress deactivation for mixed selection only\n- `suppressDeselection` {boolean} sets the items to be suppress deselection for single selection only\n- `suppressHighlight` {boolean} sets search term text to be suppress highlight when using searchable\n- `tooltip` {string} sets the tooltip text for list items\n- `tooltipPlainText` {boolean} sets whether tooltip should be rendered as plain text\n- `virtualScroll` {boolean} sets the list view to use virtual scrolling for a large amount of items. Note that virtual scroll has some limitations. First you must have fixed size items and use the `itemHeight` setting, second you must use the `data` method to feed the data because it used the height and the data to hold the items in the calculation.\n\n## Themeable Parts\n\n- `container` allows you to further style the root container element\n- `listitem` allows you to further style the `<li>` elements text element\n- `search` allows you to further style the list view search slot element\n- `searchfield-container` allows you to further style the list view search-field container element\n- `searchfield-field-container` allows you to further style the list view search-field field container element\n- `searchfield-input` allows you to further style the list view search-field input element\n- `searchfield-popup` allows you to further style the list view search-field popup element\n\n## Events\n\n- `beforeselected` Fires before selected an item, you can return false in the response to veto\n- `selected` Fires after selected an item\n- `click` Fires after clicking an item (consider using activated or selected depending on use case)\n- `dblclick` Fires after double clicking an item (consider using activated or selected depending on use case). Also consider double clicking is not mobile friendly.\n- `beforedeselected` Fires before deselected an item, you can return false in the response to veto\n- `deselected` Fires after deselected an item\n- `beforeactivated` Fires before activated an item, you can return false in the response to veto\n- `activated` Fires after activated an item\n- `beforedeactivated` Fires before deactivated an item, you can return false in the response to veto\n- `deactivated` Fires after deactivated an item\n- `selectionchanged` Fires after selection changed, when use with selectAll(), deselectAll() or toggleAll()\n- `filtered` Fires after search term changed have detail type: 'apply' | 'clear'\n\n## Methods\n\n- `dataIndex(index: number): number|null` Get data index for given page index\n- `items: IdsListViewItem[]` Get all list view items\n- `focusItem(item: IdsListViewItem): void` Set the focus for given list item\n- `activateItem(dataIndex: number): void` Activates an item in mixed mode\n- `deactivateItem(dataIndex: number): void` Deactivates an item in mixed mode\n- `select(dataIndex: number): void` Select an item by data index\n- `deselect(dataIndex: number): void` Deselect an item by data index\n- `itemByIndex(rowIndex: number): IdsListViewItem|undefined` Get the list item DOM element by row index\n- `selectItem(item: IdsListViewItem, selected: boolean): void` Set a list item to be selected; default is true\n- `selectAll(itemsToSelect: Array<{ index: number, selected: boolean }>): void` Select specific (or all) items in list view\n- `deselectAll(): void` Deselect all list items\n- `resetSearch(): void` Reset/Clear the search input and search results\n- `redraw(): void` Re-render the list by reapplying the template\n- `redrawLazy(): void` Calls redraw() asynchronously\n- `appendToBottom(data: Array): void` Add data array to the bottom of the listview\n- `searchFilterCallback(term: string): Function` Set search filter callback, use for custom filter to match\n- `searchableTextCallback(item: object): string` Set searchable text callback\n\n## Properties\n\n- `itemCount` {number} Returns the total number of items in the list view\n- `itemFocused` {IdsListViewItem|null} Returns the currently focused list item element, or null if none is focused\n- `items` {IdsListViewItem[]} Returns an array of all list view item elements\n- `itemsActivated` {IdsListViewItem[]} Returns an array of all currently activated list items\n- `itemsDisabled` {IdsListViewItem[]} Returns an array of all disabled list items\n- `itemsFiltered` {IdsListViewItem[]} Returns an array of all items that match the current search filter (visible items)\n- `itemsChecked` {IdsListViewItem[]} Returns an array of all checked/selected list items in multiple selection mode\n- `itemsSelected` {IdsListViewItem[]} Returns an array of all currently selected list items\n- `itemsSlotted` {IdsListViewItem[]} Returns an array of all list items that are slotted into the component\n- `itemsSwappable` {IdsSwappableItem[]} Returns an array of all items that can be reordered via drag and drop\n- `itemsTabbable` {IdsListViewItem[]} Returns an array of all list items that can receive keyboard focus\n\n## States and Variations (With Code Examples)\n\n- Hover\n- Selected\n- Disabled\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> When a list is tabbed to, select the first item if nothing else is already selected. A second tab will take the user out of the widget to the next tab stop on the page.\n- <kbd>Up/down arrow</kbd> navigate up and down the list.\n- <kbd>Shift+F10</kbd> If the current item has an associated context menu, then this key combination will launch that menu.\n- <kbd>Space</kbd> In mixed mode toggles the selection state. In single and mixed selection mode toggles both the the selection and activates the item\n- <kbd>Enter</kbd> In mixed mode toggles the activation state. In single and mixed selection mode toggles both the selection and activates the item\n\n## Responsive Guidelines\n\n- The list is 100% of the parent container in height and width so can be used in a widget object or responsive grid object.\n- The list body will expand vertically and horizontally to fill it the size of its parent container.\n- When used in homepages, special rules apply with sizes.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Single select roughly replaces the inforListBox component.\n- Multi select is a new feature, however it replaces the listbox with checkboxes construct.\n\n**4.x to 5.x**\n\n- The List View component has been changed to a web component and renamed to ids-list-view.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-list-view></ids-list-view>`\n- If using events events are now plain JS events for example\n- The template is now a template element that uses simple string substitution\n- Can now be imported as a single JS file and used with encapsulated styles (in some browsers)\n- Alternate row colors is deprecated\n\n## Accessibility Guidelines\n\n- 1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1.  All statuses and objects must pass.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n\n## Regional Considerations\n\nTitles should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German) and in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n"}},{"name":"ids-list-view","attributes":[{"name":"mouse-active","values":[]},{"name":"input-focused","values":[]},{"name":"initialized","description":"Is the component initialized","values":[]},{"name":"#size","description":"The currently list size","values":[]},{"name":"datasource","description":"The datasource container","values":[]},{"name":"default-template","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"item-count","description":"Get the total item count","values":[]},{"name":"item-focused","description":"Get the currently focused item","values":[]},{"name":"items","description":"Get all list view items","values":[]},{"name":"items-activated","description":"Get all activated items","values":[]},{"name":"items-disabled","description":"Get all disabled items","values":[]},{"name":"items-filtered","description":"Get all filtered items (not hidden by search)","values":[]},{"name":"items-checked","description":"Get all checked items","values":[]},{"name":"items-selected","description":"Get all selected items","values":[]},{"name":"items-slotted","description":"Get all slotted items","values":[]},{"name":"items-swappable","description":"Get all swappable items","values":[]},{"name":"items-tabbable","description":"Get all tabbable items","values":[]},{"name":"#last-selected-row","description":"Keep flag for last selected row","values":[]},{"name":"#initially-selected-row","description":"Keep flag for initially selected row","values":[]},{"name":"#redraw-lazy-raf","description":"Used in IdsListView.redrawLazy()","values":[]},{"name":"virtual-scroll-container","description":"Get the virtual scroll container","values":[]},{"name":"body","description":"Get the list view body element","values":[]},{"name":"ds","description":"Get the list of all data from dataset","values":[]},{"name":"data","description":"Get the data array","values":[]},{"name":"loaded","description":"Get whether data has been loaded","values":[]},{"name":"data-keys","description":"Get the data keys","values":[]},{"name":"virtual-scroll","description":"Get whether virtual scrolling is enabled","values":[]},{"name":"height","description":"Get the expected height of the viewport","values":[]},{"name":"item-height","description":"Get the expected height of each item","values":[]},{"name":"selected","description":"Helper setter to set selected items.","values":[]},{"name":"selectable","description":"Get the selection mode","values":[]},{"name":"bordered","description":"Get whether the list view has borders","values":[]},{"name":"sortable","description":"Get whether the list is sortable","values":[]},{"name":"suppress-deactivation","description":"Get whether deactivation is suppressed for mixed selection","values":[]},{"name":"suppress-deselection","description":"Get whether deselection is suppressed for single selection","values":[]},{"name":"hide-checkboxes","description":"Get whether checkboxes are hidden","values":[]},{"name":"label","description":"Get the aria label text","values":[]},{"name":"max-width","description":"Get the max width","values":[]},{"name":"tooltip","description":"Get the tooltip text","values":[]},{"name":"overflow","description":"Get the overflow setting","values":[]},{"name":"tooltip-plain-text","description":"Get the tooltip plain text attribute","values":[]},{"name":"#update-list-item-in-datasource","description":"Update item instance in datasource object via datasource.update function","values":[]}],"description":{"kind":"markdown","value":"# ids-list-view\n\n## Description\n\nDisplays a set of related data objects and their attributes in list format.\n\n## Use Cases\n\n- Best for limited attribute data that may or may not include clear differentiators like status.\n- Used to display relevant objects. The list view container can feature checkboxes, search bar, hyperlinks, and other elements.\n- Allows users to assign/remove objects. Displays when one or more rows are selected.\n- Can alert users of updates on objects.\n- Lists may be single, multiple or mixed selected\n- Lists can be filter data by using the search field\n- You can have a fixed list toolbar on top, which may contain a title and filtering/search options\n- You can have a contextual toolbar for selected items\n- Pagination is supported\n\n## Terminology\n\n- Card: UI design pattern that groups related information that resembles a card\n- Group Action: A special toolbar inside the card content area that can be used to act on the content.\n\n## Features (With Code Examples)\n\nThis example shows using a list view with an html template element bound to a dataset. This example is showing the list in a card but the card is optional.\n\nThe template shows the use of a string substitution to access the data element. Note that `dataset` is required to loop over the dataset option passed into the control.\n\n```html\n  <ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-list-view id=\"list-view-1\" virtual-scroll=\"true\">\n      <template>\n        <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n      </template>\n    </ids-list-view>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view using `<ids-list-view-item />` child components.\n\n```html\n<ids-list-view selectable=\"mixed\" sortable>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">First Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 1</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: One</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item active>\n    <ids-text font-size=\"16\" type=\"h2\">Second Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 2</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Two</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item disabled>\n    <ids-text font-size=\"16\" type=\"h2\">Third Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 3</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Three</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item selected>\n    <ids-text font-size=\"16\" type=\"h2\">Third Column</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">ID: 3</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Comments: Three</ids-text>\n  </ids-list-view-item>\n</ids-list-view>\n```\n\nList view with pagination and mixed selectable type.\n\n```html\n<ids-list-view\n  id=\"list-view-1\"\n  item-height=\"76\"\n  selectable=\"mixed\"\n  pagination=\"client-side\"\n  page-size=\"5\"\n>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\nList view with checkbox and text alignment.\n\n```html\n<ids-list-view\n  id=\"demo-lv-selectable-multiple\"\n  selectable=\"multiple\"\n  item-height=\"76\"\n>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">First Item</ids-text>\n  </ids-list-view-item>\n  <ids-list-view-item>\n    <ids-text font-size=\"16\" type=\"h2\">Second Item</ids-text>\n  </ids-list-view-item>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view with pagination with card footer.\n\n```html\n<ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Product List</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-list-view\n      id=\"list-view-1\"\n      pagination=\"client-side\"\n      page-size=\"10\",\n      pager-container=\"#cardfooter-list-view-1\"\n    >\n      <template>\n        <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n        <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n      </template>\n    </ids-list-view>\n  </div>\n  <div id=\"cardfooter-list-view-1\" slot=\"card-footer\" no-padding>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view with embellishment types.\n\n```html\n<ids-list-view id=\"list-view-1\">\n  <template>\n    ${#escalated}\n      ${#disabled}\n        <ids-text font-size=\"12\" type=\"span\" status=\"error\" disabled>Escalated (${escalated}X)</ids-text>\n      ${/disabled}\n      ${^disabled}\n        <ids-text font-size=\"12\" type=\"span\" status=\"error\">Escalated (${escalated}X)</ids-text>\n      ${/disabled}\n    ${/escalated}\n    <ids-text font-size=\"16\" font-weight=\"semi-bold\" type=\"p\">${productName}</ids-text>\n    <ids-hyperlink href=\"https://www.example.com/${productId}\" target=\"_blank\">${productId}</ids-hyperlink>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\" text-align=\"end\">$ ${totalPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.data = products;\n```\n\nList view using search field.\n\n```html\n<ids-list-view id=\"list-view-1\" searchable>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field thru slot.\n\n```html\n<ids-list-view id=\"list-view-1\">\n  <ids-search-field slot=\"search\" label=\"List view search field\" label-state=\"collapsed\" size=\"full\" clearable no-margins></ids-search-field>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field thru ID.\n\n```html\n  <ids-card>\n  <div slot=\"card-header\">\n    <ids-text font-size=\"20\" type=\"h2\">Card Title One</ids-text>\n  </div>\n  <div slot=\"card-content\">\n    <ids-search-field\n      placeholder=\"Search products\"\n      label=\"List view search field\"\n      color-variant=\"card\"\n      label-state=\"collapsed\"\n      id=\"list-view-1-search-field\"\n      size=\"full\"\n      clearable\n      no-margins\n    ></ids-search-field>\n    <div class=\"list-container\">\n      <ids-list-view id=\"list-view-1\" search-field-id=\"list-view-1-search-field\">\n        <template>\n          <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n          <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n          <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n        </template>\n      </ids-list-view>\n    </div>\n  </div>\n</ids-card>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n  listView.searchableTextCallback = (item: any) => item.productName;\n  listView.data = products;\n```\n\nList view using search field with custom search filter.\n\n```html\n<ids-list-view id=\"list-view-1\" searchable>\n  <template>\n    <ids-text font-size=\"16\" type=\"h2\">${productName}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Count: ${units}</ids-text>\n    <ids-text font-size=\"12\" type=\"span\">Price: $ ${unitPrice}</ids-text>\n  </template>\n</ids-list-view>\n```\n\n```js\n  const listView = document.querySelector('#list-view-1');\n\n  // Set custom search filter to match\n  listView.searchFilterCallback = (term: string) => {\n    const response = (item: any): boolean => {\n      const lcTerm = (term || '').toLowerCase();\n      const lcText = (item.comments || '').toLowerCase();\n\n      const match = lcText.indexOf(lcTerm) >= 0;\n      return !match;\n    };\n    return response;\n  };\n\n  // Set data to list\n  listView.data = products;\n```\n\nList view with Group Headers\n\nTo make a listview with group headers, you can add a `<ids-list-view-group>` element. This can either be added in the markup directly or dynamically added via adding `{idsGroupHeader: true, title: 'My Title'}` in the dataset. Note that the group headers cannot be used in virtual scroll since they are different size and cannot be accurately calculated.\n\n```html\n<ids-list-view>\n  <ids-list-view-group-header>Group one</ids-list-view-group-header>\n  <ids-list-view-item>Item one</ids-list-view-item>\n    <ids-list-view-group-header>Group two</ids-list-view-group-header>\n  <ids-list-view-item>Item two</ids-list-view-item>\n</ids-list-view>\n```\n\n## Settings and Attributes\n\n- `bordered` {boolean} sets whether the list view has borders\n- `height` {number|string} sets the expected height of the viewport for virtual scrolling\n- `hideCheckboxes` {boolean} sets the checkboxes to not render if true, only apply to multiple selection\n- `hidden` {boolean} Hides the element from display\n- `itemHeight` {number|string} sets the expected height of each item\n- `label` {string} sets the aria label text\n- `list` {string} sets the list identifier or configuration\n- `loaded` {boolean} indicates whether data has been loaded into the list view\n- `maxWidth` {string} sets the maximum width of the text (used for ellipsis)\n- `overflow` {string} sets how content overflows; can specify 'ellipsis', or undefined or 'none'\n- `searchFieldId` {string} ID of the search field element to use for the search\n- `searchFilterMode` {'contains'|'keyword'|'phrase-starts-with'|'word-starts-with'} sets the search filter mode\n- `searchTermCaseSensitive` {boolean} sets search term case sensitive\n- `searchTermMinSize` {number} sets search term min size, will trigger filtering only when its length is greater than or equals to term value.\n- `searchable` {boolean} sets searchable which allows list view to be filtered.\n- `selectable` {string} sets the selection mode of the listview: `single`, `multiple`, `mixed`\n- `sortable` {boolean} sets the items to be sortable\n- `suppressDeactivation` {boolean} sets the items to be suppress deactivation for mixed selection only\n- `suppressDeselection` {boolean} sets the items to be suppress deselection for single selection only\n- `suppressHighlight` {boolean} sets search term text to be suppress highlight when using searchable\n- `tooltip` {string} sets the tooltip text for list items\n- `tooltipPlainText` {boolean} sets whether tooltip should be rendered as plain text\n- `virtualScroll` {boolean} sets the list view to use virtual scrolling for a large amount of items. Note that virtual scroll has some limitations. First you must have fixed size items and use the `itemHeight` setting, second you must use the `data` method to feed the data because it used the height and the data to hold the items in the calculation.\n\n## Themeable Parts\n\n- `container` allows you to further style the root container element\n- `listitem` allows you to further style the `<li>` elements text element\n- `search` allows you to further style the list view search slot element\n- `searchfield-container` allows you to further style the list view search-field container element\n- `searchfield-field-container` allows you to further style the list view search-field field container element\n- `searchfield-input` allows you to further style the list view search-field input element\n- `searchfield-popup` allows you to further style the list view search-field popup element\n\n## Events\n\n- `beforeselected` Fires before selected an item, you can return false in the response to veto\n- `selected` Fires after selected an item\n- `click` Fires after clicking an item (consider using activated or selected depending on use case)\n- `dblclick` Fires after double clicking an item (consider using activated or selected depending on use case). Also consider double clicking is not mobile friendly.\n- `beforedeselected` Fires before deselected an item, you can return false in the response to veto\n- `deselected` Fires after deselected an item\n- `beforeactivated` Fires before activated an item, you can return false in the response to veto\n- `activated` Fires after activated an item\n- `beforedeactivated` Fires before deactivated an item, you can return false in the response to veto\n- `deactivated` Fires after deactivated an item\n- `selectionchanged` Fires after selection changed, when use with selectAll(), deselectAll() or toggleAll()\n- `filtered` Fires after search term changed have detail type: 'apply' | 'clear'\n\n## Methods\n\n- `dataIndex(index: number): number|null` Get data index for given page index\n- `items: IdsListViewItem[]` Get all list view items\n- `focusItem(item: IdsListViewItem): void` Set the focus for given list item\n- `activateItem(dataIndex: number): void` Activates an item in mixed mode\n- `deactivateItem(dataIndex: number): void` Deactivates an item in mixed mode\n- `select(dataIndex: number): void` Select an item by data index\n- `deselect(dataIndex: number): void` Deselect an item by data index\n- `itemByIndex(rowIndex: number): IdsListViewItem|undefined` Get the list item DOM element by row index\n- `selectItem(item: IdsListViewItem, selected: boolean): void` Set a list item to be selected; default is true\n- `selectAll(itemsToSelect: Array<{ index: number, selected: boolean }>): void` Select specific (or all) items in list view\n- `deselectAll(): void` Deselect all list items\n- `resetSearch(): void` Reset/Clear the search input and search results\n- `redraw(): void` Re-render the list by reapplying the template\n- `redrawLazy(): void` Calls redraw() asynchronously\n- `appendToBottom(data: Array): void` Add data array to the bottom of the listview\n- `searchFilterCallback(term: string): Function` Set search filter callback, use for custom filter to match\n- `searchableTextCallback(item: object): string` Set searchable text callback\n\n## Properties\n\n- `itemCount` {number} Returns the total number of items in the list view\n- `itemFocused` {IdsListViewItem|null} Returns the currently focused list item element, or null if none is focused\n- `items` {IdsListViewItem[]} Returns an array of all list view item elements\n- `itemsActivated` {IdsListViewItem[]} Returns an array of all currently activated list items\n- `itemsDisabled` {IdsListViewItem[]} Returns an array of all disabled list items\n- `itemsFiltered` {IdsListViewItem[]} Returns an array of all items that match the current search filter (visible items)\n- `itemsChecked` {IdsListViewItem[]} Returns an array of all checked/selected list items in multiple selection mode\n- `itemsSelected` {IdsListViewItem[]} Returns an array of all currently selected list items\n- `itemsSlotted` {IdsListViewItem[]} Returns an array of all list items that are slotted into the component\n- `itemsSwappable` {IdsSwappableItem[]} Returns an array of all items that can be reordered via drag and drop\n- `itemsTabbable` {IdsListViewItem[]} Returns an array of all list items that can receive keyboard focus\n\n## States and Variations (With Code Examples)\n\n- Hover\n- Selected\n- Disabled\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> When a list is tabbed to, select the first item if nothing else is already selected. A second tab will take the user out of the widget to the next tab stop on the page.\n- <kbd>Up/down arrow</kbd> navigate up and down the list.\n- <kbd>Shift+F10</kbd> If the current item has an associated context menu, then this key combination will launch that menu.\n- <kbd>Space</kbd> In mixed mode toggles the selection state. In single and mixed selection mode toggles both the the selection and activates the item\n- <kbd>Enter</kbd> In mixed mode toggles the activation state. In single and mixed selection mode toggles both the selection and activates the item\n\n## Responsive Guidelines\n\n- The list is 100% of the parent container in height and width so can be used in a widget object or responsive grid object.\n- The list body will expand vertically and horizontally to fill it the size of its parent container.\n- When used in homepages, special rules apply with sizes.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Single select roughly replaces the inforListBox component.\n- Multi select is a new feature, however it replaces the listbox with checkboxes construct.\n\n**4.x to 5.x**\n\n- The List View component has been changed to a web component and renamed to ids-list-view.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-list-view></ids-list-view>`\n- If using events events are now plain JS events for example\n- The template is now a template element that uses simple string substitution\n- Can now be imported as a single JS file and used with encapsulated styles (in some browsers)\n- Alternate row colors is deprecated\n\n## Accessibility Guidelines\n\n- 1.1.1 Non-text Content - All images, links and icons have text labels for screen readers when the formatters are used.\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1.  All statuses and objects must pass.\n- 2.1.1 Keyboard - Make all functionality available from a keyboard. The grid has keyboard shortcuts and is usable with a screen reader due to the addition of aria tags.\n\n## Regional Considerations\n\nTitles should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German) and in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n"}},{"name":"ids-loading-indicator-attributes","description":{"kind":"markdown","value":"# ids-loading-indicator\n\n## Description\n\nThe `<ids-loading-indicator>` component is used to notify the user that the system is processing a request, and that they must wait for that request to be processed before continuing with the current task. There are different indicators and UI styles for different scenarios. In previous versions this has been called Loading Indicator or Busy Indicator.\n\n## Use Cases\n\n- Loading indicators tell users about wait times for current processes. Examples can include, searching through a page and submitting a form or a page loading. These indicators communicate the status to the user.\n\n## Terminology\n\n- **Determinate**: Used when there is a defined loading time. These indicators display percentages that help approximate the wait time.\n- **Indeterminate**: Used when there is an undefined loading time. These indicators are for unspecified wait times, and do not include a percentage.\n\n## Features (With Code Examples)\n\nA page loader can be added to a page by adding an ids-loading-indicator to the page and running the scripts. It will not appear until the web component is in a `connnected` state.\n\nA circular and indeterminate indicator will be the default behavior of an `ids-loading-indicator` without attributes passed:\n```html\n<ids-loading-indicator></ids-loading-indicator>\n```\nAdding a `linear` flag sets the indicator to be a linear indicator:\n```html\n<ids-loading-indicator linear></ids-loading-indicator>\n```\n\nSetting any type of indicator's `progress` attribute will cause the indicator to become\ndeterminate and then represent the percentage given by the the attribute. In this example,\nthe progress is at 20% which would mean 20% of the linear indicator will be filled in/marked as\ncomplete.\n\n```html\n<ids-loading-indicator linear progress=\"20\"></ids-loading-indicator>\n```\n\nAdding the `percentage-visible` flag attribute will cause text to show up on an indicator:\n\n```html\n<ids-loading-indicator linear progress=\"20\" percentage-visible></ids-loading-indicator>\n```\n\nAdding a `sticky` attribute will set the indicator to a sticky indicator, which will affix\nthe indicator to the top of the current component.\n\n```html\n<ids-loading-indicator sticky></ids-loading-indicator>\n```\n\nIn the following example, the indicator is determinate, with 10% completion and\naffixed to the top of view it is currently in:\n```html\n<ids-loading-indicator progress=\"10\" sticky></ids-loading-indicator>\n```\n\nThe `contained` setting is a boolean attribute that controls whether the IdsLoadingIndicator is confined within its parent element. When this setting is enabled, the loading indicator will remain within the boundaries of its nearest parent element, preventing it from overflowing or overlapping other content.\n\n```html\n<ids-loading-indicator contained></ids-loading-indicator>\n```\n\n## Settings and Attributes\n\n- `progress` {number | undefined} Represents the percentage completed for the indicator; if not specified, the indicator is set into indeterminate mode (e.g. no specific progress with an animation)\n- `sticky` {boolean} Flags the indicator as a sticky indicator type; causes the indicator to stick to the top of the innermost parent IdsElement and span it horizontally. If set, will flag this indicator as a linear or circular indicator.\n- `linear` {boolean} value Flags the indicator as a linear indicator type; causes the indicator to span its parent component horizontally and become a horizontal/linear bar. If set, removes other current flag types that may be set.\n- `generative-ai` {boolean} value Flags the indicator as a generative-ai indicator type; If set, removes other current flag types that may be set.\n- `percentage-visible` {boolean} Denotes that the percentage text should be visible (not applicable to `sticky` loading indicators).\n- `align` {string} Sets the alignment between 'normal/no' alignment and 'center'\n- `overlay` {boolean} If true adds an overlay so you cannot interact with the page\n- `stopped` {undefined} adding this attribute will hide the busy indicator\n\n## Methods\n\n- `stop()` Stop and hide the loading indicator\n- `start()` Start and show the loading indicator\n\n## Themeable Parts\n- `container` - the loader (svg) container element\n- `progress` - the percentage complete or active part of the indeterminate area\n- `circle` - the circle area which would span what the indicator would at 100% and always on the indicator.\n- `percentage-text` the percentage text shown (when `percentage-visible` flag is set)\n\n## Keyboard Guidelines\n\nNo keyboard shortcuts available -- the loading indicator is only meant to be a visual indicator to the user and not interactive.\n\n## Responsive Guidelines\n\n- if using a `sticky` indicator, the indicator will span 100% of the nearest `relative` positioned div.\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.1 Text Alternatives - Provide text alternatives for any non-text content so that it can be changed into other forms people need, such as large print, braille, speech, symbols or simpler language.\n\n## Regional Considerations\n\nAny Labels should be localized in the current language. The animation should flip in RTL mode (TBD)\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Has all new markup and styles.\n\n**4.x to 5.x**\n\n- Busy Indicator has been renamed to `ids-loading-indicator`.\n- It has all new markup and classes for web components.\n- Markup has changed to a custom element `<ids-loading-indicator></ids-loading-indicator>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- Can change the type of indicator from Circular to Linear by applying a `linear` attribute flag, or make it a sticky/bar indicator that sticks to the top of a component via the `sticky` flag.\n- Can make the indicator determinate by providing a `progress` attribute with a number representing the percentage from 0-100 that the indicator is representing a process completed so far.\n"}},{"name":"ids-loading-indicator","attributes":[{"name":"inline","values":[]},{"name":"progress","values":[]},{"name":"sticky","description":"type; causes the indicator to stick to the top of the innermost IdsElement parent\nand span it horizontally. If set, will unflag this indicator with any other\nflag types set.","values":[]},{"name":"contained","description":"Flags the indicator as being an contained indicator relative to nearest parent","values":[]},{"name":"percentage-visible","values":[]},{"name":"overlay","description":"Set the overlay state between visible and not visible","values":[]},{"name":"linear","description":"causes the indicator to span its parent component horizontally and\nbe represented as a horizontal/linear bar. If set, removes current\nflag types that may be set.","values":[]},{"name":"generative-ai","description":"Set the animation to Gen AI","values":[]},{"name":"align","description":"Set the alignment between normal and center","values":[]},{"name":"type","values":[]},{"name":"#type","description":"type-flag set based on attributes","values":[]}],"description":{"kind":"markdown","value":"# ids-loading-indicator\n\n## Description\n\nThe `<ids-loading-indicator>` component is used to notify the user that the system is processing a request, and that they must wait for that request to be processed before continuing with the current task. There are different indicators and UI styles for different scenarios. In previous versions this has been called Loading Indicator or Busy Indicator.\n\n## Use Cases\n\n- Loading indicators tell users about wait times for current processes. Examples can include, searching through a page and submitting a form or a page loading. These indicators communicate the status to the user.\n\n## Terminology\n\n- **Determinate**: Used when there is a defined loading time. These indicators display percentages that help approximate the wait time.\n- **Indeterminate**: Used when there is an undefined loading time. These indicators are for unspecified wait times, and do not include a percentage.\n\n## Features (With Code Examples)\n\nA page loader can be added to a page by adding an ids-loading-indicator to the page and running the scripts. It will not appear until the web component is in a `connnected` state.\n\nA circular and indeterminate indicator will be the default behavior of an `ids-loading-indicator` without attributes passed:\n```html\n<ids-loading-indicator></ids-loading-indicator>\n```\nAdding a `linear` flag sets the indicator to be a linear indicator:\n```html\n<ids-loading-indicator linear></ids-loading-indicator>\n```\n\nSetting any type of indicator's `progress` attribute will cause the indicator to become\ndeterminate and then represent the percentage given by the the attribute. In this example,\nthe progress is at 20% which would mean 20% of the linear indicator will be filled in/marked as\ncomplete.\n\n```html\n<ids-loading-indicator linear progress=\"20\"></ids-loading-indicator>\n```\n\nAdding the `percentage-visible` flag attribute will cause text to show up on an indicator:\n\n```html\n<ids-loading-indicator linear progress=\"20\" percentage-visible></ids-loading-indicator>\n```\n\nAdding a `sticky` attribute will set the indicator to a sticky indicator, which will affix\nthe indicator to the top of the current component.\n\n```html\n<ids-loading-indicator sticky></ids-loading-indicator>\n```\n\nIn the following example, the indicator is determinate, with 10% completion and\naffixed to the top of view it is currently in:\n```html\n<ids-loading-indicator progress=\"10\" sticky></ids-loading-indicator>\n```\n\nThe `contained` setting is a boolean attribute that controls whether the IdsLoadingIndicator is confined within its parent element. When this setting is enabled, the loading indicator will remain within the boundaries of its nearest parent element, preventing it from overflowing or overlapping other content.\n\n```html\n<ids-loading-indicator contained></ids-loading-indicator>\n```\n\n## Settings and Attributes\n\n- `progress` {number | undefined} Represents the percentage completed for the indicator; if not specified, the indicator is set into indeterminate mode (e.g. no specific progress with an animation)\n- `sticky` {boolean} Flags the indicator as a sticky indicator type; causes the indicator to stick to the top of the innermost parent IdsElement and span it horizontally. If set, will flag this indicator as a linear or circular indicator.\n- `linear` {boolean} value Flags the indicator as a linear indicator type; causes the indicator to span its parent component horizontally and become a horizontal/linear bar. If set, removes other current flag types that may be set.\n- `generative-ai` {boolean} value Flags the indicator as a generative-ai indicator type; If set, removes other current flag types that may be set.\n- `percentage-visible` {boolean} Denotes that the percentage text should be visible (not applicable to `sticky` loading indicators).\n- `align` {string} Sets the alignment between 'normal/no' alignment and 'center'\n- `overlay` {boolean} If true adds an overlay so you cannot interact with the page\n- `stopped` {undefined} adding this attribute will hide the busy indicator\n\n## Methods\n\n- `stop()` Stop and hide the loading indicator\n- `start()` Start and show the loading indicator\n\n## Themeable Parts\n- `container` - the loader (svg) container element\n- `progress` - the percentage complete or active part of the indeterminate area\n- `circle` - the circle area which would span what the indicator would at 100% and always on the indicator.\n- `percentage-text` the percentage text shown (when `percentage-visible` flag is set)\n\n## Keyboard Guidelines\n\nNo keyboard shortcuts available -- the loading indicator is only meant to be a visual indicator to the user and not interactive.\n\n## Responsive Guidelines\n\n- if using a `sticky` indicator, the indicator will span 100% of the nearest `relative` positioned div.\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.1 Text Alternatives - Provide text alternatives for any non-text content so that it can be changed into other forms people need, such as large print, braille, speech, symbols or simpler language.\n\n## Regional Considerations\n\nAny Labels should be localized in the current language. The animation should flip in RTL mode (TBD)\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Has all new markup and styles.\n\n**4.x to 5.x**\n\n- Busy Indicator has been renamed to `ids-loading-indicator`.\n- It has all new markup and classes for web components.\n- Markup has changed to a custom element `<ids-loading-indicator></ids-loading-indicator>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- Can change the type of indicator from Circular to Linear by applying a `linear` attribute flag, or make it a sticky/bar indicator that sticks to the top of a component via the `sticky` flag.\n- Can make the indicator determinate by providing a `progress` attribute with a number representing the percentage from 0-100 that the indicator is representing a process completed so far.\n"}},{"name":"ids-lookup","attributes":[{"name":"apply-button","values":[]},{"name":"data-grid","values":[]},{"name":"list-box","values":[]},{"name":"search-field","values":[]},{"name":"state","values":[]},{"name":"modal","description":"Get the modal element","values":[]},{"name":"is-form-component","values":[]},{"name":"trigger-field","description":"Get the trigger field element","values":[]},{"name":"trigger-button","description":"Get the trigger button element","values":[]},{"name":"loading-indicator","description":"Get the datagrid's loading indicator element","values":[]},{"name":"autocomplete","description":"Get the autocomplete attribute","values":[]},{"name":"value","description":"Get the current value","values":[]},{"name":"readonly","description":"Get the readonly state","values":[]},{"name":"disabled","description":"Get the disabled state","values":[]},{"name":"tabbable","description":"Get whether the trigger button is tabbable","values":[]},{"name":"pagination","description":"Get the pagination type","values":[]},{"name":"page-size","description":"Get the page size","values":[]},{"name":"page-number","description":"Get the page number","values":[]},{"name":"columns","description":"Get the columns array","values":[]},{"name":"data","description":"Get the data array","values":[]},{"name":"search-term-case-sensitive","description":"Set the search term case sensitivity","values":[]},{"name":"data-grid-settings","description":"Get the data grid settings","values":[]},{"name":"validate","description":"Get the validation check","values":[]},{"name":"validation-events","description":"Get the validation events","values":[]},{"name":"#title","description":"Get the modal title","values":[]},{"name":"field","description":"Get the field to use when populating the input","values":[]},{"name":"searchable","description":"Get whether the modal has a search field","values":[]},{"name":"searchfield-placeholder","description":"Get the searchfield placeholder text","values":[]},{"name":"record-count","description":"Get the record count","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"size","description":"Get the dropdown size","values":[]},{"name":"delimiter","description":"Get the string delimiter on selection","values":[]},{"name":"input","description":"Get the trigger field reference","values":[]},{"name":"clearable","description":"Get whether the clearable x button is enabled","values":[]},{"name":"placeholder","description":"Get the placeholder text","values":[]},{"name":"id","description":"Get the id","values":[]},{"name":"height","description":"Get the fixed height of the lookup modal","values":[]},{"name":"on-trigger-click","values":[]},{"name":"selected-values","values":[]}],"description":{"kind":"markdown","value":"# ids-lookup\n\n## Description\n\nA lookup is an input element that opens a modal with a data grid list for selecting grid rows.\n\nAllows for users to select from multiple complex options via input field component. Single selection and multi selection can be possible in the modal dialog by setting the data grid settings.\n\n## Use Cases\n\n- Best used when users need more contextual information around selecting options from the grid columns.\n- Use when you want users to contribute data to your website and let them organize their content themselves.\n\n## Terminology\n\n- **Grid/Data Grid**: Refers to a data grid when in a lookup as apposed to a responsive grid.\n\n## Features (With Code Examples)\n\nA normal lookup used as a web component. To distinguish between single and multi-select situations, use a checkbox column in multi-select and consider a radio select for single select. The set the appropriate settings in the data grid.\n\n```html\n<ids-lookup id=\"lookup-1\" label=\"Normal Lookup\"></ids-lookup>\n```\n\nIf necessary you can provide your own custom modal to the lookup. When doing this you control the modal contents and events entirely. The lookup will just open it for you. Add the `confirm` or the `cancel` attribute to your custom modal-button to set which action should take place.\n\n```html\n<ids-lookup id=\"custom-lookup\" label=\"Custom Lookup\">\n    <ids-modal slot=\"lookup-modal\" id=\"custom-lookup-modal\" aria-labelledby=\"custom-lookup-modal-title\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\" id=\"lookup-modal-title\">Custom Lookup Modal</ids-text>\n    <ids-modal-button slot=\"buttons\" cancel id=\"modal-confirm-btn\" appearance=\"primary\">\n        <span>Cancel</span>\n    </ids-modal-button>\n    <ids-modal-button slot=\"buttons\" confirm id=\"modal-close-btn\" appearance=\"primary\">\n        <span>Apply</span>\n    </ids-modal-button>\n    </ids-modal>\n</ids-lookup>\n```\n\nTo set all of the datagrid setting, pass the settings to the gridSettings property.\n\n```js\nlookup.dataGridSettings = {\n  rowSelection: 'multiple',\n  pageSize: 5,\n  pageNumber: 1,\n  pagination: 'client-side'\n};\nlookup.data = data;\n```\n\nSet the sizes, available sizes are `'xs'|'sm'|'mm'|'md'|'lg'|'full'` and default type is `size=\"md\"`.\n\n```html\n<ids-lookup label=\"Default\" value=\"opt3\"></ids-lookup>\n<ids-lookup label=\"Extra Small\" value=\"1\" size=\"xs\"></ids-lookup>\n<ids-lookup label=\"Small\" value=\"opt3\" size=\"sm\"></ids-lookup>\n<ids-lookup label=\"Small - Medium\" value=\"opt3\" size=\"mm\"></ids-lookup>\n<ids-lookup label=\"Medium\" value=\"opt3\" size=\"md\"></ids-lookup>\n<ids-lookup label=\"Large\" value=\"opt3\" size=\"lg\"></ids-lookup>\n<ids-lookup label=\"Full\" value=\"opt3\" size=\"full\"></ids-lookup>\n```\n\n### Lookup search\n\nWith a few settings, its possible to have the lookup modal add a search field that will provide events to facilitate searching for results. In the example we show a search field, when typing and hitting enter an event fires that lets you go to the server and get data or do whatever is required. When a `cleared` event fires you can reset the query. The developer is responsible for all the logic. We just provide an `ids-search-field` and events and a few settings.\n\nAdd `searchable=\"true\"` and an optional placeholder text in the search field.\n\n```html\n<ids-lookup\n    id=\"lookup-1\"\n    label=\"Items\"\n    title=\"Select an Item\"\n    field=\"id\"\n    value=\"4,5\"\n    searchable=\"true\"\n    searchfield-placeholder=\"Search for an item\"\n></ids-lookup>\n```\n\nThen use the `search` and `cleared` events to implement search logic. The events will fire when typing and then hitting enter or hitting the clear X button. For the example we use the same pretend back end data, fetch it and run the filtering over the datagrid filter event. Only one column was implemented in this example (color).\n\n```js\n  let searchTerm = '';\n  const checkRow = (row: Record<string, unknown>) => !(row.color as string)?.includes(searchTerm);\n\n  lookup.addEventListener('search', async (e: Event) => {\n    const res = await fetch(url);\n    const data = await res.json();\n    lookup.data = data;\n    searchTerm = (e as CustomEvent).detail.searchTerm;\n    lookup.dataGrid?.datasource.filter(checkRow);\n    lookup.dataGrid?.redrawBody();\n    lookup.recordCount = String(lookup.dataGrid?.datasource.data.length);\n    console.info(`Search term changed`);\n  });\n\n  lookup.addEventListener('cleared', async () => {\n    const res = await fetch(url);\n    const data = await res.json();\n    lookup.data = data;\n    lookup.recordCount = data.length;\n    console.info(`Search term cleared`);\n  });\n```\n\n## Settings and Attributes\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `autocomplete` {boolean} Sets the lookup to autocomplete, it will use the data for autocomplete / typeahead selection\n- `disabled` {boolean} Sets the lookup to disabled state.\n- `readonly` {boolean} Sets the lookup to readonly state.\n- `field` {string} Sets the field to use in the data set when selecting.\n- `label` {string} Sets the label on the input.\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `gridSettings` {object} An object containing name/value pairs for all the settings you want to pass to the data grid in the modal\n- `columns` {Array<object>} Sets the data array of the data grid. This can be a JSON Array.\n- `data` {Array<object>} Sets the columns array of the data grid. See column settings.\n- `validate` {'required' | string} Sets the validation routine to use\n- `validationEvents` {'blur' | string} Sets the validation events to use\n- `value` {string} Sets the field value, use commas to delimit multiple values.\n- `title` {string} Sets the title on the lookup.\n- `searchable` {boolean} Sets the lookup to searchable, appending a search field at the top of the modal\n- `searchfield-placeholder` {string} Sets the placeholder text on the searchfield if searchable is true.\n- `record-count` {string} If set will append a record count to the modal title on the lookup\n- `height` {string} - Sets a specific height for the lookup's content area (e.g., \"325px\", \"20rem\")\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n\n### Height\n\nThe `height` attribute allows you to set a specific height for the lookup's content area. When set, the content area will maintain this exact height and add scrolling when the content exceeds it.\n\n```html\n<ids-lookup\n  height=\"325px\"\n  label=\"Single selection lookup\"\n  title=\"Select an Item\"\n  field=\"productId\">\n</ids-lookup>\n\n## Events\n\n- `change` Fires when the lookup is changed and blurred, or selecting rows in the lookup modal\n- `input` Fires when the lookup is changed either by typing, or selecting rows in the lookup modal\n- `search` Fires when enabling `searchable=\"true\"` and then typing and hitting enter in the search field on the modal\n- `clear` Fires if `searchable=\"true\"` and you clear the search field by hitting the `x` button\n- `beforerowselected` Fires before selecting a row and can be vetoed\n- `rowselected` Fires when a row is selected on the lookup modal\n- `beforerowdeselected` Fires before deselecting a row and can be vetoed\n- `rowdeselected` Fires when a row is deselected on the lookup modal\n- `selectionchanged` Fires when selection has changed (either a row was deselected or selected)\n\n## Themeable Parts\n\n- `checkbox` allows you to further style the checkbox input element\n- `trigger-field` allows you to further style the trigger container\n- `input`  allows you to further style the input element\n- `trigger-button` allows you to further style the trigger button\n- `icon` allows you to further style the icon in the trigger button\n- `modal`  allows you to further style the modal dialog container\n- `data-grid` allows you to further style the data grid element\n\n## States and Variations\n\n- Default: The normal, unaltered state for lookups.\n- Hover: The state where a user moves over the lookup field with their cursor.\n- Focus: Indicates that the user has tabbed through and highlighted the lookup.\n- Disabled When the lookup is unable to be changed due to its dependence on other factors or partial irrelevance. Since these states can sometimes lead to confusion, it's useful to pair this state with a Tooltip explanation as to why it's disabled.\n- Readonly A lookup state where the selection is only, ever for viewing. While the information cannot be changed, users can copy and view the data. In general a label and value can also be used for read only states as well.\n- Error: The state where the user has interacted with the field and received an error. The lookup field is able to explain what caused the error below.\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: Moves focus into the field to/from the next focusable item in the tab order\n- <kbd>Down Arrow</kbd>: Opens the dialog if the input is enabled\n- <kbd>Esc</kbd>: Cancels and closes the open dialog\n- <kbd>Tab/Shift+Tab</kbd>: Tab and Shift Tab when the dialog is open, tab will move around the items, for example, from the search to the data grid\n- <kbd>Down/Up Arrow</kbd>: When focus is on the grid in the dialog this moves the focus up and down on the rows\n- <kbd>Space</kbd>: Toggle selection on the current row if multiselect. If single select, the row is selected and inserted if autoApply is enabled\n\n## Responsive Guidelines\n\n- Default size is 300px wide but there are a number of widths in mobile mode it will go to 100%\n- The dialog stretches to 100% - 16px at smaller breakpoints\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Lookup had all new markup and classes for web components.\n- inforLookup class changed to lookup\n- Initialization options and API is different\n- Uses events rather than callbacks\n\n**4.x to 5.x**\n\n- It has all new markup and classes for web components.\n- Markup has changed to a custom element `<ids-lookup></ids-lookup>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- Greatly simplified the API\n\n## Accessibility Guidelines\n\n- There should be a label on all lookups to give an indication what the field is containing.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The close and link icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-mask-api","attributes":[{"name":"masks","values":[]}],"description":{"kind":"markdown","value":"# Ids Mask Mixin\n\nThe Mask Mixin allows for finer control of text entered into an [Ids Input Component](../ids-input/README.md), and related components.  For example, a masked input field can be configured to only allow numbers and dashes, allowing for entry of a credit card number.  The Mask Mixin is also used in components like [Ids Date Picker](../ids-date-picker/README.md) or [Ids Time Picker](../ids-time-picker/README.md) to only allow dates/times to be entered in those fields, respectively.  The contents of the input field are modified as the user types into the field, allowing for instantaneous feedback.\n\n## Use Cases\n\nMasked input fields are used in the following cases:\n\n- Limiting text input to simple patterns, such as credit cards and phone numbers.\n- Automatically formatting numbers, dates, and times to match the current [Locale](./locale).\n\n## Terminology\n\n**Literal Character** - in a mask array, the literal characters are automatically filled in by the mask as the user types characters that match the surrounding pattern.  These characters may also be keyed in by the user.  For example, in a U.S.phone number that includes an area code, literal characters may be the parenthesis `()`, or the dashes `-` between the numbers.\n**Pattern Character** - in a mask array, pattern characters are represented by Regular Expressions.  When a user is typing into a masked field, if they type a character that matches a particular position's pattern character, that input will be accepted.  Otherwise, the input is thrown away.  For example, if the pattern character is `/\\d/` at index 0 inside a masked input field, and the user types \"0\", that number will be accepted and entered in the input.  However, if the user types \"A\", that input will be rejected.\n**Mask Function** a mask function is a Javascript function that takes two arguments (the value, and mask-specific options) that can be used to generate a mask pattern dynamically.  This is useful for input elements that mask against an indeterminate number of characters, or that need to alter the mask based on dynamic conditions. For example, the built in Date Masking function can support single or double digit Months and Days, but needs to alter the mask provided to date fields dynamically based on prior input.\n**Mask Array** a mask array (or pattern) is the array of literal and pattern characters used internally by masked input fields to resolve allowed input.  The contents of this array are the limiting factor for user input.\n**Mask Options** a setting on input fields that can define extra options that will be considered by a defined Mask function.\n\n## Features (With Code Samples)\n\n### Using Mask Arrays\n\nMasks can be applied very simply to an Ids Input by accessing its Javascript properties for masking.  Consider the following example:\n\n```html\n<ids-input id=\"my-input\" label=\"Phone Number\"></ids-input>\n```\n\nUsing Javascript, we can add a mask array using the following:\n\n```js\nconst input = document.querySelector('my-input');\ninput.mask = ['(', /\\d/, /\\d/, /\\d/, ')', ' ', /\\d/, /\\d/, /\\d/, '-', /\\d/, /\\d/, /\\d/, /\\d/ ];\n```\n\nNow when the user types into the field, the only input that will be accepted are numbers that fit within the contents of this array:\n\n```js\ninput.value = 'x1x2x3x4x5x6x7x8x9x0x';\n\nconsole.info(input.value);\n// returns '(123) 456-7890\n```\n\nThe contents of a mask array can be defined using any number of \"literal\" string characters (not replaced by masking, but will be filled in automatically), as well as regular expression-based \"pattern\" characters.  Regular expressions inside the mask array should be designed to match a single character.\n\n### Using Mask Functions\n\nIn some cases Masks need to be dynamic, changing in size to fit a particular kind of input.  Mask functions are capable of analyzing the raw value passed to the Mask API before returning a mask array.  This can be useful if you need to mask a specific section of input differently for several cases.\n\nMask functions take two arguments -- a string containing the raw value that will eventually be masked, and an object containing whatever settings your function will need for compiling the mask array and analyzing the raw value.  Mask functions should always eventually return a Mask Array of string literals and single-character regular expressions.\n\nA very basic example of a custom mask function would look like this:\n\n```js\nfunction customMaskFunction(rawValue, options) {\n  let arr = [];\n  // do some analysis on the raw value\n  // ...\n  return arr;\n}\n```\n\nIf a developer wished to build a mask function that always placed a suffix at the end of an indeterminately-sized number, it could be done this way:\n\n```js\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  suffix: '%'\n};\ninput.mask = (rawValue, opts) => {\n  const totalDigits = rawValue.split('').map(() => /\\d/);\n  return [...totalDigits, opts.suffix];\n};\n```\n\n### Built-in Mask Functions\n\nIds Mask comes with some built in masking functions.  These hook into other IDS components and utilities to provide localization and formatting.\n\n#### Date Masks\n\nFor example, configuring an input field to mask as a U.S. localized short-hand date could be done this way:\n\n```js\nimport { dateMask } from 'ids-enterprise-wc'\n\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  format: 'M/d/yyyy'\n};\ninput.mask = dateMask;\n```\n\nAs a convenience, built-in masks can also be automatically applied with shorthand string-based syntax:\n\n```js\ninput.mask = 'date';\n```\n\nWhen using the date mask this way, the automatically-applied date format will be a short date format supplied by [IdsLocale](../ids-locale/README.MD).\n\n#### Number Mask\n\nAnother example is configuring an input field to mask a fully-formatted number, with proper localization of thousands separator, decimal, and currency symbol placement.  An example of configuring the field for a U.S. localized formatted number could be this:\n\n```js\nimport { numberMask } from 'ids-enterprise-wc'\n\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  allowDecimal: true,\n  allowNegative: true,\n  decimalLimit: 2,\n  integerLimit: 7,\n  prefix: '$'\n};\ninput.mask = numberMask;\n```\n\nAs a convenience, the number formatter can also be applied by string:\n\n```js\ninput.mask = 'number';\n```\n\nWhen using the number mask this way, the number will be formatted with localized decimal, thousands (group) separator, negative, and currency symbols supplied by [IdsLocale](../ids-locale/README.MD).\n\n## Settings (Attributes)\n\n- `mask` {Array<string|RegExp>|Function} the mask that is applied to the input.\n- `mask-options` {object} options that will be applied to a masking function in progress.\n- `mask-retain-positions` {boolean} if true, combined with guides, creates masked input that allows sections between literal characters to be removed/replaced without altering the position of the characters in other sections.\n- `mask-guide` {boolean} if true, displays the complete mask as a \"placeholder\" in the input field once input has been entered.  Pattern characters are represented as `_` or other defined character, and literal characters are shown in-line.  This feature is only applicable to array-based pattern masks.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Mask is a new component in 4.0.0\n- Invoke with `.mask()` on any `<input type=\"text\">` element\n\n**4.x to 5.x**\n\n- Mask is now an Ids Mixin applied to [IdsInput](../ids-input/README.md)\n- To enable a mask, all that's necessary is to define the `mask` attribute of an IdsInput\n- If using events, events are now plain JS events\n- 4.x `patternOptions` settings are applied to masks with the `mask-options` attribute on IdsInput. All the previous built-in mask settings have remained unchanged between 4.x and 5.x\n- When using `mask=\"date\"` on the element, an [IdsLocale](../ids-locale/README.md)-driven date format is applied to the field's mask\n- When using `mask=\"number\"` on the element, an [IdsLocale](../ids-locale/README.md)-driven number format is applied to the field's mask\n"}},{"name":"ids-mask-common","description":{"kind":"markdown","value":"# Ids Mask Mixin\n\nThe Mask Mixin allows for finer control of text entered into an [Ids Input Component](../ids-input/README.md), and related components.  For example, a masked input field can be configured to only allow numbers and dashes, allowing for entry of a credit card number.  The Mask Mixin is also used in components like [Ids Date Picker](../ids-date-picker/README.md) or [Ids Time Picker](../ids-time-picker/README.md) to only allow dates/times to be entered in those fields, respectively.  The contents of the input field are modified as the user types into the field, allowing for instantaneous feedback.\n\n## Use Cases\n\nMasked input fields are used in the following cases:\n\n- Limiting text input to simple patterns, such as credit cards and phone numbers.\n- Automatically formatting numbers, dates, and times to match the current [Locale](./locale).\n\n## Terminology\n\n**Literal Character** - in a mask array, the literal characters are automatically filled in by the mask as the user types characters that match the surrounding pattern.  These characters may also be keyed in by the user.  For example, in a U.S.phone number that includes an area code, literal characters may be the parenthesis `()`, or the dashes `-` between the numbers.\n**Pattern Character** - in a mask array, pattern characters are represented by Regular Expressions.  When a user is typing into a masked field, if they type a character that matches a particular position's pattern character, that input will be accepted.  Otherwise, the input is thrown away.  For example, if the pattern character is `/\\d/` at index 0 inside a masked input field, and the user types \"0\", that number will be accepted and entered in the input.  However, if the user types \"A\", that input will be rejected.\n**Mask Function** a mask function is a Javascript function that takes two arguments (the value, and mask-specific options) that can be used to generate a mask pattern dynamically.  This is useful for input elements that mask against an indeterminate number of characters, or that need to alter the mask based on dynamic conditions. For example, the built in Date Masking function can support single or double digit Months and Days, but needs to alter the mask provided to date fields dynamically based on prior input.\n**Mask Array** a mask array (or pattern) is the array of literal and pattern characters used internally by masked input fields to resolve allowed input.  The contents of this array are the limiting factor for user input.\n**Mask Options** a setting on input fields that can define extra options that will be considered by a defined Mask function.\n\n## Features (With Code Samples)\n\n### Using Mask Arrays\n\nMasks can be applied very simply to an Ids Input by accessing its Javascript properties for masking.  Consider the following example:\n\n```html\n<ids-input id=\"my-input\" label=\"Phone Number\"></ids-input>\n```\n\nUsing Javascript, we can add a mask array using the following:\n\n```js\nconst input = document.querySelector('my-input');\ninput.mask = ['(', /\\d/, /\\d/, /\\d/, ')', ' ', /\\d/, /\\d/, /\\d/, '-', /\\d/, /\\d/, /\\d/, /\\d/ ];\n```\n\nNow when the user types into the field, the only input that will be accepted are numbers that fit within the contents of this array:\n\n```js\ninput.value = 'x1x2x3x4x5x6x7x8x9x0x';\n\nconsole.info(input.value);\n// returns '(123) 456-7890\n```\n\nThe contents of a mask array can be defined using any number of \"literal\" string characters (not replaced by masking, but will be filled in automatically), as well as regular expression-based \"pattern\" characters.  Regular expressions inside the mask array should be designed to match a single character.\n\n### Using Mask Functions\n\nIn some cases Masks need to be dynamic, changing in size to fit a particular kind of input.  Mask functions are capable of analyzing the raw value passed to the Mask API before returning a mask array.  This can be useful if you need to mask a specific section of input differently for several cases.\n\nMask functions take two arguments -- a string containing the raw value that will eventually be masked, and an object containing whatever settings your function will need for compiling the mask array and analyzing the raw value.  Mask functions should always eventually return a Mask Array of string literals and single-character regular expressions.\n\nA very basic example of a custom mask function would look like this:\n\n```js\nfunction customMaskFunction(rawValue, options) {\n  let arr = [];\n  // do some analysis on the raw value\n  // ...\n  return arr;\n}\n```\n\nIf a developer wished to build a mask function that always placed a suffix at the end of an indeterminately-sized number, it could be done this way:\n\n```js\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  suffix: '%'\n};\ninput.mask = (rawValue, opts) => {\n  const totalDigits = rawValue.split('').map(() => /\\d/);\n  return [...totalDigits, opts.suffix];\n};\n```\n\n### Built-in Mask Functions\n\nIds Mask comes with some built in masking functions.  These hook into other IDS components and utilities to provide localization and formatting.\n\n#### Date Masks\n\nFor example, configuring an input field to mask as a U.S. localized short-hand date could be done this way:\n\n```js\nimport { dateMask } from 'ids-enterprise-wc'\n\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  format: 'M/d/yyyy'\n};\ninput.mask = dateMask;\n```\n\nAs a convenience, built-in masks can also be automatically applied with shorthand string-based syntax:\n\n```js\ninput.mask = 'date';\n```\n\nWhen using the date mask this way, the automatically-applied date format will be a short date format supplied by [IdsLocale](../ids-locale/README.MD).\n\n#### Number Mask\n\nAnother example is configuring an input field to mask a fully-formatted number, with proper localization of thousands separator, decimal, and currency symbol placement.  An example of configuring the field for a U.S. localized formatted number could be this:\n\n```js\nimport { numberMask } from 'ids-enterprise-wc'\n\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  allowDecimal: true,\n  allowNegative: true,\n  decimalLimit: 2,\n  integerLimit: 7,\n  prefix: '$'\n};\ninput.mask = numberMask;\n```\n\nAs a convenience, the number formatter can also be applied by string:\n\n```js\ninput.mask = 'number';\n```\n\nWhen using the number mask this way, the number will be formatted with localized decimal, thousands (group) separator, negative, and currency symbols supplied by [IdsLocale](../ids-locale/README.MD).\n\n## Settings (Attributes)\n\n- `mask` {Array<string|RegExp>|Function} the mask that is applied to the input.\n- `mask-options` {object} options that will be applied to a masking function in progress.\n- `mask-retain-positions` {boolean} if true, combined with guides, creates masked input that allows sections between literal characters to be removed/replaced without altering the position of the characters in other sections.\n- `mask-guide` {boolean} if true, displays the complete mask as a \"placeholder\" in the input field once input has been entered.  Pattern characters are represented as `_` or other defined character, and literal characters are shown in-line.  This feature is only applicable to array-based pattern masks.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Mask is a new component in 4.0.0\n- Invoke with `.mask()` on any `<input type=\"text\">` element\n\n**4.x to 5.x**\n\n- Mask is now an Ids Mixin applied to [IdsInput](../ids-input/README.md)\n- To enable a mask, all that's necessary is to define the `mask` attribute of an IdsInput\n- If using events, events are now plain JS events\n- 4.x `patternOptions` settings are applied to masks with the `mask-options` attribute on IdsInput. All the previous built-in mask settings have remained unchanged between 4.x and 5.x\n- When using `mask=\"date\"` on the element, an [IdsLocale](../ids-locale/README.md)-driven date format is applied to the field's mask\n- When using `mask=\"number\"` on the element, an [IdsLocale](../ids-locale/README.md)-driven number format is applied to the field's mask\n"}},{"name":"ids-mask-global","description":{"kind":"markdown","value":"# Ids Mask Mixin\n\nThe Mask Mixin allows for finer control of text entered into an [Ids Input Component](../ids-input/README.md), and related components.  For example, a masked input field can be configured to only allow numbers and dashes, allowing for entry of a credit card number.  The Mask Mixin is also used in components like [Ids Date Picker](../ids-date-picker/README.md) or [Ids Time Picker](../ids-time-picker/README.md) to only allow dates/times to be entered in those fields, respectively.  The contents of the input field are modified as the user types into the field, allowing for instantaneous feedback.\n\n## Use Cases\n\nMasked input fields are used in the following cases:\n\n- Limiting text input to simple patterns, such as credit cards and phone numbers.\n- Automatically formatting numbers, dates, and times to match the current [Locale](./locale).\n\n## Terminology\n\n**Literal Character** - in a mask array, the literal characters are automatically filled in by the mask as the user types characters that match the surrounding pattern.  These characters may also be keyed in by the user.  For example, in a U.S.phone number that includes an area code, literal characters may be the parenthesis `()`, or the dashes `-` between the numbers.\n**Pattern Character** - in a mask array, pattern characters are represented by Regular Expressions.  When a user is typing into a masked field, if they type a character that matches a particular position's pattern character, that input will be accepted.  Otherwise, the input is thrown away.  For example, if the pattern character is `/\\d/` at index 0 inside a masked input field, and the user types \"0\", that number will be accepted and entered in the input.  However, if the user types \"A\", that input will be rejected.\n**Mask Function** a mask function is a Javascript function that takes two arguments (the value, and mask-specific options) that can be used to generate a mask pattern dynamically.  This is useful for input elements that mask against an indeterminate number of characters, or that need to alter the mask based on dynamic conditions. For example, the built in Date Masking function can support single or double digit Months and Days, but needs to alter the mask provided to date fields dynamically based on prior input.\n**Mask Array** a mask array (or pattern) is the array of literal and pattern characters used internally by masked input fields to resolve allowed input.  The contents of this array are the limiting factor for user input.\n**Mask Options** a setting on input fields that can define extra options that will be considered by a defined Mask function.\n\n## Features (With Code Samples)\n\n### Using Mask Arrays\n\nMasks can be applied very simply to an Ids Input by accessing its Javascript properties for masking.  Consider the following example:\n\n```html\n<ids-input id=\"my-input\" label=\"Phone Number\"></ids-input>\n```\n\nUsing Javascript, we can add a mask array using the following:\n\n```js\nconst input = document.querySelector('my-input');\ninput.mask = ['(', /\\d/, /\\d/, /\\d/, ')', ' ', /\\d/, /\\d/, /\\d/, '-', /\\d/, /\\d/, /\\d/, /\\d/ ];\n```\n\nNow when the user types into the field, the only input that will be accepted are numbers that fit within the contents of this array:\n\n```js\ninput.value = 'x1x2x3x4x5x6x7x8x9x0x';\n\nconsole.info(input.value);\n// returns '(123) 456-7890\n```\n\nThe contents of a mask array can be defined using any number of \"literal\" string characters (not replaced by masking, but will be filled in automatically), as well as regular expression-based \"pattern\" characters.  Regular expressions inside the mask array should be designed to match a single character.\n\n### Using Mask Functions\n\nIn some cases Masks need to be dynamic, changing in size to fit a particular kind of input.  Mask functions are capable of analyzing the raw value passed to the Mask API before returning a mask array.  This can be useful if you need to mask a specific section of input differently for several cases.\n\nMask functions take two arguments -- a string containing the raw value that will eventually be masked, and an object containing whatever settings your function will need for compiling the mask array and analyzing the raw value.  Mask functions should always eventually return a Mask Array of string literals and single-character regular expressions.\n\nA very basic example of a custom mask function would look like this:\n\n```js\nfunction customMaskFunction(rawValue, options) {\n  let arr = [];\n  // do some analysis on the raw value\n  // ...\n  return arr;\n}\n```\n\nIf a developer wished to build a mask function that always placed a suffix at the end of an indeterminately-sized number, it could be done this way:\n\n```js\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  suffix: '%'\n};\ninput.mask = (rawValue, opts) => {\n  const totalDigits = rawValue.split('').map(() => /\\d/);\n  return [...totalDigits, opts.suffix];\n};\n```\n\n### Built-in Mask Functions\n\nIds Mask comes with some built in masking functions.  These hook into other IDS components and utilities to provide localization and formatting.\n\n#### Date Masks\n\nFor example, configuring an input field to mask as a U.S. localized short-hand date could be done this way:\n\n```js\nimport { dateMask } from 'ids-enterprise-wc'\n\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  format: 'M/d/yyyy'\n};\ninput.mask = dateMask;\n```\n\nAs a convenience, built-in masks can also be automatically applied with shorthand string-based syntax:\n\n```js\ninput.mask = 'date';\n```\n\nWhen using the date mask this way, the automatically-applied date format will be a short date format supplied by [IdsLocale](../ids-locale/README.MD).\n\n#### Number Mask\n\nAnother example is configuring an input field to mask a fully-formatted number, with proper localization of thousands separator, decimal, and currency symbol placement.  An example of configuring the field for a U.S. localized formatted number could be this:\n\n```js\nimport { numberMask } from 'ids-enterprise-wc'\n\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  allowDecimal: true,\n  allowNegative: true,\n  decimalLimit: 2,\n  integerLimit: 7,\n  prefix: '$'\n};\ninput.mask = numberMask;\n```\n\nAs a convenience, the number formatter can also be applied by string:\n\n```js\ninput.mask = 'number';\n```\n\nWhen using the number mask this way, the number will be formatted with localized decimal, thousands (group) separator, negative, and currency symbols supplied by [IdsLocale](../ids-locale/README.MD).\n\n## Settings (Attributes)\n\n- `mask` {Array<string|RegExp>|Function} the mask that is applied to the input.\n- `mask-options` {object} options that will be applied to a masking function in progress.\n- `mask-retain-positions` {boolean} if true, combined with guides, creates masked input that allows sections between literal characters to be removed/replaced without altering the position of the characters in other sections.\n- `mask-guide` {boolean} if true, displays the complete mask as a \"placeholder\" in the input field once input has been entered.  Pattern characters are represented as `_` or other defined character, and literal characters are shown in-line.  This feature is only applicable to array-based pattern masks.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Mask is a new component in 4.0.0\n- Invoke with `.mask()` on any `<input type=\"text\">` element\n\n**4.x to 5.x**\n\n- Mask is now an Ids Mixin applied to [IdsInput](../ids-input/README.md)\n- To enable a mask, all that's necessary is to define the `mask` attribute of an IdsInput\n- If using events, events are now plain JS events\n- 4.x `patternOptions` settings are applied to masks with the `mask-options` attribute on IdsInput. All the previous built-in mask settings have remained unchanged between 4.x and 5.x\n- When using `mask=\"date\"` on the element, an [IdsLocale](../ids-locale/README.md)-driven date format is applied to the field's mask\n- When using `mask=\"number\"` on the element, an [IdsLocale](../ids-locale/README.md)-driven number format is applied to the field's mask\n"}},{"name":"ids-masks","description":{"kind":"markdown","value":"# Ids Mask Mixin\n\nThe Mask Mixin allows for finer control of text entered into an [Ids Input Component](../ids-input/README.md), and related components.  For example, a masked input field can be configured to only allow numbers and dashes, allowing for entry of a credit card number.  The Mask Mixin is also used in components like [Ids Date Picker](../ids-date-picker/README.md) or [Ids Time Picker](../ids-time-picker/README.md) to only allow dates/times to be entered in those fields, respectively.  The contents of the input field are modified as the user types into the field, allowing for instantaneous feedback.\n\n## Use Cases\n\nMasked input fields are used in the following cases:\n\n- Limiting text input to simple patterns, such as credit cards and phone numbers.\n- Automatically formatting numbers, dates, and times to match the current [Locale](./locale).\n\n## Terminology\n\n**Literal Character** - in a mask array, the literal characters are automatically filled in by the mask as the user types characters that match the surrounding pattern.  These characters may also be keyed in by the user.  For example, in a U.S.phone number that includes an area code, literal characters may be the parenthesis `()`, or the dashes `-` between the numbers.\n**Pattern Character** - in a mask array, pattern characters are represented by Regular Expressions.  When a user is typing into a masked field, if they type a character that matches a particular position's pattern character, that input will be accepted.  Otherwise, the input is thrown away.  For example, if the pattern character is `/\\d/` at index 0 inside a masked input field, and the user types \"0\", that number will be accepted and entered in the input.  However, if the user types \"A\", that input will be rejected.\n**Mask Function** a mask function is a Javascript function that takes two arguments (the value, and mask-specific options) that can be used to generate a mask pattern dynamically.  This is useful for input elements that mask against an indeterminate number of characters, or that need to alter the mask based on dynamic conditions. For example, the built in Date Masking function can support single or double digit Months and Days, but needs to alter the mask provided to date fields dynamically based on prior input.\n**Mask Array** a mask array (or pattern) is the array of literal and pattern characters used internally by masked input fields to resolve allowed input.  The contents of this array are the limiting factor for user input.\n**Mask Options** a setting on input fields that can define extra options that will be considered by a defined Mask function.\n\n## Features (With Code Samples)\n\n### Using Mask Arrays\n\nMasks can be applied very simply to an Ids Input by accessing its Javascript properties for masking.  Consider the following example:\n\n```html\n<ids-input id=\"my-input\" label=\"Phone Number\"></ids-input>\n```\n\nUsing Javascript, we can add a mask array using the following:\n\n```js\nconst input = document.querySelector('my-input');\ninput.mask = ['(', /\\d/, /\\d/, /\\d/, ')', ' ', /\\d/, /\\d/, /\\d/, '-', /\\d/, /\\d/, /\\d/, /\\d/ ];\n```\n\nNow when the user types into the field, the only input that will be accepted are numbers that fit within the contents of this array:\n\n```js\ninput.value = 'x1x2x3x4x5x6x7x8x9x0x';\n\nconsole.info(input.value);\n// returns '(123) 456-7890\n```\n\nThe contents of a mask array can be defined using any number of \"literal\" string characters (not replaced by masking, but will be filled in automatically), as well as regular expression-based \"pattern\" characters.  Regular expressions inside the mask array should be designed to match a single character.\n\n### Using Mask Functions\n\nIn some cases Masks need to be dynamic, changing in size to fit a particular kind of input.  Mask functions are capable of analyzing the raw value passed to the Mask API before returning a mask array.  This can be useful if you need to mask a specific section of input differently for several cases.\n\nMask functions take two arguments -- a string containing the raw value that will eventually be masked, and an object containing whatever settings your function will need for compiling the mask array and analyzing the raw value.  Mask functions should always eventually return a Mask Array of string literals and single-character regular expressions.\n\nA very basic example of a custom mask function would look like this:\n\n```js\nfunction customMaskFunction(rawValue, options) {\n  let arr = [];\n  // do some analysis on the raw value\n  // ...\n  return arr;\n}\n```\n\nIf a developer wished to build a mask function that always placed a suffix at the end of an indeterminately-sized number, it could be done this way:\n\n```js\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  suffix: '%'\n};\ninput.mask = (rawValue, opts) => {\n  const totalDigits = rawValue.split('').map(() => /\\d/);\n  return [...totalDigits, opts.suffix];\n};\n```\n\n### Built-in Mask Functions\n\nIds Mask comes with some built in masking functions.  These hook into other IDS components and utilities to provide localization and formatting.\n\n#### Date Masks\n\nFor example, configuring an input field to mask as a U.S. localized short-hand date could be done this way:\n\n```js\nimport { dateMask } from 'ids-enterprise-wc'\n\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  format: 'M/d/yyyy'\n};\ninput.mask = dateMask;\n```\n\nAs a convenience, built-in masks can also be automatically applied with shorthand string-based syntax:\n\n```js\ninput.mask = 'date';\n```\n\nWhen using the date mask this way, the automatically-applied date format will be a short date format supplied by [IdsLocale](../ids-locale/README.MD).\n\n#### Number Mask\n\nAnother example is configuring an input field to mask a fully-formatted number, with proper localization of thousands separator, decimal, and currency symbol placement.  An example of configuring the field for a U.S. localized formatted number could be this:\n\n```js\nimport { numberMask } from 'ids-enterprise-wc'\n\nconst input = document.querySelector('my-input');\ninput.maskOptions = {\n  allowDecimal: true,\n  allowNegative: true,\n  decimalLimit: 2,\n  integerLimit: 7,\n  prefix: '$'\n};\ninput.mask = numberMask;\n```\n\nAs a convenience, the number formatter can also be applied by string:\n\n```js\ninput.mask = 'number';\n```\n\nWhen using the number mask this way, the number will be formatted with localized decimal, thousands (group) separator, negative, and currency symbols supplied by [IdsLocale](../ids-locale/README.MD).\n\n## Settings (Attributes)\n\n- `mask` {Array<string|RegExp>|Function} the mask that is applied to the input.\n- `mask-options` {object} options that will be applied to a masking function in progress.\n- `mask-retain-positions` {boolean} if true, combined with guides, creates masked input that allows sections between literal characters to be removed/replaced without altering the position of the characters in other sections.\n- `mask-guide` {boolean} if true, displays the complete mask as a \"placeholder\" in the input field once input has been entered.  Pattern characters are represented as `_` or other defined character, and literal characters are shown in-line.  This feature is only applicable to array-based pattern masks.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Mask is a new component in 4.0.0\n- Invoke with `.mask()` on any `<input type=\"text\">` element\n\n**4.x to 5.x**\n\n- Mask is now an Ids Mixin applied to [IdsInput](../ids-input/README.md)\n- To enable a mask, all that's necessary is to define the `mask` attribute of an IdsInput\n- If using events, events are now plain JS events\n- 4.x `patternOptions` settings are applied to masks with the `mask-options` attribute on IdsInput. All the previous built-in mask settings have remained unchanged between 4.x and 5.x\n- When using `mask=\"date\"` on the element, an [IdsLocale](../ids-locale/README.md)-driven date format is applied to the field's mask\n- When using `mask=\"number\"` on the element, an [IdsLocale](../ids-locale/README.md)-driven number format is applied to the field's mask\n"}},{"name":"ids-masthead","attributes":[{"name":"elements","description":"Get a list of element dependencies for this component","values":[]}],"description":{"kind":"markdown","value":"# ids-masthead\n\n## Description\n\nThe Masthead Component is a very top level application toolbar with navigable links to useful applications/pages within the Web Application.\n\nThe masthead can be added to applications when not running inside mingle shell to add functionality that mingle would add that you need standalone. When running in mingle shell, you should detect and do not show the mast head.\n\nThe masthead can be found in tenant environments that are opted in to the CloudSuite. It provides navigation to other applications, homepages, and bookmarks within the environment. The masthead is a visual representation of InforOS, which serves as a database for all information and actions made by users within different applications within the suite.\n\nIn some cases, the masthead may be implemented in a context outside of the CloudSuite. This should only be done when it is necessary to surface global actions that affect more than one page within an application and do not fit into the context of a page header.\n\nActions and links found in the masthead are configurable by the tenant admin. The masthead will almost always have:\n\nThe application tray: allows users to navigate to other applications within a tenants suite\n- Search: pulls results from the current application and around the cloud suite\n- Bookmarks: allows users to save specific pages within applications and access them from anywhere within the cloud suite\n- User settings: central place for end users to view/edit their personal information and any global preferences\n\nSome optional features in the masthead:\n- Company logo/home icon: navigates the user to the default or preferred home page\n- Coleman\n- Inbox\n\n## Use Cases\n\n- A masthead can provide a prominent application level bar to other applications, homepages, and bookmarks within a Web Application.\n- A masthead can be utilized when it is necessary to surface global actions that affect more than one page within a Web Application.\n\n## Terminology\n\n- **Masthead**: A custom HTML element that serves as the primary header bar on a page.\n- **Slot**: The masthead now has a single slot where users can place an ids-toolbar element. This toolbar can contain the desired buttons and controls for the masthead.\n\n## Feature (With the Code Examples)\n\nAn masthead is created by using the `ids-masthead` tag.\n\nMasthead with `ids-toolbar` elements in the slot:\n\n```html\n<ids-masthead title=\"Infor Application\" icon=\"logo\" role=\"navigation\">\n    <ids-toolbar id=\"my-toolbar\">\n        <ids-toolbar-section align=\"start\" favor>\n            <ids-layout-flex gap=\"8\" align-items=\"center\">\n            <ids-layout-flex-item>\n                <ids-button id=\"logo\" square=\"true\">\n                <ids-icon icon=\"favicon\" viewbox=\"0 0 18 18\" color=\"transparent\" width=\"28\" height=\"28\"></ids-icon>\n                <ids-text audible=\"true\">Masthead logo</ids-text>\n                </ids-button>\n            </ids-layout-flex-item>\n            <ids-layout-flex-item>\n                <ids-text id=\"title\" font-size=\"14\" font-weight=\"semi-bold\">Infor Application</ids-text>\n            </ids-layout-flex-item>\n            <ids-layout-flex-item>\n                <ids-button icon=\"grid\"><span class=\"audible\">Grid Button</span></ids-button>\n            </ids-layout-flex-item>\n            </ids-layout-flex>\n        </ids-toolbar-section>\n\n        <ids-toolbar-section type=\"buttonset\" align=\"start\">\n            <ids-button id=\"button-1\" icon=\"home\"><span>Home</span></ids-button>\n            <ids-button id=\"button-2\" icon=\"star-outlined\"><span>Star</span></ids-button>\n            <ids-button id=\"button-3\" icon=\"info\"><span>Info</span></ids-button>\n        </ids-toolbar-section>\n\n        <ids-toolbar-section type=\"buttonset\" align=\"end\">\n            <ids-button icon=\"user\"><span class=\"audible\">User Button</span></ids-button>\n            <ids-button icon=\"mingle-share\"><span class=\"audible\">Mingle Button</span></ids-button>\n            <ids-button icon=\"bookmark-outlined\"><span class=\"audible\">Bookmark Button</span></ids-button>\n        </ids-toolbar-section>\n\n        <ids-toolbar-more-actions overflow>\n            <ids-menu-group>\n            <ids-menu-item value=\"1\" disabled>Option One (disabled)</ids-menu-item>\n            <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n            <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n            <ids-menu-item>More Options\n                <ids-popup-menu>\n                <ids-menu-group>\n                    <ids-menu-item value=\"4\">Option Four</ids-menu-item>\n                    <ids-menu-item value=\"5\" disabled>Option Five (disabled)</ids-menu-item>\n                    <ids-menu-item value=\"6\">Option Six</ids-menu-item>\n                </ids-menu-group>\n                </ids-popup-menu>\n            </ids-menu-item>\n            </ids-menu-group>\n        </ids-toolbar-more-actions>\n    </ids-toolbar>\n</ids-masthead>\n```\n\n## Class Hierarchy\n\n- IdsMasthead\n  - IdsHeader\n- Mixins\n  - IdsEventsMixin\n  - IdsKeyboardMixin\n\n## Settings\n\n- `slot` {readonly} An object containing the masthead's sections for start|center|end|more\n\n## Events\n\n- `tab` {KeyboardEvent} Pressing the tab keyboard button will traverse all buttons in the masthead.\n\n## Methods\n\n- `renderBreakpoint()` Rearranges user's slots in masthead according to desktop, tablet and mobile viewports.\n\n## Themeable Parts\n\n- None\n\n## States and Variations\n\n- Mobile, tablet and desktop viewports/breakpoints\n\n## Accessibility\n\n- Use the `role=\"banner\"` or `role=\"navigation\"`\n- Should use html5 section or nav type\n\n## Keyboard Guidelines\n\nA masthead's action buttons should function as a toolbar, see [toolbar](../ids-toolbar/README.md) page for guidelines.\n\n## Responsive Guidelines\n\nA masthead will resize horizontally to mobile, tablet and desktop breakpoints. At the tablet and mobile breakpoints, buttons are moved into the \"More\" popup-menu.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Masthead replaces the inforTopBanner CSS. The markup and CSS Is entirely different to support new look and behavior.\n\n**4.x to 5.x**\n\n- The masthead component has been changed to a web component and renamed to ids-masthead.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-masthead></ids-masthead>`\n- If using events events are now plain JS events for example (i.e. button click events)\n- The template is now a template element that uses simple string substitution\n- Can now be imported as a single JS file and used with encapsulated styles (in some browsers)\n- Design has changed\n"}},{"name":"ids-media-gallery","attributes":[{"name":"#is-dragging","values":[]},{"name":"#is-hovering","values":[]},{"name":"#zoom-out-button","values":[]},{"name":"#zoom-fit-button","values":[]},{"name":"#default-zoom-step","values":[]},{"name":"#min-scale","values":[]},{"name":"#max-scale","values":[]},{"name":"#zoom-mode","values":[]},{"name":"#last-wheel-navigation-time","description":"Timestamp of last wheel navigation to prevent rapid scrolling","values":[]},{"name":"#navigation-observer","description":"MutationObserver for navigation child changes","values":[]},{"name":"enable-hover-change","description":"Set the enableHoverChange attribute","values":[]},{"name":"disable-mobile-zoom","description":"Set the disableMobileZoom attribute","values":[]},{"name":"thumbnails","description":"Get the thumbnails","values":[]},{"name":"media-viewer","values":[]},{"name":"#get-translate","description":"Returns a function to calculate the new translate value based on\ncurrent and previous positions, but only when the scale is within\nallowed bounds and the position has changed.","values":[]}],"description":{"kind":"markdown","value":"# ids-media-gallery\n\n## Description\n\nA media gallery component can be used to display a list of media items such as images or videos. For images you can use the tools to browse and zoom images.\n\n## Use Cases\n\n- To show a list of images or videos and allow users to browse through them and zoom in on them.\n\n## Dos and Don'ts\n\n- Don't overcrowd your content with media galleries. Should only be one per page, so people can see the data clearly.\n\n## Terminology\n\n- **Media**: Audio, video, or image content that can be displayed in the gallery\n- **Media Viewer**: The main display area that shows the currently selected media item in full size\n- **Navigation**: The scrollable thumbnail strip that allows users to browse and select different media items\n- **Thumbnail**: A smaller preview image representing each media item in the navigation strip\n- **Toolbar**: A customizable control panel that contains tools for interacting with media (like zoom controls)\n- **Slot**: A designated area in the component where specific content can be placed (e.g., media-gallery-viewer, media-gallery-navigation)\n- **Selected State**: The current active media item being displayed in the viewer, indicated visually in the navigation thumbnails\n- **Media Type**: The category of media being displayed (image or video)\n\n## Features (With Code Examples)\n\nIf necessary, you can customize the toolbar by adding to `slot=\"media-gallery-toolbar\"`. The internal icon functionality will be linked by the icon name.\n\n```html\n<ids-media-gallery>\n  <ids-media-viewer src=\"/src/assets/images/media-gallery-example-1.jpg\" alt=\"image-lg 300x350\" slot=\"media-gallery-viewer\"></ids-media-viewer>\n  <ids-scroll-view slot=\"media-gallery-navigation\" as-nav>\n    <img class=\"image-1 selected\" src=\"/src/assets/images/media-gallery-example-1.jpg\" slot=\"scroll-view-item\" alt=\"Image 1\"/>\n    <img class=\"image-1\" src=\"/src/assets/images/media-gallery-example-2.jpg\" slot=\"scroll-view-item\" alt=\"Image 2\"/>\n    <img class=\"image-2\" src=\"/src/assets/images/media-gallery-example-3.jpg\" slot=\"scroll-view-item\" alt=\"Image 3\"/>\n    <img class=\"image-3\" src=\"/src/assets/images/media-gallery-example-4.jpg\" slot=\"scroll-view-item\" alt=\"Image 4\"/>\n    <img class=\"image-4\" src=\"/src/assets/images/media-gallery-example-5.jpg\" slot=\"scroll-view-item\" alt=\"Image 5\"/>\n    <img class=\"image-5\" src=\"/src/assets/images/media-gallery-example-6.jpg\" slot=\"scroll-view-item\" alt=\"Image 6\"/>\n    <img class=\"image-6\" src=\"/src/assets/images/media-gallery-example-7.jpg\" slot=\"scroll-view-item\" alt=\"Image 7\"/>\n    <div\n      slot=\"scroll-view-item\"\n      data-type=\"video\"\n      data-src=\"https://storage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4\"\n    >\n      <img src=\"/src/assets/images/media-gallery-example-8.jpg\" alt=\"Image 8\"/>\n    </div>\n  </ids-scroll-view>\n</ids-media-gallery>\n\n```\n### IdsMediaViewer (slot=\"media-gallery-viewer\")\n- `src` {string} The source URL of the media item to display.\n- `alt` {string} Alternative text for the media item (required for accessibility).\n- `type` {string} Type of media ('image' or 'video'). Default is 'image'.\n\n### IdsScrollView (slot=\"media-gallery-navigation\")\n- `as-nav` {boolean} Must be set to true for proper thumbnail navigation behavior.\n\n### Thumbnail Items (slot=\"scroll-view-item\")\n- `src` {string} The source URL of the thumbnail image.\n- `alt` {string} Alternative text for the thumbnail (required for accessibility).\n- `data-type` {string} Optional. Set to 'video' for video items.\n- `data-src` {string} Required when data-type is 'video'. The source URL of the video file.\n\n## Class Hierarchy\n\n- IdsMediaGallery\n  - IdsElement\n- Mixins\n  - IdsEventsMixin\n  - IdsKeyboardMixin\n- Uses\n  - IdsToolbar\n  - IdsText\n\n## Settings (Attributes)\n\nIdsMediaGallery\n\n- **id** {string} A unique identifier for the media gallery component\n- **enableHoverChange** {boolean} Allows the media gallery image to change by hovering over the thumbnail.\n\nIdsMediaViewer (slot=\"media-gallery-viewer\")\n\n- **src** {string} The source URL of the media item to display\n- **alt** {string} Alternative text for the media item (required for accessibility)\n- **type** {string} Type of media ('image' or 'video'). Default is 'image'\n- **object-fit** {string} Controls how the image is resized to fit its container. Valid values: `contain`, `cover`, `fill`, `none`, `scale-down`. Default is `cover`.\n\n### Object Fit Example\n\n```html\n<ids-media-gallery>\n  <ids-media-viewer src=\"image.jpg\" alt=\"Product image\" object-fit=\"cover\" slot=\"media-gallery-viewer\"></ids-media-viewer>\n  <ids-scroll-view slot=\"media-gallery-navigation\" as-nav>\n    <img class=\"selected\" src=\"image.jpg\" slot=\"scroll-view-item\" alt=\"Image 1\"/>\n  </ids-scroll-view>\n</ids-media-gallery>\n```\n\nIdsScrollView Navigation (slot=\"media-gallery-navigation\")\n\n**as-nav** {boolean} Must be set to true for proper thumbnail navigation behavior\n**object-fit** {string} Controls how thumbnail images are resized. Valid values: `contain`, `cover`, `fill`, `none`, `scale-down`.\n\nThumbnail Items (slot=\"scroll-view-item\")\n\n**src** {string} The source URL of the thumbnail image\n**alt** {string} Alternative text for the thumbnail (required for accessibility)\n**data-type** {string} Optional. Set to 'video' for video items\n**data-src** {string} Required when data-type is 'video'. The source URL of the video file\n\n## Responsive Guidelines\n\n- Has a maximum width defined by the custom property `--ids-media-gallery-max-width`\n- Will responsively scale down below `--ids-media-gallery-max-width` to fit smaller viewport sizes\n- Maintains aspect ratio while resizing to prevent distortion\n- Can be placed within responsive containers like ids-flex-layout, ids-layout-grid, and ids-scrollable-area\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- New Component\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The contents will flip to the alternate side in Right To Left mode.\n"}},{"name":"ids-media-viewer","attributes":[{"name":"type","description":"Set the type of media between image or video","values":[]},{"name":"src","description":"Set the src url of the image","values":[]},{"name":"alt","description":"Set the alt text of the image or video","values":[]},{"name":"object-fit-values","description":"Valid object-fit values","values":[]},{"name":"object-fit","description":"Set the object-fit style for the image.\nCSS handles the actual styling via :host([object-fit]) selectors.","values":[]}],"description":{"kind":"markdown","value":"# ids-media-gallery\n\n## Description\n\nA media gallery component can be used to display a list of media items such as images or videos. For images you can use the tools to browse and zoom images.\n\n## Use Cases\n\n- To show a list of images or videos and allow users to browse through them and zoom in on them.\n\n## Dos and Don'ts\n\n- Don't overcrowd your content with media galleries. Should only be one per page, so people can see the data clearly.\n\n## Terminology\n\n- **Media**: Audio, video, or image content that can be displayed in the gallery\n- **Media Viewer**: The main display area that shows the currently selected media item in full size\n- **Navigation**: The scrollable thumbnail strip that allows users to browse and select different media items\n- **Thumbnail**: A smaller preview image representing each media item in the navigation strip\n- **Toolbar**: A customizable control panel that contains tools for interacting with media (like zoom controls)\n- **Slot**: A designated area in the component where specific content can be placed (e.g., media-gallery-viewer, media-gallery-navigation)\n- **Selected State**: The current active media item being displayed in the viewer, indicated visually in the navigation thumbnails\n- **Media Type**: The category of media being displayed (image or video)\n\n## Features (With Code Examples)\n\nIf necessary, you can customize the toolbar by adding to `slot=\"media-gallery-toolbar\"`. The internal icon functionality will be linked by the icon name.\n\n```html\n<ids-media-gallery>\n  <ids-media-viewer src=\"/src/assets/images/media-gallery-example-1.jpg\" alt=\"image-lg 300x350\" slot=\"media-gallery-viewer\"></ids-media-viewer>\n  <ids-scroll-view slot=\"media-gallery-navigation\" as-nav>\n    <img class=\"image-1 selected\" src=\"/src/assets/images/media-gallery-example-1.jpg\" slot=\"scroll-view-item\" alt=\"Image 1\"/>\n    <img class=\"image-1\" src=\"/src/assets/images/media-gallery-example-2.jpg\" slot=\"scroll-view-item\" alt=\"Image 2\"/>\n    <img class=\"image-2\" src=\"/src/assets/images/media-gallery-example-3.jpg\" slot=\"scroll-view-item\" alt=\"Image 3\"/>\n    <img class=\"image-3\" src=\"/src/assets/images/media-gallery-example-4.jpg\" slot=\"scroll-view-item\" alt=\"Image 4\"/>\n    <img class=\"image-4\" src=\"/src/assets/images/media-gallery-example-5.jpg\" slot=\"scroll-view-item\" alt=\"Image 5\"/>\n    <img class=\"image-5\" src=\"/src/assets/images/media-gallery-example-6.jpg\" slot=\"scroll-view-item\" alt=\"Image 6\"/>\n    <img class=\"image-6\" src=\"/src/assets/images/media-gallery-example-7.jpg\" slot=\"scroll-view-item\" alt=\"Image 7\"/>\n    <div\n      slot=\"scroll-view-item\"\n      data-type=\"video\"\n      data-src=\"https://storage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4\"\n    >\n      <img src=\"/src/assets/images/media-gallery-example-8.jpg\" alt=\"Image 8\"/>\n    </div>\n  </ids-scroll-view>\n</ids-media-gallery>\n\n```\n### IdsMediaViewer (slot=\"media-gallery-viewer\")\n- `src` {string} The source URL of the media item to display.\n- `alt` {string} Alternative text for the media item (required for accessibility).\n- `type` {string} Type of media ('image' or 'video'). Default is 'image'.\n\n### IdsScrollView (slot=\"media-gallery-navigation\")\n- `as-nav` {boolean} Must be set to true for proper thumbnail navigation behavior.\n\n### Thumbnail Items (slot=\"scroll-view-item\")\n- `src` {string} The source URL of the thumbnail image.\n- `alt` {string} Alternative text for the thumbnail (required for accessibility).\n- `data-type` {string} Optional. Set to 'video' for video items.\n- `data-src` {string} Required when data-type is 'video'. The source URL of the video file.\n\n## Class Hierarchy\n\n- IdsMediaGallery\n  - IdsElement\n- Mixins\n  - IdsEventsMixin\n  - IdsKeyboardMixin\n- Uses\n  - IdsToolbar\n  - IdsText\n\n## Settings (Attributes)\n\nIdsMediaGallery\n\n- **id** {string} A unique identifier for the media gallery component\n- **enableHoverChange** {boolean} Allows the media gallery image to change by hovering over the thumbnail.\n\nIdsMediaViewer (slot=\"media-gallery-viewer\")\n\n- **src** {string} The source URL of the media item to display\n- **alt** {string} Alternative text for the media item (required for accessibility)\n- **type** {string} Type of media ('image' or 'video'). Default is 'image'\n- **object-fit** {string} Controls how the image is resized to fit its container. Valid values: `contain`, `cover`, `fill`, `none`, `scale-down`. Default is `cover`.\n\n### Object Fit Example\n\n```html\n<ids-media-gallery>\n  <ids-media-viewer src=\"image.jpg\" alt=\"Product image\" object-fit=\"cover\" slot=\"media-gallery-viewer\"></ids-media-viewer>\n  <ids-scroll-view slot=\"media-gallery-navigation\" as-nav>\n    <img class=\"selected\" src=\"image.jpg\" slot=\"scroll-view-item\" alt=\"Image 1\"/>\n  </ids-scroll-view>\n</ids-media-gallery>\n```\n\nIdsScrollView Navigation (slot=\"media-gallery-navigation\")\n\n**as-nav** {boolean} Must be set to true for proper thumbnail navigation behavior\n**object-fit** {string} Controls how thumbnail images are resized. Valid values: `contain`, `cover`, `fill`, `none`, `scale-down`.\n\nThumbnail Items (slot=\"scroll-view-item\")\n\n**src** {string} The source URL of the thumbnail image\n**alt** {string} Alternative text for the thumbnail (required for accessibility)\n**data-type** {string} Optional. Set to 'video' for video items\n**data-src** {string} Required when data-type is 'video'. The source URL of the video file\n\n## Responsive Guidelines\n\n- Has a maximum width defined by the custom property `--ids-media-gallery-max-width`\n- Will responsively scale down below `--ids-media-gallery-max-width` to fit smaller viewport sizes\n- Maintains aspect ratio while resizing to prevent distortion\n- Can be placed within responsive containers like ids-flex-layout, ids-layout-grid, and ids-scrollable-area\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- New Component\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The contents will flip to the alternate side in Right To Left mode.\n"}},{"name":"ids-menu-attributes","description":{"kind":"markdown","value":"# ids-menu\n\n## Description\n\nThe IdsMenu Component provides the ui for a menu. This includes groups, icons, submenus, text, disabled ect. By itself a menu is not very useful and will just paint on the page as if it was open. Use [IdsMenuButton]('../ids-menu-button/README.md') in order to show a menu on a button click. Or use [IdsPopupMenu]('../ids-popup-menu/README.md') to show a menu on a click or right click anywhere on the page. The construction of a menu is comprised of several related components.\n\n`ids-menu-group` is used to create a group for a set of menu items.\n`ids-menu-header` is used a as a label for groups of menu items\n`ids-menu-item` is the main component normal menu items\n\n## Use Cases\n\n- Display an application menu\n- Display submenus\n- Display a menu with icons\n\n## Terminology\n\n**Group** A label separating items in the menu in a logical group\n**Submenus** A a list of choices that is part of another list of choices\n\n## Attributes and Properties (ids-menu-group)\n\n- `disabled` {boolean} true if the entire menu should become disabled\n- `keep-open` {boolean} true if selection of an item within this group should cause the parent menu to close\n- `selection` {string} The type of selection to set this group between `single` and `multiple` or `none`\n- `wrap` {boolean} if true, the child menu-items will be styled into a column view.\n\n## Features (With Code Examples)\n\nA simple menu with three items can be created by creating a `ids-menu` with a single `ids-menu-group` and three `ids-menu-item` components.\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group wrap>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA menu can have a toggle-able menu item that is indicated with a check that toggles when you turn it on and off. In this example selecting `Two` will mark it checked and unchecked\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item toggleable>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA more complicated menu can be formed using combinations of  `ids-menu` with a `ids-menu-group` and nested `ids-menu-item` components.\n\n```html\n<ids-menu id=\"complex-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n    <ids-separator></ids-separator>\n    <ids-menu-item value=\"long-no-icons\">Very long, indescribable action with no icons</ids-menu-item>\n    <ids-menu-item icon=\"url\" disabled=\"true\" value=\"big-with-icons\">\n      Another big menu item, but with icons!\n    </ids-menu-item>\n  </ids-menu-group>\n  <ids-separator></ids-separator>\n  <ids-menu-header id=\"additional-actions-header\">Additional Actions</ids-menu-header>\n  <ids-menu-group id=\"more-settings\" aria-describedby=\"additional-actions-header\">\n    <ids-menu-item value=\"more-actions\">\n      More Actions\n    </ids-menu-item>\n    <ids-menu-item icon=\"user\" value=\"even-more-actions\">\n        Even More Actions\n    </ids-menu-item>\n    <ids-menu-item id=\"no-select\" value=\"no-select\">This one can't be selected (Check the console)</ids-menu-item>\n    </ids-menu-group>\n    <ids-separator></ids-separator>\n    <ids-menu-group id=\"other-settings\">\n    <ids-menu-item icon=\"more\" value=\"other-items\">Other Items</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\n### Selection Event Handling\n\nWhen an `<ids-menu-item>` element is selected from a menu, it has the potential to fire up to two different events.  The events fired depend on how the menu is configured.  Consider this menu:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nIn this example, when any of the menu's items are chosen by click or by keyboard, no selection events are fired.  This is because there is no `select` attribute determining single or multiple selection.  The menu item chosen will not change the menu's selection state, and will simply fire a `pick` event.\n\nThis next example will cause a both a `selected` event and a `pick` event to fire whenever an item is chosen.  No `deselected` events will fire in this case:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"single\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also have `toggleable` menu items where the menu item check can be turned on and off. For example\n\n```html\n<ids-menu>\n  <ids-menu-group select=\"single\">\n    <ids-menu-item icon=\"mail\" toggable value=\"mail\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also align the icon on the right side.\n\n```html\n<ids-menu>\n  <ids-menu-group>\n    <ids-menu-item icon=\"mail\" icon-align=\"end\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nThis next example will cause a either a `selected` OR `deselected` event, as well as a `pick` event, to fire whenever an item is chosen.  When an item is chosen, its selection state is changed, and the event fired corresponds to its new value:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"multiple\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nAlso in addition we fire a `click` event at the same time as `selected` as this may seem more natural. However, its not possible to attach a click event to individual menu items and this generally required more event handlers so is not preferred. For example:\n\n```ts\n// Add click listeners to all menu items\ndocument.querySelectorAll('ids-menu-item')?.forEach((menuItem) => {\n  menuItem?.addEventListener('click', (e: any) => {\n    console.info(`Menu item clicked: \"${e.target.text}\" (id \"${e.target.id}\")`);\n  });\n});\n```\n\n### Shortcut keys\n\nIdsMenuItem elements can have a `shortcut-keys` attribute defined, which will pass text representing a keyboard shortcut to be displayed into the white space opposite the regular text:\n\n```html\n<ids-menu-item id=\"action-create\" icon=\"folder\" shortcut-keys=\"⌘+R\">Create New Folder</ids-menu-item>\n```\n\n```js\nconst menuItem = document.querySelector('ids-menu-item');\nmenuItem.setAttribute('shortcut-keys', '⌘+R');\n```\n\n## Class Hierarchy Menu Group\n\n- IdsMenuGroup\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Header\n\n- IdsMenuHeader\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Item\n\n- IdsMenuItem\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This component is relatively backwards compatible except inforContextMenu should be replaced with popupmenu in the API call and class name\n- Remove class divider as it is deprecated\n- Checkbox construct is simplified\n- Group replaced with heading\n\n**4.x to 5.x**\n\n- The menu component has been changed to a web component and renamed to `ids-menu`.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-menu></ids-menu>`\n- If using events events are now plain JS events for example (i.e. menu click events)\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-menu-group","attributes":[{"name":"menu","values":[]},{"name":"items","values":[]},{"name":"header","description":"Gets this groups descriptive header, if one is defined.","values":[]},{"name":"select","values":[]},{"name":"wrap","description":"Set the wrap attribute, which controls if child menu-items are styled into a column view.","values":[]},{"name":"keep-open","values":[]}],"description":{"kind":"markdown","value":"# ids-menu\n\n## Description\n\nThe IdsMenu Component provides the ui for a menu. This includes groups, icons, submenus, text, disabled ect. By itself a menu is not very useful and will just paint on the page as if it was open. Use [IdsMenuButton]('../ids-menu-button/README.md') in order to show a menu on a button click. Or use [IdsPopupMenu]('../ids-popup-menu/README.md') to show a menu on a click or right click anywhere on the page. The construction of a menu is comprised of several related components.\n\n`ids-menu-group` is used to create a group for a set of menu items.\n`ids-menu-header` is used a as a label for groups of menu items\n`ids-menu-item` is the main component normal menu items\n\n## Use Cases\n\n- Display an application menu\n- Display submenus\n- Display a menu with icons\n\n## Terminology\n\n**Group** A label separating items in the menu in a logical group\n**Submenus** A a list of choices that is part of another list of choices\n\n## Attributes and Properties (ids-menu-group)\n\n- `disabled` {boolean} true if the entire menu should become disabled\n- `keep-open` {boolean} true if selection of an item within this group should cause the parent menu to close\n- `selection` {string} The type of selection to set this group between `single` and `multiple` or `none`\n- `wrap` {boolean} if true, the child menu-items will be styled into a column view.\n\n## Features (With Code Examples)\n\nA simple menu with three items can be created by creating a `ids-menu` with a single `ids-menu-group` and three `ids-menu-item` components.\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group wrap>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA menu can have a toggle-able menu item that is indicated with a check that toggles when you turn it on and off. In this example selecting `Two` will mark it checked and unchecked\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item toggleable>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA more complicated menu can be formed using combinations of  `ids-menu` with a `ids-menu-group` and nested `ids-menu-item` components.\n\n```html\n<ids-menu id=\"complex-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n    <ids-separator></ids-separator>\n    <ids-menu-item value=\"long-no-icons\">Very long, indescribable action with no icons</ids-menu-item>\n    <ids-menu-item icon=\"url\" disabled=\"true\" value=\"big-with-icons\">\n      Another big menu item, but with icons!\n    </ids-menu-item>\n  </ids-menu-group>\n  <ids-separator></ids-separator>\n  <ids-menu-header id=\"additional-actions-header\">Additional Actions</ids-menu-header>\n  <ids-menu-group id=\"more-settings\" aria-describedby=\"additional-actions-header\">\n    <ids-menu-item value=\"more-actions\">\n      More Actions\n    </ids-menu-item>\n    <ids-menu-item icon=\"user\" value=\"even-more-actions\">\n        Even More Actions\n    </ids-menu-item>\n    <ids-menu-item id=\"no-select\" value=\"no-select\">This one can't be selected (Check the console)</ids-menu-item>\n    </ids-menu-group>\n    <ids-separator></ids-separator>\n    <ids-menu-group id=\"other-settings\">\n    <ids-menu-item icon=\"more\" value=\"other-items\">Other Items</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\n### Selection Event Handling\n\nWhen an `<ids-menu-item>` element is selected from a menu, it has the potential to fire up to two different events.  The events fired depend on how the menu is configured.  Consider this menu:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nIn this example, when any of the menu's items are chosen by click or by keyboard, no selection events are fired.  This is because there is no `select` attribute determining single or multiple selection.  The menu item chosen will not change the menu's selection state, and will simply fire a `pick` event.\n\nThis next example will cause a both a `selected` event and a `pick` event to fire whenever an item is chosen.  No `deselected` events will fire in this case:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"single\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also have `toggleable` menu items where the menu item check can be turned on and off. For example\n\n```html\n<ids-menu>\n  <ids-menu-group select=\"single\">\n    <ids-menu-item icon=\"mail\" toggable value=\"mail\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also align the icon on the right side.\n\n```html\n<ids-menu>\n  <ids-menu-group>\n    <ids-menu-item icon=\"mail\" icon-align=\"end\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nThis next example will cause a either a `selected` OR `deselected` event, as well as a `pick` event, to fire whenever an item is chosen.  When an item is chosen, its selection state is changed, and the event fired corresponds to its new value:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"multiple\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nAlso in addition we fire a `click` event at the same time as `selected` as this may seem more natural. However, its not possible to attach a click event to individual menu items and this generally required more event handlers so is not preferred. For example:\n\n```ts\n// Add click listeners to all menu items\ndocument.querySelectorAll('ids-menu-item')?.forEach((menuItem) => {\n  menuItem?.addEventListener('click', (e: any) => {\n    console.info(`Menu item clicked: \"${e.target.text}\" (id \"${e.target.id}\")`);\n  });\n});\n```\n\n### Shortcut keys\n\nIdsMenuItem elements can have a `shortcut-keys` attribute defined, which will pass text representing a keyboard shortcut to be displayed into the white space opposite the regular text:\n\n```html\n<ids-menu-item id=\"action-create\" icon=\"folder\" shortcut-keys=\"⌘+R\">Create New Folder</ids-menu-item>\n```\n\n```js\nconst menuItem = document.querySelector('ids-menu-item');\nmenuItem.setAttribute('shortcut-keys', '⌘+R');\n```\n\n## Class Hierarchy Menu Group\n\n- IdsMenuGroup\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Header\n\n- IdsMenuHeader\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Item\n\n- IdsMenuItem\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This component is relatively backwards compatible except inforContextMenu should be replaced with popupmenu in the API call and class name\n- Remove class divider as it is deprecated\n- Checkbox construct is simplified\n- Group replaced with heading\n\n**4.x to 5.x**\n\n- The menu component has been changed to a web component and renamed to `ids-menu`.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-menu></ids-menu>`\n- If using events events are now plain JS events for example (i.e. menu click events)\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-menu-header","attributes":[{"name":"menu","values":[]}],"description":{"kind":"markdown","value":"# ids-menu\n\n## Description\n\nThe IdsMenu Component provides the ui for a menu. This includes groups, icons, submenus, text, disabled ect. By itself a menu is not very useful and will just paint on the page as if it was open. Use [IdsMenuButton]('../ids-menu-button/README.md') in order to show a menu on a button click. Or use [IdsPopupMenu]('../ids-popup-menu/README.md') to show a menu on a click or right click anywhere on the page. The construction of a menu is comprised of several related components.\n\n`ids-menu-group` is used to create a group for a set of menu items.\n`ids-menu-header` is used a as a label for groups of menu items\n`ids-menu-item` is the main component normal menu items\n\n## Use Cases\n\n- Display an application menu\n- Display submenus\n- Display a menu with icons\n\n## Terminology\n\n**Group** A label separating items in the menu in a logical group\n**Submenus** A a list of choices that is part of another list of choices\n\n## Attributes and Properties (ids-menu-group)\n\n- `disabled` {boolean} true if the entire menu should become disabled\n- `keep-open` {boolean} true if selection of an item within this group should cause the parent menu to close\n- `selection` {string} The type of selection to set this group between `single` and `multiple` or `none`\n- `wrap` {boolean} if true, the child menu-items will be styled into a column view.\n\n## Features (With Code Examples)\n\nA simple menu with three items can be created by creating a `ids-menu` with a single `ids-menu-group` and three `ids-menu-item` components.\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group wrap>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA menu can have a toggle-able menu item that is indicated with a check that toggles when you turn it on and off. In this example selecting `Two` will mark it checked and unchecked\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item toggleable>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA more complicated menu can be formed using combinations of  `ids-menu` with a `ids-menu-group` and nested `ids-menu-item` components.\n\n```html\n<ids-menu id=\"complex-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n    <ids-separator></ids-separator>\n    <ids-menu-item value=\"long-no-icons\">Very long, indescribable action with no icons</ids-menu-item>\n    <ids-menu-item icon=\"url\" disabled=\"true\" value=\"big-with-icons\">\n      Another big menu item, but with icons!\n    </ids-menu-item>\n  </ids-menu-group>\n  <ids-separator></ids-separator>\n  <ids-menu-header id=\"additional-actions-header\">Additional Actions</ids-menu-header>\n  <ids-menu-group id=\"more-settings\" aria-describedby=\"additional-actions-header\">\n    <ids-menu-item value=\"more-actions\">\n      More Actions\n    </ids-menu-item>\n    <ids-menu-item icon=\"user\" value=\"even-more-actions\">\n        Even More Actions\n    </ids-menu-item>\n    <ids-menu-item id=\"no-select\" value=\"no-select\">This one can't be selected (Check the console)</ids-menu-item>\n    </ids-menu-group>\n    <ids-separator></ids-separator>\n    <ids-menu-group id=\"other-settings\">\n    <ids-menu-item icon=\"more\" value=\"other-items\">Other Items</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\n### Selection Event Handling\n\nWhen an `<ids-menu-item>` element is selected from a menu, it has the potential to fire up to two different events.  The events fired depend on how the menu is configured.  Consider this menu:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nIn this example, when any of the menu's items are chosen by click or by keyboard, no selection events are fired.  This is because there is no `select` attribute determining single or multiple selection.  The menu item chosen will not change the menu's selection state, and will simply fire a `pick` event.\n\nThis next example will cause a both a `selected` event and a `pick` event to fire whenever an item is chosen.  No `deselected` events will fire in this case:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"single\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also have `toggleable` menu items where the menu item check can be turned on and off. For example\n\n```html\n<ids-menu>\n  <ids-menu-group select=\"single\">\n    <ids-menu-item icon=\"mail\" toggable value=\"mail\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also align the icon on the right side.\n\n```html\n<ids-menu>\n  <ids-menu-group>\n    <ids-menu-item icon=\"mail\" icon-align=\"end\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nThis next example will cause a either a `selected` OR `deselected` event, as well as a `pick` event, to fire whenever an item is chosen.  When an item is chosen, its selection state is changed, and the event fired corresponds to its new value:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"multiple\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nAlso in addition we fire a `click` event at the same time as `selected` as this may seem more natural. However, its not possible to attach a click event to individual menu items and this generally required more event handlers so is not preferred. For example:\n\n```ts\n// Add click listeners to all menu items\ndocument.querySelectorAll('ids-menu-item')?.forEach((menuItem) => {\n  menuItem?.addEventListener('click', (e: any) => {\n    console.info(`Menu item clicked: \"${e.target.text}\" (id \"${e.target.id}\")`);\n  });\n});\n```\n\n### Shortcut keys\n\nIdsMenuItem elements can have a `shortcut-keys` attribute defined, which will pass text representing a keyboard shortcut to be displayed into the white space opposite the regular text:\n\n```html\n<ids-menu-item id=\"action-create\" icon=\"folder\" shortcut-keys=\"⌘+R\">Create New Folder</ids-menu-item>\n```\n\n```js\nconst menuItem = document.querySelector('ids-menu-item');\nmenuItem.setAttribute('shortcut-keys', '⌘+R');\n```\n\n## Class Hierarchy Menu Group\n\n- IdsMenuGroup\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Header\n\n- IdsMenuHeader\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Item\n\n- IdsMenuItem\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This component is relatively backwards compatible except inforContextMenu should be replaced with popupmenu in the API call and class name\n- Remove class divider as it is deprecated\n- Checkbox construct is simplified\n- Group replaced with heading\n\n**4.x to 5.x**\n\n- The menu component has been changed to a web component and renamed to `ids-menu`.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-menu></ids-menu>`\n- If using events events are now plain JS events for example (i.e. menu click events)\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-menu-item","attributes":[{"name":"should-update","values":[]},{"name":"mo","description":"Watches for changes","values":[]},{"name":"color-variants","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"a","values":[]},{"name":"menu","values":[]},{"name":"group","values":[]},{"name":"disabled","description":"Retrieve the disabled state of the inner button element","values":[]},{"name":"data","description":"Get data of menu item","values":[]},{"name":"highlighted","values":[]},{"name":"icon","values":[]},{"name":"icon-el","values":[]},{"name":"inherit-color","values":[]},{"name":"pinnable","values":[]},{"name":"pinned","values":[]},{"name":"submenu","values":[]},{"name":"has-submenu","values":[]},{"name":"is-selectable","values":[]},{"name":"selected","values":[]},{"name":"shortcut-keys","values":[]},{"name":"shortcut-key-el","values":[]},{"name":"#tab-index","description":"Passes a tabindex attribute from the custom element to the hyperlink","values":[]},{"name":"#target","values":[]},{"name":"target","values":[]},{"name":"text","values":[]},{"name":"text-align","description":"Set the value of the text align attribute","values":[]},{"name":"icon-align","description":"Set the side the icon is on","values":[]},{"name":"value","values":[]},{"name":"viewbox","description":"Return the viewbox","values":[]},{"name":"toggleable","description":"Return the viewbox","values":[]},{"name":"min-width","description":"Get the minimum width for the menu item","values":[]},{"name":"max-width","description":"Get the maximum width for the menu item","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-menu\n\n## Description\n\nThe IdsMenu Component provides the ui for a menu. This includes groups, icons, submenus, text, disabled ect. By itself a menu is not very useful and will just paint on the page as if it was open. Use [IdsMenuButton]('../ids-menu-button/README.md') in order to show a menu on a button click. Or use [IdsPopupMenu]('../ids-popup-menu/README.md') to show a menu on a click or right click anywhere on the page. The construction of a menu is comprised of several related components.\n\n`ids-menu-group` is used to create a group for a set of menu items.\n`ids-menu-header` is used a as a label for groups of menu items\n`ids-menu-item` is the main component normal menu items\n\n## Use Cases\n\n- Display an application menu\n- Display submenus\n- Display a menu with icons\n\n## Terminology\n\n**Group** A label separating items in the menu in a logical group\n**Submenus** A a list of choices that is part of another list of choices\n\n## Attributes and Properties (ids-menu-group)\n\n- `disabled` {boolean} true if the entire menu should become disabled\n- `keep-open` {boolean} true if selection of an item within this group should cause the parent menu to close\n- `selection` {string} The type of selection to set this group between `single` and `multiple` or `none`\n- `wrap` {boolean} if true, the child menu-items will be styled into a column view.\n\n## Features (With Code Examples)\n\nA simple menu with three items can be created by creating a `ids-menu` with a single `ids-menu-group` and three `ids-menu-item` components.\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group wrap>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA menu can have a toggle-able menu item that is indicated with a check that toggles when you turn it on and off. In this example selecting `Two` will mark it checked and unchecked\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item toggleable>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA more complicated menu can be formed using combinations of  `ids-menu` with a `ids-menu-group` and nested `ids-menu-item` components.\n\n```html\n<ids-menu id=\"complex-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n    <ids-separator></ids-separator>\n    <ids-menu-item value=\"long-no-icons\">Very long, indescribable action with no icons</ids-menu-item>\n    <ids-menu-item icon=\"url\" disabled=\"true\" value=\"big-with-icons\">\n      Another big menu item, but with icons!\n    </ids-menu-item>\n  </ids-menu-group>\n  <ids-separator></ids-separator>\n  <ids-menu-header id=\"additional-actions-header\">Additional Actions</ids-menu-header>\n  <ids-menu-group id=\"more-settings\" aria-describedby=\"additional-actions-header\">\n    <ids-menu-item value=\"more-actions\">\n      More Actions\n    </ids-menu-item>\n    <ids-menu-item icon=\"user\" value=\"even-more-actions\">\n        Even More Actions\n    </ids-menu-item>\n    <ids-menu-item id=\"no-select\" value=\"no-select\">This one can't be selected (Check the console)</ids-menu-item>\n    </ids-menu-group>\n    <ids-separator></ids-separator>\n    <ids-menu-group id=\"other-settings\">\n    <ids-menu-item icon=\"more\" value=\"other-items\">Other Items</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\n### Selection Event Handling\n\nWhen an `<ids-menu-item>` element is selected from a menu, it has the potential to fire up to two different events.  The events fired depend on how the menu is configured.  Consider this menu:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nIn this example, when any of the menu's items are chosen by click or by keyboard, no selection events are fired.  This is because there is no `select` attribute determining single or multiple selection.  The menu item chosen will not change the menu's selection state, and will simply fire a `pick` event.\n\nThis next example will cause a both a `selected` event and a `pick` event to fire whenever an item is chosen.  No `deselected` events will fire in this case:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"single\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also have `toggleable` menu items where the menu item check can be turned on and off. For example\n\n```html\n<ids-menu>\n  <ids-menu-group select=\"single\">\n    <ids-menu-item icon=\"mail\" toggable value=\"mail\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also align the icon on the right side.\n\n```html\n<ids-menu>\n  <ids-menu-group>\n    <ids-menu-item icon=\"mail\" icon-align=\"end\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nThis next example will cause a either a `selected` OR `deselected` event, as well as a `pick` event, to fire whenever an item is chosen.  When an item is chosen, its selection state is changed, and the event fired corresponds to its new value:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"multiple\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nAlso in addition we fire a `click` event at the same time as `selected` as this may seem more natural. However, its not possible to attach a click event to individual menu items and this generally required more event handlers so is not preferred. For example:\n\n```ts\n// Add click listeners to all menu items\ndocument.querySelectorAll('ids-menu-item')?.forEach((menuItem) => {\n  menuItem?.addEventListener('click', (e: any) => {\n    console.info(`Menu item clicked: \"${e.target.text}\" (id \"${e.target.id}\")`);\n  });\n});\n```\n\n### Shortcut keys\n\nIdsMenuItem elements can have a `shortcut-keys` attribute defined, which will pass text representing a keyboard shortcut to be displayed into the white space opposite the regular text:\n\n```html\n<ids-menu-item id=\"action-create\" icon=\"folder\" shortcut-keys=\"⌘+R\">Create New Folder</ids-menu-item>\n```\n\n```js\nconst menuItem = document.querySelector('ids-menu-item');\nmenuItem.setAttribute('shortcut-keys', '⌘+R');\n```\n\n## Class Hierarchy Menu Group\n\n- IdsMenuGroup\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Header\n\n- IdsMenuHeader\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Item\n\n- IdsMenuItem\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This component is relatively backwards compatible except inforContextMenu should be replaced with popupmenu in the API call and class name\n- Remove class divider as it is deprecated\n- Checkbox construct is simplified\n- Group replaced with heading\n\n**4.x to 5.x**\n\n- The menu component has been changed to a web component and renamed to `ids-menu`.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-menu></ids-menu>`\n- If using events events are now plain JS events for example (i.e. menu click events)\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-menu","attributes":[{"name":"datasource","values":[]},{"name":"keyboard-event-target","values":[]},{"name":"last-hovered","values":[]},{"name":"last-navigated","values":[]},{"name":"child-elements","description":"Safely retrieves child elements of the menu without regard\nfor whether or not they are direct descendants, or slotted","values":[]},{"name":"data","description":"Set the data array of the menu","values":[]},{"name":"groups","values":[]},{"name":"headers","values":[]},{"name":"items","values":[]},{"name":"focused","values":[]},{"name":"focus-target","values":[]},{"name":"highlighted","values":[]},{"name":"parent-menu","values":[]},{"name":"parent-menu-item","values":[]},{"name":"submenus","values":[]},{"name":"disabled","values":[]},{"name":"has-icons","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-menu\n\n## Description\n\nThe IdsMenu Component provides the ui for a menu. This includes groups, icons, submenus, text, disabled ect. By itself a menu is not very useful and will just paint on the page as if it was open. Use [IdsMenuButton]('../ids-menu-button/README.md') in order to show a menu on a button click. Or use [IdsPopupMenu]('../ids-popup-menu/README.md') to show a menu on a click or right click anywhere on the page. The construction of a menu is comprised of several related components.\n\n`ids-menu-group` is used to create a group for a set of menu items.\n`ids-menu-header` is used a as a label for groups of menu items\n`ids-menu-item` is the main component normal menu items\n\n## Use Cases\n\n- Display an application menu\n- Display submenus\n- Display a menu with icons\n\n## Terminology\n\n**Group** A label separating items in the menu in a logical group\n**Submenus** A a list of choices that is part of another list of choices\n\n## Attributes and Properties (ids-menu-group)\n\n- `disabled` {boolean} true if the entire menu should become disabled\n- `keep-open` {boolean} true if selection of an item within this group should cause the parent menu to close\n- `selection` {string} The type of selection to set this group between `single` and `multiple` or `none`\n- `wrap` {boolean} if true, the child menu-items will be styled into a column view.\n\n## Features (With Code Examples)\n\nA simple menu with three items can be created by creating a `ids-menu` with a single `ids-menu-group` and three `ids-menu-item` components.\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group wrap>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA menu can have a toggle-able menu item that is indicated with a check that toggles when you turn it on and off. In this example selecting `Two` will mark it checked and unchecked\n\n```html\n<ids-menu id=\"simple-menu\">\n  <ids-menu-group>\n    <ids-menu-item>One</ids-menu-item>\n    <ids-menu-item toggleable>Two</ids-menu-item>\n    <ids-menu-item>Three</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nA more complicated menu can be formed using combinations of  `ids-menu` with a `ids-menu-group` and nested `ids-menu-item` components.\n\n```html\n<ids-menu id=\"complex-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n    <ids-separator></ids-separator>\n    <ids-menu-item value=\"long-no-icons\">Very long, indescribable action with no icons</ids-menu-item>\n    <ids-menu-item icon=\"url\" disabled=\"true\" value=\"big-with-icons\">\n      Another big menu item, but with icons!\n    </ids-menu-item>\n  </ids-menu-group>\n  <ids-separator></ids-separator>\n  <ids-menu-header id=\"additional-actions-header\">Additional Actions</ids-menu-header>\n  <ids-menu-group id=\"more-settings\" aria-describedby=\"additional-actions-header\">\n    <ids-menu-item value=\"more-actions\">\n      More Actions\n    </ids-menu-item>\n    <ids-menu-item icon=\"user\" value=\"even-more-actions\">\n        Even More Actions\n    </ids-menu-item>\n    <ids-menu-item id=\"no-select\" value=\"no-select\">This one can't be selected (Check the console)</ids-menu-item>\n    </ids-menu-group>\n    <ids-separator></ids-separator>\n    <ids-menu-group id=\"other-settings\">\n    <ids-menu-item icon=\"more\" value=\"other-items\">Other Items</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\n### Selection Event Handling\n\nWhen an `<ids-menu-item>` element is selected from a menu, it has the potential to fire up to two different events.  The events fired depend on how the menu is configured.  Consider this menu:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nIn this example, when any of the menu's items are chosen by click or by keyboard, no selection events are fired.  This is because there is no `select` attribute determining single or multiple selection.  The menu item chosen will not change the menu's selection state, and will simply fire a `pick` event.\n\nThis next example will cause a both a `selected` event and a `pick` event to fire whenever an item is chosen.  No `deselected` events will fire in this case:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"single\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also have `toggleable` menu items where the menu item check can be turned on and off. For example\n\n```html\n<ids-menu>\n  <ids-menu-group select=\"single\">\n    <ids-menu-item icon=\"mail\" toggable value=\"mail\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nYou can also align the icon on the right side.\n\n```html\n<ids-menu>\n  <ids-menu-group>\n    <ids-menu-item icon=\"mail\" icon-align=\"end\">Keep Active</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nThis next example will cause a either a `selected` OR `deselected` event, as well as a `pick` event, to fire whenever an item is chosen.  When an item is chosen, its selection state is changed, and the event fired corresponds to its new value:\n\n```html\n<ids-menu id=\"my-menu\">\n  <ids-menu-group id=\"main-settings\" select=\"multiple\">\n    <ids-menu-item icon=\"mail\" value=\"mail\">Mail</ids-menu-item>\n    <ids-menu-item icon=\"filter\" value=\"filter\">Filter</ids-menu-item>\n    <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n  </ids-menu-group>\n</ids-menu>\n```\n\nAlso in addition we fire a `click` event at the same time as `selected` as this may seem more natural. However, its not possible to attach a click event to individual menu items and this generally required more event handlers so is not preferred. For example:\n\n```ts\n// Add click listeners to all menu items\ndocument.querySelectorAll('ids-menu-item')?.forEach((menuItem) => {\n  menuItem?.addEventListener('click', (e: any) => {\n    console.info(`Menu item clicked: \"${e.target.text}\" (id \"${e.target.id}\")`);\n  });\n});\n```\n\n### Shortcut keys\n\nIdsMenuItem elements can have a `shortcut-keys` attribute defined, which will pass text representing a keyboard shortcut to be displayed into the white space opposite the regular text:\n\n```html\n<ids-menu-item id=\"action-create\" icon=\"folder\" shortcut-keys=\"⌘+R\">Create New Folder</ids-menu-item>\n```\n\n```js\nconst menuItem = document.querySelector('ids-menu-item');\nmenuItem.setAttribute('shortcut-keys', '⌘+R');\n```\n\n## Class Hierarchy Menu Group\n\n- IdsMenuGroup\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Header\n\n- IdsMenuHeader\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Class Hierarchy Menu Item\n\n- IdsMenuItem\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsLocaleMixin\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This component is relatively backwards compatible except inforContextMenu should be replaced with popupmenu in the API call and class name\n- Remove class divider as it is deprecated\n- Checkbox construct is simplified\n- Group replaced with heading\n\n**4.x to 5.x**\n\n- The menu component has been changed to a web component and renamed to `ids-menu`.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-menu></ids-menu>`\n- If using events events are now plain JS events for example (i.e. menu click events)\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-menu-button-attributes","description":{"kind":"markdown","value":"# ids-menu-button\n\n## Description\n\nThe IDS Menu Button component is an extension of the standard [Button component](../ids-button/README.md) that is styled with Infor branding, and allows for being implicitly linked to an [IDS Popup Menu Component](../ids-popup-menu/README.md) that can be used for triggering multiple different actions.\n\n## Use Cases\n\n- Create menu buttons that store multiple different actions\n- Create menu buttons that allow selection of single items within groups\n- Create menu buttons that allow selection of multiple items within groups\n\n## Terminology\n\n**Dropdown Icon** Menu Buttons have a secondary icon (separate from the IDS Button \"icon\" property) that acts as the Popup Menu's Arrow Target.  This icon is normally a standard \"dropdown\" icon, but can be changed if needed.\n\n## Settings (Attributes)\n\n- `disabled` true if the Menu Button should become disabled.  This also makes the attached Popupmenu and all of its sub-elements disabled.\n- `dropdownIcon` sets the type of icon to be used as the dropdown icon.  If null/empty, the dropdown icon is not displayed.  Note that this is different than the standard IDS Button `icon` property, and both can exist at the same time.\n- `formatterWidth` set the width and formatter style for menu button.\n- `menu` can be defined as a CSS selector string, or if using the JS property, can be a direct reference to an IdsPopupMenu component.\n- `value` sets/gets selected menu items by providing list of menu item values\n\n## Methods\n\n- `async beforeShow(opts)` A callback that fires when the menu is opened. You can use the opts to see what menu and details about what is opening. Since the method is async you can do a call back and return structured [menu data](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/assets/data/menu-contents.json) when returned the menu will show with this data. See [popup menu](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/components/ids-popup-menu/README.md) for more details.\n\n## States and Variations\n\nSince the menu button combined from several IDS Components, you can refer to their documentation for information about states/variants:\n\n- [IdsButton](../ids-button/README.md) for Button-specific states\n- [IdsPopupMenu](../ids-popup-menu/README.md) for Menu-specific states\n\n### Variations\n\n- [\"More Actions\" Button]() is technically a menu button, since it contains additional actions related to the current workflow hidden in a Popup Menu.  This variant displays no dropdown icon, and appears as an Icon Button.\n\n## Features (with code samples)\n\nMost menu buttons are implicitly linked to their Popup Menus using `id` attributes.  The Popup Menu also needs to be told which `target` element to use:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\">\n    <span>My Menu Button</span>\n</ids-menu-button>\n<!-- ... -->\n<ids-popup-menu id=\"my-menu\" target=\"#my-button\">\n    <!-- ... -->\n</ids-popup-menu>\n```\n\nMenu Buttons themselves can have the Dropdown Icon set directly on the markup:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\" dropdown-icon>\n    <span>My Menu Button</span>\n</ids-menu-button>\n```\n\nBoth the regular IdsButton `icon` setting and `dropdown-icon` can be used together:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\" icon=\"settings\" dropdown-icon>\n    <span>My Menu Button</span>\n</ids-menu-button>\n```\n\nThe Dropdown Icon can be customized, if necessary:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\" dropdown-icon=\"launch\">\n    <span>My Menu Button</span>\n</ids-menu-button>\n```\n\nThe button can set as formatter width and style:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\" formatter-width=\"125px\" dropdown-icon>\n    <span>My Menu Button</span>\n</ids-menu-button>\n```\n\n## Keyboard Guidelines\n\n- <kbd>Enter/Return</kbd> When the Button is focused, will cause the menu to toggle open/closed.\n- <kbd>Enter/Return</kbd> When the Popup Menu Items are focused, performs selection/deselection where available.  On items that contain submenus, this will not select/deselect and will instead trigger the submenu.\n\n## Responsive Guidelines\n\n- When the menu is opened, it will intelligently decide which direction to flow.  If there is more space between the top of the button and the top of the viewport (compared to the bottom of the button/viewport), it will open above the button.  In some cases, the menu may open to the left/right of the button.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Menu Button was not a \"standard\" component in 4.x, and needed to be created manually.\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-menu-button></ids-menu-button>`\n- Can now be imported as a single JS file and used with encapsulated styles.\n- Now exists as its own component\n- Implicitly linked to a menu by using `menu=\"my-menu\"` CSS selector attribute, or direct element reference in JS\n"}},{"name":"ids-menu-button","attributes":[{"name":"proto-classes","description":"Figure out the classes","values":[]},{"name":"disabled","description":"Passes a disabled attribute from the custom element to the button","values":[]},{"name":"display-selected-text","values":[]},{"name":"dropdown-icon","values":[]},{"name":"dropdown-icon-el","values":[]},{"name":"menu","values":[]},{"name":"value","description":"Set menu's selected items by value","values":[]},{"name":"menu-el","values":[]},{"name":"formatter-width","description":"Set the formatter width for menu button","values":[]},{"name":"align","description":"Get the align attribute","values":[]},{"name":"should-update","values":[]},{"name":"#is-setting-initial-state","values":[]},{"name":"#size-ro","description":"ResizeObserver for size-based margin computation","values":[]},{"name":"#is-overflowing","values":[]},{"name":"size-widths","description":"Map of size keys to CSS variable names matching ids-input widths","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"#mo","description":"Watches for changes","values":[]},{"name":"#audible-mo","description":"Watches for changes on .audible element within the button","values":[]},{"name":"#is-updating-hidden","values":[]},{"name":"tab-index","description":"Set the tab index value","values":[]},{"name":"hidden","description":"Set the hidden value","values":[]},{"name":"button","values":[]},{"name":"span","values":[]},{"name":"compact","description":"Indicates whether the button is in a compact state.","values":[]},{"name":"content-align","description":"Set the button content alignment between 'default (center)', 'start', or 'end'","values":[]},{"name":"overflow","description":"Set how content overflows; can specify 'ellipsis', or undefined or 'none'","values":[]},{"name":"css-class","values":[]},{"name":"#tab-index","description":"Passes a tabIndex attribute from the custom element to the button","values":[]},{"name":"icon","description":"Gets the current icon used on the button","values":[]},{"name":"icon-el","description":"Gets the current icon element","values":[]},{"name":"icon-align","description":"Sets the automatic alignment of an existing icon to the 'start' or 'end' of the text","values":[]},{"name":"width","description":"Set width of button","values":[]},{"name":"height","description":"Set height of button","values":[]},{"name":"no-animation","description":"Gets flag for generative AI animation","values":[]},{"name":"text","values":[]},{"name":"appearance","description":"Set the button appearance between 'default', 'primary', 'secondary', 'tertiary', or 'destructive'","values":[]},{"name":"type","description":"Sets the HTMLButtonElement 'type' attribute","values":[]},{"name":"no-margins","description":"Sets the no margins attribute","values":[]},{"name":"margin-block-end","description":"Sets the margin-block-end on the button","values":[]},{"name":"no-padding","values":[]},{"name":"square","values":[]},{"name":"badge-color","values":[]},{"name":"badge-position","values":[]},{"name":"label-audible","description":"Set the audible text of button","values":[]},{"name":"label-width","description":"Gets the current label width value","values":[]},{"name":"label-position","description":"Gets the current label position value","values":[]},{"name":"size","description":"Gets the current size value","values":[]},{"name":"described-by","description":"Aria describedby for button","values":[]},{"name":"background-fill","description":"Get the background fill setting","values":[]}],"description":{"kind":"markdown","value":"# ids-menu-button\n\n## Description\n\nThe IDS Menu Button component is an extension of the standard [Button component](../ids-button/README.md) that is styled with Infor branding, and allows for being implicitly linked to an [IDS Popup Menu Component](../ids-popup-menu/README.md) that can be used for triggering multiple different actions.\n\n## Use Cases\n\n- Create menu buttons that store multiple different actions\n- Create menu buttons that allow selection of single items within groups\n- Create menu buttons that allow selection of multiple items within groups\n\n## Terminology\n\n**Dropdown Icon** Menu Buttons have a secondary icon (separate from the IDS Button \"icon\" property) that acts as the Popup Menu's Arrow Target.  This icon is normally a standard \"dropdown\" icon, but can be changed if needed.\n\n## Settings (Attributes)\n\n- `disabled` true if the Menu Button should become disabled.  This also makes the attached Popupmenu and all of its sub-elements disabled.\n- `dropdownIcon` sets the type of icon to be used as the dropdown icon.  If null/empty, the dropdown icon is not displayed.  Note that this is different than the standard IDS Button `icon` property, and both can exist at the same time.\n- `formatterWidth` set the width and formatter style for menu button.\n- `menu` can be defined as a CSS selector string, or if using the JS property, can be a direct reference to an IdsPopupMenu component.\n- `value` sets/gets selected menu items by providing list of menu item values\n\n## Methods\n\n- `async beforeShow(opts)` A callback that fires when the menu is opened. You can use the opts to see what menu and details about what is opening. Since the method is async you can do a call back and return structured [menu data](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/assets/data/menu-contents.json) when returned the menu will show with this data. See [popup menu](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/components/ids-popup-menu/README.md) for more details.\n\n## States and Variations\n\nSince the menu button combined from several IDS Components, you can refer to their documentation for information about states/variants:\n\n- [IdsButton](../ids-button/README.md) for Button-specific states\n- [IdsPopupMenu](../ids-popup-menu/README.md) for Menu-specific states\n\n### Variations\n\n- [\"More Actions\" Button]() is technically a menu button, since it contains additional actions related to the current workflow hidden in a Popup Menu.  This variant displays no dropdown icon, and appears as an Icon Button.\n\n## Features (with code samples)\n\nMost menu buttons are implicitly linked to their Popup Menus using `id` attributes.  The Popup Menu also needs to be told which `target` element to use:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\">\n    <span>My Menu Button</span>\n</ids-menu-button>\n<!-- ... -->\n<ids-popup-menu id=\"my-menu\" target=\"#my-button\">\n    <!-- ... -->\n</ids-popup-menu>\n```\n\nMenu Buttons themselves can have the Dropdown Icon set directly on the markup:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\" dropdown-icon>\n    <span>My Menu Button</span>\n</ids-menu-button>\n```\n\nBoth the regular IdsButton `icon` setting and `dropdown-icon` can be used together:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\" icon=\"settings\" dropdown-icon>\n    <span>My Menu Button</span>\n</ids-menu-button>\n```\n\nThe Dropdown Icon can be customized, if necessary:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\" dropdown-icon=\"launch\">\n    <span>My Menu Button</span>\n</ids-menu-button>\n```\n\nThe button can set as formatter width and style:\n\n```html\n<ids-menu-button id=\"my-button\" menu=\"my-menu\" formatter-width=\"125px\" dropdown-icon>\n    <span>My Menu Button</span>\n</ids-menu-button>\n```\n\n## Keyboard Guidelines\n\n- <kbd>Enter/Return</kbd> When the Button is focused, will cause the menu to toggle open/closed.\n- <kbd>Enter/Return</kbd> When the Popup Menu Items are focused, performs selection/deselection where available.  On items that contain submenus, this will not select/deselect and will instead trigger the submenu.\n\n## Responsive Guidelines\n\n- When the menu is opened, it will intelligently decide which direction to flow.  If there is more space between the top of the button and the top of the viewport (compared to the bottom of the button/viewport), it will open above the button.  In some cases, the menu may open to the left/right of the button.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n- Menu Button was not a \"standard\" component in 4.x, and needed to be created manually.\n\n**4.x to 5.x**\n- Markup has changed to a custom element `<ids-menu-button></ids-menu-button>`\n- Can now be imported as a single JS file and used with encapsulated styles.\n- Now exists as its own component\n- Implicitly linked to a menu by using `menu=\"my-menu\"` CSS selector attribute, or direct element reference in JS\n"}},{"name":"ids-message-service","attributes":[],"description":{"kind":"markdown","value":"# Ids Message\n\nThe IdsMessage Component provides a quick interface for displaying an application message to the user in [Modal]('../ids-modal/README.md'), along with providing quick actions related to the message.\n\n## Use Cases\n\n- Display application information that requires a user's attention\n- Convey a specific status to the user\n- Provide actions that the user can take to address the information\n\n## Terminology\n\n**Status** Indicates whether the message is normal (default), error, warning, success, or informative\n\n## Attributes and Properties\n\n- `status` sets/removes the Status type\n- `message` sets the contents of the message\n\n## Features (With Code Examples)\n\nA basic, barebones message might look like this:\n\n```html\n<ids-message id=\"my-message\">\n    <p>This is my message</p>\n</ids-message>\n```\n\nMessages can have titles and buttons (just the same as [Modals](../ids-modal/README.md)), as well as Statuses.  Statuses and Titles are appended with an attribute on the Message, while Buttons are added by slot.\n\n```html\n<ids-message id=\"my-message\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">My Message Title</ids-text>\n    <p>This is my message</p>\n    <ids-modal-button slot=\"buttons\" appearance=\"secondary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" appearance=\"primary\" cancel>Cancel</ids-modal-button>\n</ids-message>\n```\n\nYou can manipulate the Message by using its Javascript API\n\n```js\nconst messageEl = document.querySelector('#my-message');\nmessageEl.messageTitle = 'Different Title';\nmessageEl.message = 'Alternate Message';\nmessageEl.status = 'success';\n```\n\nMessages extend [Modals](../ids-modal/README.md), so it's possible to configure them in similar fashion.  You can control Messages manually with the same API:\n\n```js\n// Manually show a Message Component\nconst messageEl = document.querySelector('#my-message');\nmessageEl.show();\n```\n\nYou can also use the Modal's `target` property to activate a Message component by clicking an associated target element, like a button for example:\n\n```html\n<ids-message id=\"my-message\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">My Message Title</ids-text>\n    <p>This is my message</p>\n    <ids-modal-button slot=\"buttons\" appearance=\"secondary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" appearance=\"primary\" cancel>Cancel</ids-modal-button>\n</ids-message>\n\n<ids-button id=\"trigger-button\" appearance=\"secondary\">\n    <span>Show Message</span>\n    <ids-icon icon=\"launch\"></ids-icon>\n</ids-button>\n```\n\n```js\n// Show a message component when clicking a trigger button\nconst messageEl = document.querySelector('#my-message');\nconst btnEl = document.querySelector('#trigger-button');\nmessageEl.target = btnEl;\n\nbtnEl.click();\n```\n\nThe `IdsMessage` component has three properties that control its `width`, `minWidth`, and `maxWidth`. These properties allow for flexible layout design and responsive behavior. You can set the properties in the following way:\n\n1.) Set the properties in the markup.\n\n```html\n<ids-message\n      id=\"my-message\"\n      status=\"error\"\n      width=\"fit-content\"\n      max-width=\"fit-content\"\n      min-width=\"fit-content\">\n  <ids-text>...</ids-text>\n</ids-message>\n\n```\n\n2.) Set the properties programmatically.\n\n```js\nconst messageEl = document.querySelector('#my-message');\nmessageEl.width = '500px';\nmessageEl.minWidth = '300px';\nmessageEl.maxWidth = '800px';\n```\n\n## Using the Message Service\n\nA service is provided that allows you to show and hide individual messages. The API works as follows:\n\n```js\nimport IdsMessageService from '../ids-message-service';\n\nIdsMessageService.show({\n  id: 'ids-message-1',\n  status: 'error',\n  title: 'Sample Error',\n  message: 'Sample message description. Here is some information about what you can do about. Hit escape to close this message',\n  buttons: [\n    {\n      id: 'btn-acknowledge',\n      text: 'Acknowledge',\n      click: async (e: Event, message: IdsMessage) => {\n        console.info('Acknowledge clicked', e, message);\n        await message.hide();\n      },\n      isDefault: true\n    },\n    {\n      id: 'btn-cancel',\n      text: 'Cancel',\n      click: async (e: Event, message: IdsMessage) => {\n        console.info('Cancel clicked', e, message);\n      },\n      isCancel: true\n    }\n  ]\n});\n\nIdsMessageService.hide('ids-message-1');\n```\n\n## Settings and Attributes\n\n- `status` {string | IdsMessageAlertType} Sets the status of the modal. Can be one of: 'none' | 'default' | 'error' | 'alert' | 'success' | 'info' | 'warning' | 'question'\n- `message` {string} text shown inside the message dialog (can be markup as well)\n- `opacity` {string | number} sets the opacity of the overlay\n- `hidden` {boolean} Hides the element from display\n- `id` {string} when used as a service this can be used to identify the message\n- `title` {string} when used as a service this can be used to set the message title\n- `buttons` {Array<IdsModalButton>} when used as a service this can be used to set the message buttons\n- `width` {string} sets the width of the `IdsMessage` component. This property can accept values like pixel values (`px`), percentages (`%`), or any other valid CSS width value.\n- `min-width` {string} sets the minimum width of the `IdsMessage` component. This property can accept values like pixel values (`px`), percentages (`%`), or any other valid CSS min-width value.\n- `max-width` {string} sets the maximun width of the `IdsMessage` component. This property can accept values like pixel values (`px`), percentages (`%`), or any other valid CSS max-width value.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Very similar and compatible with newer versions of 3.X\n- dialogType option deprecated. Instead use either modal or message component\n- shortMessage option now called message because there is only one option buttons works the same\n\n**4.x to 5.x**\n\n- The message component has been changed to a web component and renamed to `ids-message`.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-message></ids-message>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- Close X is deprecated as it is redundant with the modal buttons\n- Allowed tags is not needed as you can put your own markup in the light DOM now\n- The Message component now extends the Modal component, containing the same properties and methods.\n- Modal Buttons, Title, Status, and Message can be changed via API\n"}},{"name":"ids-message","attributes":[{"name":"aria-label-content","description":"Used for ARIA Labels and other content","values":[]},{"name":"message","values":[]},{"name":"opacity","values":[]},{"name":"status","values":[]},{"name":"width","description":"Set the width of the message.","values":[]},{"name":"max-width","description":"Set the max-width of the message.","values":[]},{"name":"min-width","description":"Set the min-width of the message.","values":[]},{"name":"is-service-message","values":[]},{"name":"z-count","values":[]},{"name":"should-update","values":[]},{"name":"on-button-click","values":[]},{"name":"ro","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"#visible","values":[]},{"name":"global-keydown-listener","values":[]},{"name":"auto-focus","description":"Get whether to focus the first input element instead of the close button","values":[]},{"name":"focus-target","description":"Get whether to focus the target element for modal","values":[]},{"name":"buttons","description":"Get the currently slotted buttons","values":[]},{"name":"button-set","description":"Get the current button group","values":[]},{"name":"title-slot","description":"Get the slotted title element or the default title slot","values":[]},{"name":"modal-content-el","description":"Get the Modal's content wrapper element","values":[]},{"name":"fullsize","description":"Get the breakpoint at which the Modal will change from normal mode to fullsize mode","values":[]},{"name":"show-close-button","description":"Get whether the close button is shown","values":[]},{"name":"suppress-enter-key","description":"Get whether the Enter key is suppressed from dismissing the modal","values":[]},{"name":"close-button","description":"Get the close button element","values":[]},{"name":"overlay","description":"Sets the overlay element for the modal","values":[]},{"name":"message-title","description":"Sets the content of the message's title","values":[]},{"name":"scrollable","description":"Get the modal scrollable setting","values":[]},{"name":"visible","description":"Sets whether the Modal is visible","values":[]},{"name":"click-outside-to-close","description":"Set whether or not to allow the modal to close by clicking outside","values":[]},{"name":"height","description":"Get the modal height","values":[]},{"name":"overflow","description":"Get the overflow behavior for the modal content","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# Ids Message\n\nThe IdsMessage Component provides a quick interface for displaying an application message to the user in [Modal]('../ids-modal/README.md'), along with providing quick actions related to the message.\n\n## Use Cases\n\n- Display application information that requires a user's attention\n- Convey a specific status to the user\n- Provide actions that the user can take to address the information\n\n## Terminology\n\n**Status** Indicates whether the message is normal (default), error, warning, success, or informative\n\n## Attributes and Properties\n\n- `status` sets/removes the Status type\n- `message` sets the contents of the message\n\n## Features (With Code Examples)\n\nA basic, barebones message might look like this:\n\n```html\n<ids-message id=\"my-message\">\n    <p>This is my message</p>\n</ids-message>\n```\n\nMessages can have titles and buttons (just the same as [Modals](../ids-modal/README.md)), as well as Statuses.  Statuses and Titles are appended with an attribute on the Message, while Buttons are added by slot.\n\n```html\n<ids-message id=\"my-message\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">My Message Title</ids-text>\n    <p>This is my message</p>\n    <ids-modal-button slot=\"buttons\" appearance=\"secondary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" appearance=\"primary\" cancel>Cancel</ids-modal-button>\n</ids-message>\n```\n\nYou can manipulate the Message by using its Javascript API\n\n```js\nconst messageEl = document.querySelector('#my-message');\nmessageEl.messageTitle = 'Different Title';\nmessageEl.message = 'Alternate Message';\nmessageEl.status = 'success';\n```\n\nMessages extend [Modals](../ids-modal/README.md), so it's possible to configure them in similar fashion.  You can control Messages manually with the same API:\n\n```js\n// Manually show a Message Component\nconst messageEl = document.querySelector('#my-message');\nmessageEl.show();\n```\n\nYou can also use the Modal's `target` property to activate a Message component by clicking an associated target element, like a button for example:\n\n```html\n<ids-message id=\"my-message\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">My Message Title</ids-text>\n    <p>This is my message</p>\n    <ids-modal-button slot=\"buttons\" appearance=\"secondary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" appearance=\"primary\" cancel>Cancel</ids-modal-button>\n</ids-message>\n\n<ids-button id=\"trigger-button\" appearance=\"secondary\">\n    <span>Show Message</span>\n    <ids-icon icon=\"launch\"></ids-icon>\n</ids-button>\n```\n\n```js\n// Show a message component when clicking a trigger button\nconst messageEl = document.querySelector('#my-message');\nconst btnEl = document.querySelector('#trigger-button');\nmessageEl.target = btnEl;\n\nbtnEl.click();\n```\n\nThe `IdsMessage` component has three properties that control its `width`, `minWidth`, and `maxWidth`. These properties allow for flexible layout design and responsive behavior. You can set the properties in the following way:\n\n1.) Set the properties in the markup.\n\n```html\n<ids-message\n      id=\"my-message\"\n      status=\"error\"\n      width=\"fit-content\"\n      max-width=\"fit-content\"\n      min-width=\"fit-content\">\n  <ids-text>...</ids-text>\n</ids-message>\n\n```\n\n2.) Set the properties programmatically.\n\n```js\nconst messageEl = document.querySelector('#my-message');\nmessageEl.width = '500px';\nmessageEl.minWidth = '300px';\nmessageEl.maxWidth = '800px';\n```\n\n## Using the Message Service\n\nA service is provided that allows you to show and hide individual messages. The API works as follows:\n\n```js\nimport IdsMessageService from '../ids-message-service';\n\nIdsMessageService.show({\n  id: 'ids-message-1',\n  status: 'error',\n  title: 'Sample Error',\n  message: 'Sample message description. Here is some information about what you can do about. Hit escape to close this message',\n  buttons: [\n    {\n      id: 'btn-acknowledge',\n      text: 'Acknowledge',\n      click: async (e: Event, message: IdsMessage) => {\n        console.info('Acknowledge clicked', e, message);\n        await message.hide();\n      },\n      isDefault: true\n    },\n    {\n      id: 'btn-cancel',\n      text: 'Cancel',\n      click: async (e: Event, message: IdsMessage) => {\n        console.info('Cancel clicked', e, message);\n      },\n      isCancel: true\n    }\n  ]\n});\n\nIdsMessageService.hide('ids-message-1');\n```\n\n## Settings and Attributes\n\n- `status` {string | IdsMessageAlertType} Sets the status of the modal. Can be one of: 'none' | 'default' | 'error' | 'alert' | 'success' | 'info' | 'warning' | 'question'\n- `message` {string} text shown inside the message dialog (can be markup as well)\n- `opacity` {string | number} sets the opacity of the overlay\n- `hidden` {boolean} Hides the element from display\n- `id` {string} when used as a service this can be used to identify the message\n- `title` {string} when used as a service this can be used to set the message title\n- `buttons` {Array<IdsModalButton>} when used as a service this can be used to set the message buttons\n- `width` {string} sets the width of the `IdsMessage` component. This property can accept values like pixel values (`px`), percentages (`%`), or any other valid CSS width value.\n- `min-width` {string} sets the minimum width of the `IdsMessage` component. This property can accept values like pixel values (`px`), percentages (`%`), or any other valid CSS min-width value.\n- `max-width` {string} sets the maximun width of the `IdsMessage` component. This property can accept values like pixel values (`px`), percentages (`%`), or any other valid CSS max-width value.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Very similar and compatible with newer versions of 3.X\n- dialogType option deprecated. Instead use either modal or message component\n- shortMessage option now called message because there is only one option buttons works the same\n\n**4.x to 5.x**\n\n- The message component has been changed to a web component and renamed to `ids-message`.\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-message></ids-message>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- Close X is deprecated as it is redundant with the modal buttons\n- Allowed tags is not needed as you can put your own markup in the light DOM now\n- The Message component now extends the Modal component, containing the same properties and methods.\n- Modal Buttons, Title, Status, and Message can be changed via API\n"}},{"name":"ids-modal-button","attributes":[{"name":"proto-classes","description":"Figure out the classes","values":[]},{"name":"cancel","values":[]},{"name":"should-update","values":[]},{"name":"#is-setting-initial-state","values":[]},{"name":"#size-ro","description":"ResizeObserver for size-based margin computation","values":[]},{"name":"#is-overflowing","values":[]},{"name":"size-widths","description":"Map of size keys to CSS variable names matching ids-input widths","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"#mo","description":"Watches for changes","values":[]},{"name":"#audible-mo","description":"Watches for changes on .audible element within the button","values":[]},{"name":"#is-updating-hidden","values":[]},{"name":"tab-index","description":"Set the tab index value","values":[]},{"name":"hidden","description":"Set the hidden value","values":[]},{"name":"button","values":[]},{"name":"span","values":[]},{"name":"compact","description":"Indicates whether the button is in a compact state.","values":[]},{"name":"content-align","description":"Set the button content alignment between 'default (center)', 'start', or 'end'","values":[]},{"name":"overflow","description":"Set how content overflows; can specify 'ellipsis', or undefined or 'none'","values":[]},{"name":"css-class","values":[]},{"name":"disabled","description":"Passes a disabled attribute from the custom element to the button","values":[]},{"name":"#tab-index","description":"Passes a tabIndex attribute from the custom element to the button","values":[]},{"name":"icon","description":"Gets the current icon used on the button","values":[]},{"name":"icon-el","description":"Gets the current icon element","values":[]},{"name":"icon-align","description":"Sets the automatic alignment of an existing icon to the 'start' or 'end' of the text","values":[]},{"name":"width","description":"Set width of button","values":[]},{"name":"height","description":"Set height of button","values":[]},{"name":"no-animation","description":"Gets flag for generative AI animation","values":[]},{"name":"text","values":[]},{"name":"appearance","description":"Set the button appearance between 'default', 'primary', 'secondary', 'tertiary', or 'destructive'","values":[]},{"name":"type","description":"Sets the HTMLButtonElement 'type' attribute","values":[]},{"name":"no-margins","description":"Sets the no margins attribute","values":[]},{"name":"margin-block-end","description":"Sets the margin-block-end on the button","values":[]},{"name":"no-padding","values":[]},{"name":"square","values":[]},{"name":"badge-color","values":[]},{"name":"badge-position","values":[]},{"name":"label-audible","description":"Set the audible text of button","values":[]},{"name":"label-width","description":"Gets the current label width value","values":[]},{"name":"label-position","description":"Gets the current label position value","values":[]},{"name":"size","description":"Gets the current size value","values":[]},{"name":"described-by","description":"Aria describedby for button","values":[]},{"name":"background-fill","description":"Get the background fill setting","values":[]}],"description":{"kind":"markdown","value":"# ids-modal\n\n## Description\n\nThe modal is a dialog, built on top of the [ids-popup](../ids-popup/README.md), that displays information over page content. See more [usage details](https://design.infor.com/components/components/modal).\n\n## Terminology\n\n**Overlay** The transparent background that exists between the Modal and the page content. The opacity is adjustable.\n**Target** Refers to the element that will \"trigger\" the Modal by click.  This element is optional, as Modals can exist and be triggered by other operations.\n\n## Settings (Attributes)\n\n- `fullsize` Defines what breakpoint (if any) should cause the modal to transform into full size mode, which takes up 100% width/height of the browser viewport. Can also be set to `''` (no change) or `always` (always at 100%).\n- `focus-target` {boolean} Enable the behavior of focusing the target element of the modal after it closes. The default is `true`.\n- `visible` Shows or hides the Modal.\n- `buttons` (readonly) contains a list of references to any Modal Buttons present.\n- `messageTitle` The text present at the very top of the modal to indicate its purpose.\n- `scrollable` If `true`, allows the \"modal-content\" element inside the modal to scroll its contents.\n- `showCloseButton` Used to show the close button in modal.\n- `clickOutsideToClose` {boolean} If `true`, the modal can be closed by clicking outside. Default is `false`.\n- `height` {string} If set the modal contents area will have a set height. This can also be fluid, for example `60vh` which is 60% of the viewport. Keep in mind this is the content area, not the entire modal. You may also want to set `fullsize` to `none` to avoid conflicts.\n- `width` {string} If set the modal contents area will have a set width. This can also be fluid, for example `60vw` which is 60% of the viewport. Keep in mind this is the content area, not the entire modal. You may also want to set `fullsize` to `none` to avoid conflicts.\n\n## Themeable Parts\n\n- `modal` allows you to further style or adjust the outer popup element\n- `overlay` allows you to adjust the overlay style\n\n## Features (With Code Examples)\n\nTo generate a standalone modal component, add an `ids-modal` tag to the page with some content in its default slot.\n\n```html\n<ids-modal id=\"my-modal\">\n    <p>This is a simple Modal component</p>\n</ids-modal>\n```\n\nThis modal can be controlled with Javascript:\n\n```js\nconst modal = document.querySelector('#my-modal');\nmodal.show();\n// ...Modal is displayed\n\nmodal.hide();\n// ...Modal is hidden\n```\n\n### Using a target\n\nOther elements on the page, such as an [ids-button](../ids-button/README.md) can be used as a triggering element. In this case, a click event is bound to the defined trigger element that will activate the modal.\n\n```html\n<ids-modal id=\"my-modal\">\n    <p>This is a simple Modal component</p>\n</ids-modal>\n\n<ids-button id=\"trigger-button\" appearance=\"secondary\">\n    <span>Trigger Modal</span>\n    <ids-icon icon=\"launch\"></ids-icon>\n</ids-button>\n```\n\n```js\nconst modal = document.querySelector('#my-modal');\nconst btn = document.querySelector('#trigger-button');\nmodal.target = btn;\n\nbtn.click();\n// ...Modal is triggered by its target element\n```\n\n### Using the Modal Service\n\nA service is provided that allows you to show and hide a modal  programmatically. The API works as follows:\n\n```js\nimport IdsModalService from '../ids-modal-service';\n\nIdsModalService.show({\n  id: 'ids-modal-1',\n  title: 'Active IDS Modal',\n  contents: `<ids-text>This is an active IDS Modal component</ids-text>`,\n  buttons: [\n    {\n      id: 'btn-acknowledge',\n      text: 'Confirm',\n      click: async (e: Event, modal: IdsModal) => {\n        console.info('Acknowledge clicked', e, modal);\n        await modal.hide();\n      },\n      isCancel: true\n    },\n    {\n      id: 'btn-cancel',\n      text: 'Cancel',\n      click: async (e: Event, modal: IdsModal) => {\n        console.info('Cancel clicked', e, modal);\n      },\n      isDefault: true\n    }\n  ],\n  clickOutsideToClose: false,\n  fullsize: '840px',\n  scrollable: false,\n  showCloseButton: false\n});\n\nIdsModalService.hide('ids-modal-1');\nIdsModalService.buttons('ids-modal-1')[1].disabled = true\n```\n\n## Settings and Attributes\n\n- `status` {string | IdsMessageAlertType} Sets the status of the modal. Can be one of: 'none' | 'default' | 'error' | 'alert' | 'success' | 'info' | 'warning'\n- `message` {string} text shown inside the message dialog (can be markup as well)\n- `opacity` {string | number} sets the opacity of the overlay\n- `id` {string} when used as a service this can be used to identify the message\n- `title` {string} when used as a service this can be used to set the message title\n- `buttons` {Array<IdsModalButton>} when used as a service this can be used to set the message buttons\n\n### Adding a Message Title and Buttons\n\nAdd the title and modal actions by using the Modal's slots:\n\n- The \"title\" slot, which can be populated by an [ids-text](../ids-text/README.md) or another text element, is at the top of the Modal.\n- The \"buttons\" slot, which can be filled with one or multiple ids-modal-buttons, is at the bottom of the Modal.\n\n```html\n<ids-modal id=\"my-modal\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">This is the Title</ids-text>\n    <p>This is a simple Modal component</p>\n    <ids-modal-button slot=\"buttons\" id=\"ok\" appearance=\"primary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" id=\"cancel\" appearance=\"secondary\" cancel>Cancel</ids-modal-button>\n</ids-modal>\n```\n\nIt is also possible to include an icon in the modal title by adding it to the title slot.\n\n```html\n<ids-modal id=\"my-modal\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">\n      <ids-icon icon=\"check\" color=\"info\"></ids-icon>\n      This is the Title\n    </ids-text>\n    ...\n</ids-modal>\n```\n\nIf you have a longer tooltip you can set some additional ids-text attributes to add a tooltip if the text overflows the title area.\n\n```html\n  <ids-modal id=\"my-modal\" aria-labelledby=\"my-modal-title\">\n    <ids-text slot=\"title\" max-width=\"400px\" overflow=\"ellipsis\" tooltip=\"true\" font-size=\"24\" type=\"h2\" id=\"my-modal-title\">\n      Active IDS Modal with a long title that will be truncated\n    </ids-text>\n    <ids-modal-button slot=\"buttons\" id=\"modal-close-btn\" appearance=\"primary\">\n      <span>Confirm</span>\n    </ids-modal-button>\n    <ids-text align=\"left\">This is an active IDS Modal component with a truncated title</ids-text>\n  </ids-modal>\n```\n\n### Displaying in full size mode\n\nIdsModal can alter its display mode to take up 100% of the browser viewport's width/height by using the `fullsize` attribute:\n\n```html\n<ids-modal id=\"my-modal\" fullsize=\"lg\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">Fullsize Modal</ids-text>\n    <p>This modal will transform when below the `lg` breakpoint</p>\n    <ids-modal-button slot=\"buttons\" id=\"ok\" appearance=\"primary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" id=\"cancel\" appearance=\"secondary\" cancel>Cancel</ids-modal-button>\n</ids-modal>\n```\n\nThe full size attribute can be defined with an IDS Breakpoint, as defined in the [IdsBreakpointMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-breakpoint-mixin/README.md).  Alternatively, this setting can be changed to `null` or `''` resulting in no fullscreen mode, or `'always'` which forces the fullscreen mode to be displayed indefinitely.\n\nBy default, the full size setting on all modals is set to Small (`sm`) and will break when the viewport width is below 600px.\n\n### Handling scrolled content\n\nScrolled content on IdsModal can be configured using the `scrollable` setting.  By default, scrolling is disabled on the internal `ids-modal-content` element, which wraps the slot containing all nested content outside the header and footer areas.  In situations where scrolling is not handled by one of the slotted elements, using `scrollable=\"true\"` will enable the scrolling internally.\n\nIf a scrollable element such as [IdsSplitter](../ids-splitter/README.md) has been slotted, a best practice is to defer to that element for scrolling behavior on its own child elements.  In this case, `scrollable` should be set to false.\n\n### ids-modal-button\n\nThe Modal Button is an extension of the [ids-button](../ids-button/README.md), displaying in a larger style that fits within Modal. Used to create buttons for use within Modal-type components.\n\n#### States/Attributes\n\n`cancel` a special flag that can be applied to Modal Buttons to more easily identify them as being associated with a \"cancelling\" action.\n\n#### Code Example\n\nModal Buttons extend regular buttons and are constructed with similar markup.\n\n```html\n<ids-modal-button id=\"button-ok\" appearance=\"primary\">\n    <ids-text>OK</ids-text>\n</ids-modal-button>\n<ids-modal-button id=\"button-ok\" appearance=\"secondary\" cancel>\n    <ids-text>Cancel</ids-text>\n</ids-modal-button>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Modal was added in v4.0.0\n- Replace `.inforDialog()` with `.modal()`\n\n**4.x to 5.x**\n\n- Modal is now a custom element `<ids-modal></ids-modal>`\n- Modal content is now user-defined by slot\n- Triggering element for the modal is now configurable with the `target` prop\n- Events are now just plain JS events\n"}},{"name":"ids-modal-service","attributes":[],"description":{"kind":"markdown","value":"# ids-modal\n\n## Description\n\nThe modal is a dialog, built on top of the [ids-popup](../ids-popup/README.md), that displays information over page content. See more [usage details](https://design.infor.com/components/components/modal).\n\n## Terminology\n\n**Overlay** The transparent background that exists between the Modal and the page content. The opacity is adjustable.\n**Target** Refers to the element that will \"trigger\" the Modal by click.  This element is optional, as Modals can exist and be triggered by other operations.\n\n## Settings (Attributes)\n\n- `fullsize` Defines what breakpoint (if any) should cause the modal to transform into full size mode, which takes up 100% width/height of the browser viewport. Can also be set to `''` (no change) or `always` (always at 100%).\n- `focus-target` {boolean} Enable the behavior of focusing the target element of the modal after it closes. The default is `true`.\n- `visible` Shows or hides the Modal.\n- `buttons` (readonly) contains a list of references to any Modal Buttons present.\n- `messageTitle` The text present at the very top of the modal to indicate its purpose.\n- `scrollable` If `true`, allows the \"modal-content\" element inside the modal to scroll its contents.\n- `showCloseButton` Used to show the close button in modal.\n- `clickOutsideToClose` {boolean} If `true`, the modal can be closed by clicking outside. Default is `false`.\n- `height` {string} If set the modal contents area will have a set height. This can also be fluid, for example `60vh` which is 60% of the viewport. Keep in mind this is the content area, not the entire modal. You may also want to set `fullsize` to `none` to avoid conflicts.\n- `width` {string} If set the modal contents area will have a set width. This can also be fluid, for example `60vw` which is 60% of the viewport. Keep in mind this is the content area, not the entire modal. You may also want to set `fullsize` to `none` to avoid conflicts.\n\n## Themeable Parts\n\n- `modal` allows you to further style or adjust the outer popup element\n- `overlay` allows you to adjust the overlay style\n\n## Features (With Code Examples)\n\nTo generate a standalone modal component, add an `ids-modal` tag to the page with some content in its default slot.\n\n```html\n<ids-modal id=\"my-modal\">\n    <p>This is a simple Modal component</p>\n</ids-modal>\n```\n\nThis modal can be controlled with Javascript:\n\n```js\nconst modal = document.querySelector('#my-modal');\nmodal.show();\n// ...Modal is displayed\n\nmodal.hide();\n// ...Modal is hidden\n```\n\n### Using a target\n\nOther elements on the page, such as an [ids-button](../ids-button/README.md) can be used as a triggering element. In this case, a click event is bound to the defined trigger element that will activate the modal.\n\n```html\n<ids-modal id=\"my-modal\">\n    <p>This is a simple Modal component</p>\n</ids-modal>\n\n<ids-button id=\"trigger-button\" appearance=\"secondary\">\n    <span>Trigger Modal</span>\n    <ids-icon icon=\"launch\"></ids-icon>\n</ids-button>\n```\n\n```js\nconst modal = document.querySelector('#my-modal');\nconst btn = document.querySelector('#trigger-button');\nmodal.target = btn;\n\nbtn.click();\n// ...Modal is triggered by its target element\n```\n\n### Using the Modal Service\n\nA service is provided that allows you to show and hide a modal  programmatically. The API works as follows:\n\n```js\nimport IdsModalService from '../ids-modal-service';\n\nIdsModalService.show({\n  id: 'ids-modal-1',\n  title: 'Active IDS Modal',\n  contents: `<ids-text>This is an active IDS Modal component</ids-text>`,\n  buttons: [\n    {\n      id: 'btn-acknowledge',\n      text: 'Confirm',\n      click: async (e: Event, modal: IdsModal) => {\n        console.info('Acknowledge clicked', e, modal);\n        await modal.hide();\n      },\n      isCancel: true\n    },\n    {\n      id: 'btn-cancel',\n      text: 'Cancel',\n      click: async (e: Event, modal: IdsModal) => {\n        console.info('Cancel clicked', e, modal);\n      },\n      isDefault: true\n    }\n  ],\n  clickOutsideToClose: false,\n  fullsize: '840px',\n  scrollable: false,\n  showCloseButton: false\n});\n\nIdsModalService.hide('ids-modal-1');\nIdsModalService.buttons('ids-modal-1')[1].disabled = true\n```\n\n## Settings and Attributes\n\n- `status` {string | IdsMessageAlertType} Sets the status of the modal. Can be one of: 'none' | 'default' | 'error' | 'alert' | 'success' | 'info' | 'warning'\n- `message` {string} text shown inside the message dialog (can be markup as well)\n- `opacity` {string | number} sets the opacity of the overlay\n- `id` {string} when used as a service this can be used to identify the message\n- `title` {string} when used as a service this can be used to set the message title\n- `buttons` {Array<IdsModalButton>} when used as a service this can be used to set the message buttons\n\n### Adding a Message Title and Buttons\n\nAdd the title and modal actions by using the Modal's slots:\n\n- The \"title\" slot, which can be populated by an [ids-text](../ids-text/README.md) or another text element, is at the top of the Modal.\n- The \"buttons\" slot, which can be filled with one or multiple ids-modal-buttons, is at the bottom of the Modal.\n\n```html\n<ids-modal id=\"my-modal\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">This is the Title</ids-text>\n    <p>This is a simple Modal component</p>\n    <ids-modal-button slot=\"buttons\" id=\"ok\" appearance=\"primary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" id=\"cancel\" appearance=\"secondary\" cancel>Cancel</ids-modal-button>\n</ids-modal>\n```\n\nIt is also possible to include an icon in the modal title by adding it to the title slot.\n\n```html\n<ids-modal id=\"my-modal\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">\n      <ids-icon icon=\"check\" color=\"info\"></ids-icon>\n      This is the Title\n    </ids-text>\n    ...\n</ids-modal>\n```\n\nIf you have a longer tooltip you can set some additional ids-text attributes to add a tooltip if the text overflows the title area.\n\n```html\n  <ids-modal id=\"my-modal\" aria-labelledby=\"my-modal-title\">\n    <ids-text slot=\"title\" max-width=\"400px\" overflow=\"ellipsis\" tooltip=\"true\" font-size=\"24\" type=\"h2\" id=\"my-modal-title\">\n      Active IDS Modal with a long title that will be truncated\n    </ids-text>\n    <ids-modal-button slot=\"buttons\" id=\"modal-close-btn\" appearance=\"primary\">\n      <span>Confirm</span>\n    </ids-modal-button>\n    <ids-text align=\"left\">This is an active IDS Modal component with a truncated title</ids-text>\n  </ids-modal>\n```\n\n### Displaying in full size mode\n\nIdsModal can alter its display mode to take up 100% of the browser viewport's width/height by using the `fullsize` attribute:\n\n```html\n<ids-modal id=\"my-modal\" fullsize=\"lg\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">Fullsize Modal</ids-text>\n    <p>This modal will transform when below the `lg` breakpoint</p>\n    <ids-modal-button slot=\"buttons\" id=\"ok\" appearance=\"primary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" id=\"cancel\" appearance=\"secondary\" cancel>Cancel</ids-modal-button>\n</ids-modal>\n```\n\nThe full size attribute can be defined with an IDS Breakpoint, as defined in the [IdsBreakpointMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-breakpoint-mixin/README.md).  Alternatively, this setting can be changed to `null` or `''` resulting in no fullscreen mode, or `'always'` which forces the fullscreen mode to be displayed indefinitely.\n\nBy default, the full size setting on all modals is set to Small (`sm`) and will break when the viewport width is below 600px.\n\n### Handling scrolled content\n\nScrolled content on IdsModal can be configured using the `scrollable` setting.  By default, scrolling is disabled on the internal `ids-modal-content` element, which wraps the slot containing all nested content outside the header and footer areas.  In situations where scrolling is not handled by one of the slotted elements, using `scrollable=\"true\"` will enable the scrolling internally.\n\nIf a scrollable element such as [IdsSplitter](../ids-splitter/README.md) has been slotted, a best practice is to defer to that element for scrolling behavior on its own child elements.  In this case, `scrollable` should be set to false.\n\n### ids-modal-button\n\nThe Modal Button is an extension of the [ids-button](../ids-button/README.md), displaying in a larger style that fits within Modal. Used to create buttons for use within Modal-type components.\n\n#### States/Attributes\n\n`cancel` a special flag that can be applied to Modal Buttons to more easily identify them as being associated with a \"cancelling\" action.\n\n#### Code Example\n\nModal Buttons extend regular buttons and are constructed with similar markup.\n\n```html\n<ids-modal-button id=\"button-ok\" appearance=\"primary\">\n    <ids-text>OK</ids-text>\n</ids-modal-button>\n<ids-modal-button id=\"button-ok\" appearance=\"secondary\" cancel>\n    <ids-text>Cancel</ids-text>\n</ids-modal-button>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Modal was added in v4.0.0\n- Replace `.inforDialog()` with `.modal()`\n\n**4.x to 5.x**\n\n- Modal is now a custom element `<ids-modal></ids-modal>`\n- Modal content is now user-defined by slot\n- Triggering element for the modal is now configurable with the `target` prop\n- Events are now just plain JS events\n"}},{"name":"ids-modal","attributes":[{"name":"z-count","values":[]},{"name":"should-update","values":[]},{"name":"on-button-click","values":[]},{"name":"ro","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"#visible","values":[]},{"name":"global-keydown-listener","values":[]},{"name":"auto-focus","description":"Get whether to focus the first input element instead of the close button","values":[]},{"name":"focus-target","description":"Get whether to focus the target element for modal","values":[]},{"name":"aria-label-content","description":"Get the content for ARIA labels","values":[]},{"name":"buttons","description":"Get the currently slotted buttons","values":[]},{"name":"button-set","description":"Get the current button group","values":[]},{"name":"title-slot","description":"Get the slotted title element or the default title slot","values":[]},{"name":"modal-content-el","description":"Get the Modal's content wrapper element","values":[]},{"name":"fullsize","description":"Get the breakpoint at which the Modal will change from normal mode to fullsize mode","values":[]},{"name":"show-close-button","description":"Get whether the close button is shown","values":[]},{"name":"suppress-enter-key","description":"Get whether the Enter key is suppressed from dismissing the modal","values":[]},{"name":"close-button","description":"Get the close button element","values":[]},{"name":"overlay","description":"Sets the overlay element for the modal","values":[]},{"name":"message-title","description":"Sets the content of the message's title","values":[]},{"name":"scrollable","description":"Get the modal scrollable setting","values":[]},{"name":"visible","description":"Sets whether the Modal is visible","values":[]},{"name":"is-service-message","values":[]},{"name":"click-outside-to-close","description":"Set whether or not to allow the modal to close by clicking outside","values":[]},{"name":"height","description":"Get the modal height","values":[]},{"name":"width","description":"Get the modal width","values":[]},{"name":"overflow","description":"Get the overflow behavior for the modal content","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-modal\n\n## Description\n\nThe modal is a dialog, built on top of the [ids-popup](../ids-popup/README.md), that displays information over page content. See more [usage details](https://design.infor.com/components/components/modal).\n\n## Terminology\n\n**Overlay** The transparent background that exists between the Modal and the page content. The opacity is adjustable.\n**Target** Refers to the element that will \"trigger\" the Modal by click.  This element is optional, as Modals can exist and be triggered by other operations.\n\n## Settings (Attributes)\n\n- `fullsize` Defines what breakpoint (if any) should cause the modal to transform into full size mode, which takes up 100% width/height of the browser viewport. Can also be set to `''` (no change) or `always` (always at 100%).\n- `focus-target` {boolean} Enable the behavior of focusing the target element of the modal after it closes. The default is `true`.\n- `visible` Shows or hides the Modal.\n- `buttons` (readonly) contains a list of references to any Modal Buttons present.\n- `messageTitle` The text present at the very top of the modal to indicate its purpose.\n- `scrollable` If `true`, allows the \"modal-content\" element inside the modal to scroll its contents.\n- `showCloseButton` Used to show the close button in modal.\n- `clickOutsideToClose` {boolean} If `true`, the modal can be closed by clicking outside. Default is `false`.\n- `height` {string} If set the modal contents area will have a set height. This can also be fluid, for example `60vh` which is 60% of the viewport. Keep in mind this is the content area, not the entire modal. You may also want to set `fullsize` to `none` to avoid conflicts.\n- `width` {string} If set the modal contents area will have a set width. This can also be fluid, for example `60vw` which is 60% of the viewport. Keep in mind this is the content area, not the entire modal. You may also want to set `fullsize` to `none` to avoid conflicts.\n\n## Themeable Parts\n\n- `modal` allows you to further style or adjust the outer popup element\n- `overlay` allows you to adjust the overlay style\n\n## Features (With Code Examples)\n\nTo generate a standalone modal component, add an `ids-modal` tag to the page with some content in its default slot.\n\n```html\n<ids-modal id=\"my-modal\">\n    <p>This is a simple Modal component</p>\n</ids-modal>\n```\n\nThis modal can be controlled with Javascript:\n\n```js\nconst modal = document.querySelector('#my-modal');\nmodal.show();\n// ...Modal is displayed\n\nmodal.hide();\n// ...Modal is hidden\n```\n\n### Using a target\n\nOther elements on the page, such as an [ids-button](../ids-button/README.md) can be used as a triggering element. In this case, a click event is bound to the defined trigger element that will activate the modal.\n\n```html\n<ids-modal id=\"my-modal\">\n    <p>This is a simple Modal component</p>\n</ids-modal>\n\n<ids-button id=\"trigger-button\" appearance=\"secondary\">\n    <span>Trigger Modal</span>\n    <ids-icon icon=\"launch\"></ids-icon>\n</ids-button>\n```\n\n```js\nconst modal = document.querySelector('#my-modal');\nconst btn = document.querySelector('#trigger-button');\nmodal.target = btn;\n\nbtn.click();\n// ...Modal is triggered by its target element\n```\n\n### Using the Modal Service\n\nA service is provided that allows you to show and hide a modal  programmatically. The API works as follows:\n\n```js\nimport IdsModalService from '../ids-modal-service';\n\nIdsModalService.show({\n  id: 'ids-modal-1',\n  title: 'Active IDS Modal',\n  contents: `<ids-text>This is an active IDS Modal component</ids-text>`,\n  buttons: [\n    {\n      id: 'btn-acknowledge',\n      text: 'Confirm',\n      click: async (e: Event, modal: IdsModal) => {\n        console.info('Acknowledge clicked', e, modal);\n        await modal.hide();\n      },\n      isCancel: true\n    },\n    {\n      id: 'btn-cancel',\n      text: 'Cancel',\n      click: async (e: Event, modal: IdsModal) => {\n        console.info('Cancel clicked', e, modal);\n      },\n      isDefault: true\n    }\n  ],\n  clickOutsideToClose: false,\n  fullsize: '840px',\n  scrollable: false,\n  showCloseButton: false\n});\n\nIdsModalService.hide('ids-modal-1');\nIdsModalService.buttons('ids-modal-1')[1].disabled = true\n```\n\n## Settings and Attributes\n\n- `status` {string | IdsMessageAlertType} Sets the status of the modal. Can be one of: 'none' | 'default' | 'error' | 'alert' | 'success' | 'info' | 'warning'\n- `message` {string} text shown inside the message dialog (can be markup as well)\n- `opacity` {string | number} sets the opacity of the overlay\n- `id` {string} when used as a service this can be used to identify the message\n- `title` {string} when used as a service this can be used to set the message title\n- `buttons` {Array<IdsModalButton>} when used as a service this can be used to set the message buttons\n\n### Adding a Message Title and Buttons\n\nAdd the title and modal actions by using the Modal's slots:\n\n- The \"title\" slot, which can be populated by an [ids-text](../ids-text/README.md) or another text element, is at the top of the Modal.\n- The \"buttons\" slot, which can be filled with one or multiple ids-modal-buttons, is at the bottom of the Modal.\n\n```html\n<ids-modal id=\"my-modal\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">This is the Title</ids-text>\n    <p>This is a simple Modal component</p>\n    <ids-modal-button slot=\"buttons\" id=\"ok\" appearance=\"primary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" id=\"cancel\" appearance=\"secondary\" cancel>Cancel</ids-modal-button>\n</ids-modal>\n```\n\nIt is also possible to include an icon in the modal title by adding it to the title slot.\n\n```html\n<ids-modal id=\"my-modal\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">\n      <ids-icon icon=\"check\" color=\"info\"></ids-icon>\n      This is the Title\n    </ids-text>\n    ...\n</ids-modal>\n```\n\nIf you have a longer tooltip you can set some additional ids-text attributes to add a tooltip if the text overflows the title area.\n\n```html\n  <ids-modal id=\"my-modal\" aria-labelledby=\"my-modal-title\">\n    <ids-text slot=\"title\" max-width=\"400px\" overflow=\"ellipsis\" tooltip=\"true\" font-size=\"24\" type=\"h2\" id=\"my-modal-title\">\n      Active IDS Modal with a long title that will be truncated\n    </ids-text>\n    <ids-modal-button slot=\"buttons\" id=\"modal-close-btn\" appearance=\"primary\">\n      <span>Confirm</span>\n    </ids-modal-button>\n    <ids-text align=\"left\">This is an active IDS Modal component with a truncated title</ids-text>\n  </ids-modal>\n```\n\n### Displaying in full size mode\n\nIdsModal can alter its display mode to take up 100% of the browser viewport's width/height by using the `fullsize` attribute:\n\n```html\n<ids-modal id=\"my-modal\" fullsize=\"lg\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">Fullsize Modal</ids-text>\n    <p>This modal will transform when below the `lg` breakpoint</p>\n    <ids-modal-button slot=\"buttons\" id=\"ok\" appearance=\"primary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" id=\"cancel\" appearance=\"secondary\" cancel>Cancel</ids-modal-button>\n</ids-modal>\n```\n\nThe full size attribute can be defined with an IDS Breakpoint, as defined in the [IdsBreakpointMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-breakpoint-mixin/README.md).  Alternatively, this setting can be changed to `null` or `''` resulting in no fullscreen mode, or `'always'` which forces the fullscreen mode to be displayed indefinitely.\n\nBy default, the full size setting on all modals is set to Small (`sm`) and will break when the viewport width is below 600px.\n\n### Handling scrolled content\n\nScrolled content on IdsModal can be configured using the `scrollable` setting.  By default, scrolling is disabled on the internal `ids-modal-content` element, which wraps the slot containing all nested content outside the header and footer areas.  In situations where scrolling is not handled by one of the slotted elements, using `scrollable=\"true\"` will enable the scrolling internally.\n\nIf a scrollable element such as [IdsSplitter](../ids-splitter/README.md) has been slotted, a best practice is to defer to that element for scrolling behavior on its own child elements.  In this case, `scrollable` should be set to false.\n\n### ids-modal-button\n\nThe Modal Button is an extension of the [ids-button](../ids-button/README.md), displaying in a larger style that fits within Modal. Used to create buttons for use within Modal-type components.\n\n#### States/Attributes\n\n`cancel` a special flag that can be applied to Modal Buttons to more easily identify them as being associated with a \"cancelling\" action.\n\n#### Code Example\n\nModal Buttons extend regular buttons and are constructed with similar markup.\n\n```html\n<ids-modal-button id=\"button-ok\" appearance=\"primary\">\n    <ids-text>OK</ids-text>\n</ids-modal-button>\n<ids-modal-button id=\"button-ok\" appearance=\"secondary\" cancel>\n    <ids-text>Cancel</ids-text>\n</ids-modal-button>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Modal was added in v4.0.0\n- Replace `.inforDialog()` with `.modal()`\n\n**4.x to 5.x**\n\n- Modal is now a custom element `<ids-modal></ids-modal>`\n- Modal content is now user-defined by slot\n- Triggering element for the modal is now configurable with the `target` prop\n- Events are now just plain JS events\n"}},{"name":"ids-overlay","attributes":[{"name":"visible","description":"Sets overlay visible state","values":[]},{"name":"background-color","description":"Sets background color","values":[]},{"name":"z-index","description":"Sets overlay z index value","values":[]},{"name":"opacity","description":"Sets overlay opacity","values":[]}],"description":{"kind":"markdown","value":"# ids-modal\n\n## Description\n\nThe modal is a dialog, built on top of the [ids-popup](../ids-popup/README.md), that displays information over page content. See more [usage details](https://design.infor.com/components/components/modal).\n\n## Terminology\n\n**Overlay** The transparent background that exists between the Modal and the page content. The opacity is adjustable.\n**Target** Refers to the element that will \"trigger\" the Modal by click.  This element is optional, as Modals can exist and be triggered by other operations.\n\n## Settings (Attributes)\n\n- `fullsize` Defines what breakpoint (if any) should cause the modal to transform into full size mode, which takes up 100% width/height of the browser viewport. Can also be set to `''` (no change) or `always` (always at 100%).\n- `focus-target` {boolean} Enable the behavior of focusing the target element of the modal after it closes. The default is `true`.\n- `visible` Shows or hides the Modal.\n- `buttons` (readonly) contains a list of references to any Modal Buttons present.\n- `messageTitle` The text present at the very top of the modal to indicate its purpose.\n- `scrollable` If `true`, allows the \"modal-content\" element inside the modal to scroll its contents.\n- `showCloseButton` Used to show the close button in modal.\n- `clickOutsideToClose` {boolean} If `true`, the modal can be closed by clicking outside. Default is `false`.\n- `height` {string} If set the modal contents area will have a set height. This can also be fluid, for example `60vh` which is 60% of the viewport. Keep in mind this is the content area, not the entire modal. You may also want to set `fullsize` to `none` to avoid conflicts.\n- `width` {string} If set the modal contents area will have a set width. This can also be fluid, for example `60vw` which is 60% of the viewport. Keep in mind this is the content area, not the entire modal. You may also want to set `fullsize` to `none` to avoid conflicts.\n\n## Themeable Parts\n\n- `modal` allows you to further style or adjust the outer popup element\n- `overlay` allows you to adjust the overlay style\n\n## Features (With Code Examples)\n\nTo generate a standalone modal component, add an `ids-modal` tag to the page with some content in its default slot.\n\n```html\n<ids-modal id=\"my-modal\">\n    <p>This is a simple Modal component</p>\n</ids-modal>\n```\n\nThis modal can be controlled with Javascript:\n\n```js\nconst modal = document.querySelector('#my-modal');\nmodal.show();\n// ...Modal is displayed\n\nmodal.hide();\n// ...Modal is hidden\n```\n\n### Using a target\n\nOther elements on the page, such as an [ids-button](../ids-button/README.md) can be used as a triggering element. In this case, a click event is bound to the defined trigger element that will activate the modal.\n\n```html\n<ids-modal id=\"my-modal\">\n    <p>This is a simple Modal component</p>\n</ids-modal>\n\n<ids-button id=\"trigger-button\" appearance=\"secondary\">\n    <span>Trigger Modal</span>\n    <ids-icon icon=\"launch\"></ids-icon>\n</ids-button>\n```\n\n```js\nconst modal = document.querySelector('#my-modal');\nconst btn = document.querySelector('#trigger-button');\nmodal.target = btn;\n\nbtn.click();\n// ...Modal is triggered by its target element\n```\n\n### Using the Modal Service\n\nA service is provided that allows you to show and hide a modal  programmatically. The API works as follows:\n\n```js\nimport IdsModalService from '../ids-modal-service';\n\nIdsModalService.show({\n  id: 'ids-modal-1',\n  title: 'Active IDS Modal',\n  contents: `<ids-text>This is an active IDS Modal component</ids-text>`,\n  buttons: [\n    {\n      id: 'btn-acknowledge',\n      text: 'Confirm',\n      click: async (e: Event, modal: IdsModal) => {\n        console.info('Acknowledge clicked', e, modal);\n        await modal.hide();\n      },\n      isCancel: true\n    },\n    {\n      id: 'btn-cancel',\n      text: 'Cancel',\n      click: async (e: Event, modal: IdsModal) => {\n        console.info('Cancel clicked', e, modal);\n      },\n      isDefault: true\n    }\n  ],\n  clickOutsideToClose: false,\n  fullsize: '840px',\n  scrollable: false,\n  showCloseButton: false\n});\n\nIdsModalService.hide('ids-modal-1');\nIdsModalService.buttons('ids-modal-1')[1].disabled = true\n```\n\n## Settings and Attributes\n\n- `status` {string | IdsMessageAlertType} Sets the status of the modal. Can be one of: 'none' | 'default' | 'error' | 'alert' | 'success' | 'info' | 'warning'\n- `message` {string} text shown inside the message dialog (can be markup as well)\n- `opacity` {string | number} sets the opacity of the overlay\n- `id` {string} when used as a service this can be used to identify the message\n- `title` {string} when used as a service this can be used to set the message title\n- `buttons` {Array<IdsModalButton>} when used as a service this can be used to set the message buttons\n\n### Adding a Message Title and Buttons\n\nAdd the title and modal actions by using the Modal's slots:\n\n- The \"title\" slot, which can be populated by an [ids-text](../ids-text/README.md) or another text element, is at the top of the Modal.\n- The \"buttons\" slot, which can be filled with one or multiple ids-modal-buttons, is at the bottom of the Modal.\n\n```html\n<ids-modal id=\"my-modal\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">This is the Title</ids-text>\n    <p>This is a simple Modal component</p>\n    <ids-modal-button slot=\"buttons\" id=\"ok\" appearance=\"primary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" id=\"cancel\" appearance=\"secondary\" cancel>Cancel</ids-modal-button>\n</ids-modal>\n```\n\nIt is also possible to include an icon in the modal title by adding it to the title slot.\n\n```html\n<ids-modal id=\"my-modal\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">\n      <ids-icon icon=\"check\" color=\"info\"></ids-icon>\n      This is the Title\n    </ids-text>\n    ...\n</ids-modal>\n```\n\nIf you have a longer tooltip you can set some additional ids-text attributes to add a tooltip if the text overflows the title area.\n\n```html\n  <ids-modal id=\"my-modal\" aria-labelledby=\"my-modal-title\">\n    <ids-text slot=\"title\" max-width=\"400px\" overflow=\"ellipsis\" tooltip=\"true\" font-size=\"24\" type=\"h2\" id=\"my-modal-title\">\n      Active IDS Modal with a long title that will be truncated\n    </ids-text>\n    <ids-modal-button slot=\"buttons\" id=\"modal-close-btn\" appearance=\"primary\">\n      <span>Confirm</span>\n    </ids-modal-button>\n    <ids-text align=\"left\">This is an active IDS Modal component with a truncated title</ids-text>\n  </ids-modal>\n```\n\n### Displaying in full size mode\n\nIdsModal can alter its display mode to take up 100% of the browser viewport's width/height by using the `fullsize` attribute:\n\n```html\n<ids-modal id=\"my-modal\" fullsize=\"lg\">\n    <ids-text slot=\"title\" font-size=\"24\" type=\"h2\">Fullsize Modal</ids-text>\n    <p>This modal will transform when below the `lg` breakpoint</p>\n    <ids-modal-button slot=\"buttons\" id=\"ok\" appearance=\"primary\">OK</ids-modal-button>\n    <ids-modal-button slot=\"buttons\" id=\"cancel\" appearance=\"secondary\" cancel>Cancel</ids-modal-button>\n</ids-modal>\n```\n\nThe full size attribute can be defined with an IDS Breakpoint, as defined in the [IdsBreakpointMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-breakpoint-mixin/README.md).  Alternatively, this setting can be changed to `null` or `''` resulting in no fullscreen mode, or `'always'` which forces the fullscreen mode to be displayed indefinitely.\n\nBy default, the full size setting on all modals is set to Small (`sm`) and will break when the viewport width is below 600px.\n\n### Handling scrolled content\n\nScrolled content on IdsModal can be configured using the `scrollable` setting.  By default, scrolling is disabled on the internal `ids-modal-content` element, which wraps the slot containing all nested content outside the header and footer areas.  In situations where scrolling is not handled by one of the slotted elements, using `scrollable=\"true\"` will enable the scrolling internally.\n\nIf a scrollable element such as [IdsSplitter](../ids-splitter/README.md) has been slotted, a best practice is to defer to that element for scrolling behavior on its own child elements.  In this case, `scrollable` should be set to false.\n\n### ids-modal-button\n\nThe Modal Button is an extension of the [ids-button](../ids-button/README.md), displaying in a larger style that fits within Modal. Used to create buttons for use within Modal-type components.\n\n#### States/Attributes\n\n`cancel` a special flag that can be applied to Modal Buttons to more easily identify them as being associated with a \"cancelling\" action.\n\n#### Code Example\n\nModal Buttons extend regular buttons and are constructed with similar markup.\n\n```html\n<ids-modal-button id=\"button-ok\" appearance=\"primary\">\n    <ids-text>OK</ids-text>\n</ids-modal-button>\n<ids-modal-button id=\"button-ok\" appearance=\"secondary\" cancel>\n    <ids-text>Cancel</ids-text>\n</ids-modal-button>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Modal was added in v4.0.0\n- Replace `.inforDialog()` with `.modal()`\n\n**4.x to 5.x**\n\n- Modal is now a custom element `<ids-modal></ids-modal>`\n- Modal content is now user-defined by slot\n- Triggering element for the modal is now configurable with the `target` prop\n- Events are now just plain JS events\n"}},{"name":"ids-module-nav-bar","attributes":[{"name":"accordion-pane-setting","values":[]},{"name":"global-keydown-listener","values":[]},{"name":"ro","values":[]},{"name":"#mo","values":[]},{"name":"#selected-item","values":[]},{"name":"parent","values":[]},{"name":"content","values":[]},{"name":"main-el","values":[]},{"name":"accordion","values":[]},{"name":"items","values":[]},{"name":"search-field-el","values":[]},{"name":"settings-el","values":[]},{"name":"switcher-el","values":[]},{"name":"user-el","values":[]},{"name":"tooltip-el","values":[]},{"name":"is-filtered","values":[]},{"name":"filterable","values":[]},{"name":"pinned","values":[]},{"name":"persist-expanded","values":[]},{"name":"#search-icon","values":[]},{"name":"module-nav-element","values":[]},{"name":"filter-accordion","description":"Performs a filter operation on accordion panels","values":[]},{"name":"empty-icon-container-el","values":[]},{"name":"on-language-change","values":[]},{"name":"on-outside-click","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav-button","attributes":[{"name":"proto-classes","values":[]},{"name":"text-node","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav-common","description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav-content","attributes":[{"name":"parent","values":[]},{"name":"offset-content","description":"Set the offset content","values":[]},{"name":"overlay","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav-display-mode-mixin","attributes":[{"name":"previous-display-mode","values":[]},{"name":"#is-setting-display-mode","description":"Set the type for toolbar","values":[]},{"name":"display-mode","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav-item","attributes":[{"name":"#has-been-selected","values":[]},{"name":"color-variants","values":[]},{"name":"container-el","values":[]},{"name":"icon","description":"Get the icon name","values":[]},{"name":"selected","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav-settings","attributes":[{"name":"proto-classes","values":[]},{"name":"text-node","values":[]},{"name":"on-language-change","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav-switcher","attributes":[{"name":"module-button-el","values":[]},{"name":"module-button-icon-el","values":[]},{"name":"role-dropdown-el","values":[]},{"name":"role-dropdown-list-el","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav-text-display-mixin","attributes":[{"name":"text-display","description":"Gets textDisplay property","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav-user","attributes":[{"name":"text-nodes","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-module-nav","attributes":[{"name":"bar","description":"Get reference to the Module Nav bar","values":[]},{"name":"content","description":"Get reference to the content pane","values":[]},{"name":"parent","description":"Get reference to the Module Nav parent element","values":[]},{"name":"breakpoint","description":"Get the breakpoint value","values":[]},{"name":"responsive","description":"Get whether responsive behavior is enabled","values":[]}],"description":{"kind":"markdown","value":"# ids-module-nav\n\nThis component displays top-level navigation in a fly out menu, similar to [ids-app-menu](../ids-app-menu/README.md).\n\n## Terminology\n\n- **Module Nav**: The UX element that holds all navigation items.\n- **Module Button** The UX element providing access to the Module's home.\n- **Role Switcher**: The UX element that contains the Module Button, as well as the Dropdown used to display the Module's Roles.\n- **Settings Menu**: The UX element that displays additional settings at the bottom of the Module Nav.\n\n## Settings and Attributes\n\n### IdsModuleNav\n\nThese settings apply to the ids-module-nav container element:\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses the entire Module Nav structure's display type\n- `respond-down` {IdsBreakpointRespondAttribute} Controls the lowest-possible breakpoint at which mobile responsive behavior will be enabled (enabled by using `responsive`)\n- `responsive` {boolean} if true, causes the Module Nav structure to automatically respond to mobile device size using a breakpoint.\n- `breakpoint` {string} Controls at which breakpoint the Module Nav will collapse in responsive mode. Valid values are 'sm' (600px), 'md' (1024px), 'lg' (1280px), 'xl' (1440px), and 'xxl' (1920px). Defaults to 'md'. Only applies when `responsive` is true. For example, setting `breakpoint=\"md\"` will cause the Module Nav to collapse below 1024px viewport width.\n\n### IdsModuleNavBar\n\nThese settings apply to the IdsModuleNavBar element:\n\n- IdsModuleNavBar inherits all settings from [IdsDrawer](../ids-drawer/README.md)\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavBar's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `filterable` {boolean} If true, allows accordion filtering via the searchfield using the built-in behavior (false if you want to implement your own)\n- `persist-expanded` {boolean} If true, accordion will maintain expanded panels when nav bar is toggled back to expanded mode.\n- `pinned` {boolean} If true, pins key areas of the navigation accordion to the top/bottom of the page.\n\n### IdsModuleNavContent\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n- `offset-content` {boolean} If true, doesn't allow an `display-mode: expanded` Module Nav to cover its underlying content pane, instead offsetting the content.  This is controlled automatically if `responsive` is set on the IdsModuleNav element.\n\n### IdsModuleNavSwitcher\n\nIdsModuleNavSwitcher defines the role-switching capability of the Module Nav.  Its intention is to allow a user to switch among an application's top-level modules quickly. IdsModuleNavSwitcher doesn't have any special settings, but allows an [IdsDropdown](../ids-dropdown/README.md) and its related elements to be slotted and skinned appropriately. It also requires an IdsModuleNavButton element.\n\n### IdsModuleNavSettings\n\n- IdsModuleNavSettings inherits all settings from [IdsMenuButton](../ids-menu-button/README.md).\n- IdsModuleNavSettings requires an adjacent [IdsPopupMenu](../ids-popup-menu) configured with the IdsModuleNavSettings element as its target and trigger element.\n\n### IdsModuleNavUser\n\nIdsModuleNavUser creates a composable area that will be fixed to the very bottom of the IdsModuleNavBar, that can be a place for defining the current user and role.  It's contents are simply whatever is slotted in the default content area, but a separate area for the user avatar can be added using `slot=\"avatar\"`.\n\n- `display-mode` {false|'collapsed'|'expanded'} Chooses IdsModuleNavContent's display type.  This setting is controlled automatically when setting the same property on the IdsModuleNav container element.\n\n## Features (With Code Examples)\n\n```html\n<ids-module-nav id=\"module-nav\" responsive>\n    <ids-module-nav-bar>\n        <ids-module-nav-switcher slot=\"role-switcher\">\n          <ids-module-nav-button id=\"module-nav-button\">\n            <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n            <ids-text audible>Admin Console</ids-text>\n          </ids-module-nav-button>\n          <ids-dropdown\n            id=\"module-nav-role-dropdown\"\n            dropdown-icon=\"expand-all\"\n            color-variant=\"module-nav\"\n            label=\"Select Role\"\n            value=\"admin-console\"\n            show-list-item-icon=\"false\">\n            <ids-list-box>\n              <ids-list-box-option value=\"admin-console\" id=\"admin-console\">\n                <ids-icon icon=\"icon-app-ac\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Admin Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"job-console\" id=\"job-console\">\n                <ids-icon icon=\"icon-app-jo\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Job Console</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"landing-page-designer\" id=\"landing-page-designer\">\n                <ids-icon icon=\"icon-app-lmd\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Landing Page Designer</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"process-server-adminisrator\" id=\"process-server-adminisrator\">\n                <ids-icon icon=\"icon-app-psa\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Process Server Administrator</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"proxy-management\" id=\"proxy-management\">\n                <ids-icon icon=\"icon-app-pm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Proxy Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"security-system-management\" id=\"security-system-management\">\n                <ids-icon icon=\"icon-app-ssm\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>Security System Management</span>\n              </ids-list-box-option>\n              <ids-list-box-option value=\"user-management\" id=\"user-management\">\n                <ids-icon icon=\"icon-app-um\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n                <span>User Management</span>\n              </ids-list-box-option>\n            </ids-list-box>\n          </ids-dropdown>\n        </ids-module-nav-switcher>\n\n        <ids-search-field\n          id=\"search\"\n          clearable\n          color-variant=\"module-nav\"\n          label=\"Module Nav Search\"\n          label-state=\"collapsed\"\n          no-margins\n          placeholder=\"Search\"\n          size=\"full\"\n          slot=\"search\"></ids-search-field>\n\n        <!-- Main Content (Accordion Navigation) -->\n        <ids-accordion>\n          <ids-accordion-section slot=\"\" grow>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-user\" slot=\"header\" icon=\"user\">\n                <ids-text font-size=\"16\" overflow=\"ellipsis\">My Configuration and Personalization</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-database\" slot=\"header\" icon=\"database\">\n                <ids-text font-size=\"16\">Database</ids-text>\n              </ids-module-nav-item>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n              <ids-accordion-panel slot=\"content\">\n                <ids-module-nav-item slot=\"header\">\n                  <ids-text font-size=\"14\">Label</ids-text>\n                </ids-module-nav-item>\n              </ids-accordion-panel>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Pinned Footer Section -->\n        <ids-accordion slot=\"footer\">\n          <ids-accordion-section pinned>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-document\" slot=\"header\" icon=\"document\">\n                <ids-text font-size=\"16\">Documents</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-reports\" slot=\"header\" icon=\"report\">\n                <ids-text font-size=\"16\">Reports</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n            <ids-accordion-panel>\n              <ids-module-nav-item id=\"item-notification\" slot=\"header\" icon=\"notification\">\n                <ids-text font-size=\"16\">Notification</ids-text>\n              </ids-module-nav-item>\n            </ids-accordion-panel>\n          </ids-accordion-section>\n        </ids-accordion>\n\n        <!-- Settings element -->\n        <ids-module-nav-settings\n          slot=\"settings\"\n          role=\"button\"\n          icon=\"settings\"\n          id=\"module-nav-settings-btn\"\n          menu=\"module-nav-settings-menu\"\n          color-variant=\"module-nav\"\n          content-align=\"start\"\n          no-margins>\n          <ids-text>Settings</ids-text>\n        </ids-module-nav-settings>\n        <ids-popup-menu\n          id=\"module-nav-settings-menu\"\n          target=\"#module-nav-settings-btn\"\n          trigger-type=\"click\"\n          slot=\"settings\">\n          <ids-menu-group>\n            <ids-menu-item icon=\"observation-precautions\" value=\"jobs\">Jobs</ids-menu-item>\n            <ids-menu-item icon=\"report\" value=\"reports\">Reports</ids-menu-item>\n            <ids-menu-item icon=\"isolation\" value=\"actions\">Actions</ids-menu-item>\n            <ids-menu-item icon=\"edit\" value=\"personalization\">Personalization</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item value=\"create-report\">Create Report</ids-menu-item>\n            <ids-menu-item value=\"proxy\">Proxy</ids-menu-item>\n            <ids-menu-item value=\"set-as-of-date\">Set \"As Of Date\"</ids-menu-item>\n            <ids-menu-item value=\"user-context\">User Context</ids-menu-item>\n            <ids-separator></ids-separator>\n            <ids-menu-item icon=\"settings\" value=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item icon=\"info\" value=\"about\">About</ids-menu-item>\n            <ids-menu-item icon=\"help\" value=\"help\">Help</ids-menu-item>\n          </ids-menu-group>\n        </ids-popup-menu>\n\n        <!-- User element -->\n        <ids-module-nav-user\n          slot=\"user\">\n          <ids-icon slot=\"avatar\" icon=\"icon-guest\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\" stroke=\"none\"></ids-icon>\n          <ids-text audible type=\"span\" color=\"unset\">Guest</ids-text>\n          <ids-hyperlink\n            id=\"guest-hyperlink\"\n            font-size=\"14\"\n            text-decoration=\"none\"\n            color=\"unset\">Create an account to save your settings.</ids-hyperlink>\n        </ids-module-nav-user>\n      </ids-module-nav-bar>\n\n      <ids-module-nav-content>\n        <!-- Page content belongs here -->\n      </ids-module-nav-content>\n    </ids-module-nav>\n```\n\nFor app menu there is also an ability to put contents above like a masthead of module tabs. To do so include the `ids-app-menu-container` in the logic. See example [with-masthead](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/blob/main/src/components/ids-app-menu/demos/with-masthead.html)\n"}},{"name":"ids-month-view-attribute-mixin","attributes":[{"name":"#disable-settings","values":[]},{"name":"#current-legend","values":[]},{"name":"#range-settings","values":[]},{"name":"disable-settings","description":"Set disable settings","values":[]},{"name":"legend","description":"Set array of legend items to month view component\nValidation of data is provided by the month view component","values":[]},{"name":"range-settings","description":"Set range selection settings","values":[]},{"name":"use-range","description":"Set whether or not the component should be a range picker","values":[]}],"description":{"kind":"markdown","value":"# ids-month-view\n\n## Description\n\nThe `ids-month-view` component is a web component that provides calendar view with navigation\n\n## Use Cases\n\n- Display one month full size or compact view calendar\n- Display a day range more than one month\n\n## Settings (Attributes)\n\n- `month` `{string|number|null}` - Specifies a month to show from 0 to 11 range. 0 is January, 11 is December. Defaults to current date month if no specified or out of the range\n- `day` `{string|number|null}` - Specifies a day to initially set as active. Defaults to current date day if no specified or the day value is bigger than the month days\n- `year` `{string|number|null}` - Specifies a year to show. Defaults to current date year if no specified\n- `activeDate` - `{Date}` - Read only property to get selected day in a date format\n- `start-date` `{string|null}` - Specifies start of the range as a string date format.\nExamples of the format:\n  - Tue Nov 16 2021\n  - 2021-11-10T22:00:00.000Z\n  - 11/17/2021\n- `end-date` `{string|null}` - Specifies end of the range as a string date format.\nIf both start and end dates are set calendar toolbar will not be displayed.\n- `first-day-of-week` `{string|number|null}` - Specifies first day of the week from 0 to 6 range. 0 is Sunday, 1 is Monday. Defaults to 0 if no specified or out of the range\n- `show-today` `{boolean}` - Specifies whether or not to show the today button in the toolbar\n- `fixed-weeks` `{number|null}` - Specifies a minimum number of weeks to show in a month. Defaults to 5.\n- `compact` `{boolean}` - Specifies whether or not the component should be compact view\n- `is-date-picker` `{boolean}` - Specifies whether or not the component is used in a date picker component popup\n- `legend` - Set array of legend items:\n  - `name` `{string}` - The name of the legend (required)\n  - `color` `{string}` - The color of the legend, either hex or IDS variable excluding `--ids-color-` part i.e. `green-60` (required)\n  - `dates` `{Array}` - Array of dates (either dates or dayOfWeek is required)\n  - `dayOfWeek` `{Array}` - Array of days of week where 0 is Sunday (either dates or dayOfWeek is required)\n- `disable` `{Object}` - Disable dates settings:\n  - `dates` `{Array}` - Disable specific dates (in a format that can be converted to a date)\n  - `years` `{Array}` - Disable specific years\n  - `minDate` `{string}` - Disable up to a minimum date\n  - `maxDate` `{string}` - Disable up to a maximum date\n  - `dayOfWeek` `{Array}` - Disable a specific of days of the week 0-6\n  - `isEnable` `{boolean}` - Enables the disabled dates. Default is false\n- `show-picklist-year` `{boolean}` Whether or not to show a list of years in the toolbar datepicker picklist, default if true\n- `show-picklist-month` `{boolean}` Whether or not to show a list of months in the toolbar datepicker picklist, default is true\n- `show-picklist-week` `{boolean}` Whether or not to show week numbers in the toolbar datepicker picklist\n- `display-time` `{boolean}` Whether or not to display time information in calendar events\n- `display-comments` `{boolean}` Whether or not to display comments in calendar events\n- `group-events` `{boolean}` Whether or not to group similar calendar events by type\n\n## Settings (Properties)\n\n- `eventsData` `{Array<CalendarEventData>}` - Array of calendar event data to populate the month view\n- `eventTypesData` `{Array<CalendarEventTypeData>}` - Array of calendar event types used to categorize calendar events\n\n## Events\n\n- `dayselected` - Fires when a day is selected\n- `beforeeventrendered` Fires for each event rendered (full day or in day) before the element is added to the DOM\n- `aftereventrendered` Fires for each event rendered (full day or in day) after the element is added to the DOM\n\n## Methods\n\n- `isDisabledByDate(date: Date): boolean` - Defines if a date is in disabled settings\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> - Tabbing will tab across the header elements and into the monthview.\n- <kbd>Shift + Tab</kbd> reverses the direction of the tab order.\n- <kbd>Up</kbd> and <kbd>Down</kbd> goes to the same day of the week in the previous or next week respectively. If the user advances past the end of the month they continue into the next or previous month as appropriate\n- <kbd>Left</kbd> and <kbd>Right</kbd> advances one day to the next, also in a continuum. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Control + Page Up</kbd> moves to the same date in the previous year\n- <kbd>Control + Page Down</kbd> moves to the same date in the next year\n- <kbd>Home</kbd> moves to the first day of the current month\n- <kbd>End</kbd> moves to the last day of the current month\n- <kbd>Page Up</kbd> moves to the same date in the previous month\n- <kbd>Page Down</kbd> moves to the same date in the next month\n- <kbd>T</kbd> moves to today's date\n\n## Features (With Code Examples)\nWith no settings. Month/Day/Year defaults to current date. First day of the week is 0 - Sunday.\n\n```html\n<ids-month-view></ids-month-view>\n```\n\nSpecified date. First day of the week is 1 - Monday. Showing Today button in the toolbar.\n\n```html\n<ids-month-view\n  show-today=\"true\"\n  month=\"10\"\n  year=\"2021\"\n  day=\"15\"\n  first-day-of-week=\"1\"\n></ids-month-view>\n```\n\nSpecified date range. Showing more than one month of days. Calendar toolbar is hidden\n\n```html\n<ids-month-view\n  start-date=\"07/14/2021\"\n  end-date=\"02/03/2022\"\n></ids-month-view>\n```\n\nThe component can be controlled dynamically\n\n```js\nconst monthView = document.querySelector('ids-month-view');\n\n// Changing month (March)\nmonthView.month = 2;\n\n// Changing day\nmonthView.day = 4;\n\n// Changing year\nmonthView.year = 2016;\n\n// Changing first day of the week (Monday)\nmonthView.firstDayOfWeek = 1;\n\n// Make it compact\nmonthView.compact = true;\n\n// Showing date range\nmonthView.startDate = '07/14/2021';\nmonthView.endDate = '02/02/2022';\n\n// Set legend\nmonthView.legend = [\n  {\n    name: 'Public Holiday',\n    color: 'green-60',\n    dates: ['12/31/2021', '12/24/2021', '1/1/2022'],\n  },\n  { name: 'Weekends', color: 'orange-60', dayOfWeek: [0, 6] },\n  {\n    name: 'Other',\n    color: 'red-30',\n    dates: ['1/8/2022', '1/9/2022', '1/23/2022'],\n  },\n  {\n    name: 'Half Days',\n    color: 'purple-60',\n    dates: ['1/21/2022', '1/22/2022'],\n  },\n  {\n    name: 'Full Days',\n    color: '#1677ee',\n    dates: ['1/24/2022', '1/25/2022'],\n  }\n];\n\n// Unset legend\nmonthView.legend = null;\n\n// Add disabled dates\nmonthView.disableSettings = {\n  dates: ['2/7/2018', '2/9/2018', '2/10/2018', '2/11/2018'],\n  dayOfWeek: [0, 6],\n  minDate: '2/6/2018',\n  maxDate: '2/12/2018',\n  years: [2017, 2018],\n  isEnable: true\n}\n```\n\n## Accessibility\n\nThe monthview is a very complex component to code for accessibility. We take the following approach:\n\n- Add an `aria-label` to the calendar element\n- Add `aria-selected=true` to selected day\n- Each calendar item should have an audible label to announce the day of week while arrowing through days\n- For comparison, see a similar <a href=\"http://oaa-accessibility.org/example/15/\" target=\"_blank\">example</a>\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This is a new component for 4.x\n\n**4.x to 5.x**\n\n- MonthView is now a custom element `<ids-month-view></ids-month-view>`\n- Events are now just plain JS events\n- Some options and events are not converted yet\n- To set range of dates now there are `start-date` and `end-date` attributes instead of `displayRange` setting\n"}},{"name":"ids-month-view-common","description":{"kind":"markdown","value":"# ids-month-view\n\n## Description\n\nThe `ids-month-view` component is a web component that provides calendar view with navigation\n\n## Use Cases\n\n- Display one month full size or compact view calendar\n- Display a day range more than one month\n\n## Settings (Attributes)\n\n- `month` `{string|number|null}` - Specifies a month to show from 0 to 11 range. 0 is January, 11 is December. Defaults to current date month if no specified or out of the range\n- `day` `{string|number|null}` - Specifies a day to initially set as active. Defaults to current date day if no specified or the day value is bigger than the month days\n- `year` `{string|number|null}` - Specifies a year to show. Defaults to current date year if no specified\n- `activeDate` - `{Date}` - Read only property to get selected day in a date format\n- `start-date` `{string|null}` - Specifies start of the range as a string date format.\nExamples of the format:\n  - Tue Nov 16 2021\n  - 2021-11-10T22:00:00.000Z\n  - 11/17/2021\n- `end-date` `{string|null}` - Specifies end of the range as a string date format.\nIf both start and end dates are set calendar toolbar will not be displayed.\n- `first-day-of-week` `{string|number|null}` - Specifies first day of the week from 0 to 6 range. 0 is Sunday, 1 is Monday. Defaults to 0 if no specified or out of the range\n- `show-today` `{boolean}` - Specifies whether or not to show the today button in the toolbar\n- `fixed-weeks` `{number|null}` - Specifies a minimum number of weeks to show in a month. Defaults to 5.\n- `compact` `{boolean}` - Specifies whether or not the component should be compact view\n- `is-date-picker` `{boolean}` - Specifies whether or not the component is used in a date picker component popup\n- `legend` - Set array of legend items:\n  - `name` `{string}` - The name of the legend (required)\n  - `color` `{string}` - The color of the legend, either hex or IDS variable excluding `--ids-color-` part i.e. `green-60` (required)\n  - `dates` `{Array}` - Array of dates (either dates or dayOfWeek is required)\n  - `dayOfWeek` `{Array}` - Array of days of week where 0 is Sunday (either dates or dayOfWeek is required)\n- `disable` `{Object}` - Disable dates settings:\n  - `dates` `{Array}` - Disable specific dates (in a format that can be converted to a date)\n  - `years` `{Array}` - Disable specific years\n  - `minDate` `{string}` - Disable up to a minimum date\n  - `maxDate` `{string}` - Disable up to a maximum date\n  - `dayOfWeek` `{Array}` - Disable a specific of days of the week 0-6\n  - `isEnable` `{boolean}` - Enables the disabled dates. Default is false\n- `show-picklist-year` `{boolean}` Whether or not to show a list of years in the toolbar datepicker picklist, default if true\n- `show-picklist-month` `{boolean}` Whether or not to show a list of months in the toolbar datepicker picklist, default is true\n- `show-picklist-week` `{boolean}` Whether or not to show week numbers in the toolbar datepicker picklist\n- `display-time` `{boolean}` Whether or not to display time information in calendar events\n- `display-comments` `{boolean}` Whether or not to display comments in calendar events\n- `group-events` `{boolean}` Whether or not to group similar calendar events by type\n\n## Settings (Properties)\n\n- `eventsData` `{Array<CalendarEventData>}` - Array of calendar event data to populate the month view\n- `eventTypesData` `{Array<CalendarEventTypeData>}` - Array of calendar event types used to categorize calendar events\n\n## Events\n\n- `dayselected` - Fires when a day is selected\n- `beforeeventrendered` Fires for each event rendered (full day or in day) before the element is added to the DOM\n- `aftereventrendered` Fires for each event rendered (full day or in day) after the element is added to the DOM\n\n## Methods\n\n- `isDisabledByDate(date: Date): boolean` - Defines if a date is in disabled settings\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> - Tabbing will tab across the header elements and into the monthview.\n- <kbd>Shift + Tab</kbd> reverses the direction of the tab order.\n- <kbd>Up</kbd> and <kbd>Down</kbd> goes to the same day of the week in the previous or next week respectively. If the user advances past the end of the month they continue into the next or previous month as appropriate\n- <kbd>Left</kbd> and <kbd>Right</kbd> advances one day to the next, also in a continuum. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Control + Page Up</kbd> moves to the same date in the previous year\n- <kbd>Control + Page Down</kbd> moves to the same date in the next year\n- <kbd>Home</kbd> moves to the first day of the current month\n- <kbd>End</kbd> moves to the last day of the current month\n- <kbd>Page Up</kbd> moves to the same date in the previous month\n- <kbd>Page Down</kbd> moves to the same date in the next month\n- <kbd>T</kbd> moves to today's date\n\n## Features (With Code Examples)\nWith no settings. Month/Day/Year defaults to current date. First day of the week is 0 - Sunday.\n\n```html\n<ids-month-view></ids-month-view>\n```\n\nSpecified date. First day of the week is 1 - Monday. Showing Today button in the toolbar.\n\n```html\n<ids-month-view\n  show-today=\"true\"\n  month=\"10\"\n  year=\"2021\"\n  day=\"15\"\n  first-day-of-week=\"1\"\n></ids-month-view>\n```\n\nSpecified date range. Showing more than one month of days. Calendar toolbar is hidden\n\n```html\n<ids-month-view\n  start-date=\"07/14/2021\"\n  end-date=\"02/03/2022\"\n></ids-month-view>\n```\n\nThe component can be controlled dynamically\n\n```js\nconst monthView = document.querySelector('ids-month-view');\n\n// Changing month (March)\nmonthView.month = 2;\n\n// Changing day\nmonthView.day = 4;\n\n// Changing year\nmonthView.year = 2016;\n\n// Changing first day of the week (Monday)\nmonthView.firstDayOfWeek = 1;\n\n// Make it compact\nmonthView.compact = true;\n\n// Showing date range\nmonthView.startDate = '07/14/2021';\nmonthView.endDate = '02/02/2022';\n\n// Set legend\nmonthView.legend = [\n  {\n    name: 'Public Holiday',\n    color: 'green-60',\n    dates: ['12/31/2021', '12/24/2021', '1/1/2022'],\n  },\n  { name: 'Weekends', color: 'orange-60', dayOfWeek: [0, 6] },\n  {\n    name: 'Other',\n    color: 'red-30',\n    dates: ['1/8/2022', '1/9/2022', '1/23/2022'],\n  },\n  {\n    name: 'Half Days',\n    color: 'purple-60',\n    dates: ['1/21/2022', '1/22/2022'],\n  },\n  {\n    name: 'Full Days',\n    color: '#1677ee',\n    dates: ['1/24/2022', '1/25/2022'],\n  }\n];\n\n// Unset legend\nmonthView.legend = null;\n\n// Add disabled dates\nmonthView.disableSettings = {\n  dates: ['2/7/2018', '2/9/2018', '2/10/2018', '2/11/2018'],\n  dayOfWeek: [0, 6],\n  minDate: '2/6/2018',\n  maxDate: '2/12/2018',\n  years: [2017, 2018],\n  isEnable: true\n}\n```\n\n## Accessibility\n\nThe monthview is a very complex component to code for accessibility. We take the following approach:\n\n- Add an `aria-label` to the calendar element\n- Add `aria-selected=true` to selected day\n- Each calendar item should have an audible label to announce the day of week while arrowing through days\n- For comparison, see a similar <a href=\"http://oaa-accessibility.org/example/15/\" target=\"_blank\">example</a>\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This is a new component for 4.x\n\n**4.x to 5.x**\n\n- MonthView is now a custom element `<ids-month-view></ids-month-view>`\n- Events are now just plain JS events\n- Some options and events are not converted yet\n- To set range of dates now there are `start-date` and `end-date` attributes instead of `displayRange` setting\n"}},{"name":"ids-month-view","attributes":[{"name":"#last-rendered-year","values":[]},{"name":"#last-rendered-day","values":[]},{"name":"#last-rendered-month","values":[]},{"name":"#last-rendered-first-day-of-week","values":[]},{"name":"#tooltip-settings","values":[]},{"name":"day-event-start-offset","values":[]},{"name":"#is-custom","values":[]},{"name":"on-language-change","description":"Handle language changes by re-rendering the month view","values":[]},{"name":"on-locale-change","description":"Handle locale changes by re-rendering the month view","values":[]},{"name":"start-date","description":"Set start of the range to show","values":[]},{"name":"end-date","description":"Set end of the range to show","values":[]},{"name":"compact","description":"Set whether or not the component should be compact view","values":[]},{"name":"show-apply","description":"Set whether or not to show cancel button when the picker is expanded","values":[]},{"name":"show-toolbar","description":"Get whether the toolbar is shown","values":[]},{"name":"show-today","description":"Get whether the today button is shown","values":[]},{"name":"show-week-numbers","description":"Get whether week numbers are shown","values":[]},{"name":"fixed-weeks","description":"Get the fixed number of weeks to display","values":[]},{"name":"is-date-picker","description":"Set whether or not the component is used in datepicker popup","values":[]},{"name":"show-tooltip","description":"Set whether or not to show the tooltip","values":[]},{"name":"tooltip-settings","description":"sets the tooltip settings","values":[]},{"name":"slide-selection","description":"Sets the slide selection","values":[]},{"name":"group-events","description":"Sets the group events setting","values":[]},{"name":"show-picklist-year","description":"Whether or not to show a list of years in the toolbar datepicker picklist","values":[]},{"name":"show-picklist-month","description":"Whether or not to show a list of months in the toolbar datepicker picklist","values":[]},{"name":"show-picklist-week","description":"Whether or not to show week numbers in the toolbar datepicker picklist","values":[]},{"name":"on-day-render","description":"Set the function that fires as the day cell is rendered","values":[]},{"name":"display-time","description":"Gets displayTime setting value","values":[]},{"name":"display-comments","description":"Gets displayComments setting value","values":[]}],"description":{"kind":"markdown","value":"# ids-month-view\n\n## Description\n\nThe `ids-month-view` component is a web component that provides calendar view with navigation\n\n## Use Cases\n\n- Display one month full size or compact view calendar\n- Display a day range more than one month\n\n## Settings (Attributes)\n\n- `month` `{string|number|null}` - Specifies a month to show from 0 to 11 range. 0 is January, 11 is December. Defaults to current date month if no specified or out of the range\n- `day` `{string|number|null}` - Specifies a day to initially set as active. Defaults to current date day if no specified or the day value is bigger than the month days\n- `year` `{string|number|null}` - Specifies a year to show. Defaults to current date year if no specified\n- `activeDate` - `{Date}` - Read only property to get selected day in a date format\n- `start-date` `{string|null}` - Specifies start of the range as a string date format.\nExamples of the format:\n  - Tue Nov 16 2021\n  - 2021-11-10T22:00:00.000Z\n  - 11/17/2021\n- `end-date` `{string|null}` - Specifies end of the range as a string date format.\nIf both start and end dates are set calendar toolbar will not be displayed.\n- `first-day-of-week` `{string|number|null}` - Specifies first day of the week from 0 to 6 range. 0 is Sunday, 1 is Monday. Defaults to 0 if no specified or out of the range\n- `show-today` `{boolean}` - Specifies whether or not to show the today button in the toolbar\n- `fixed-weeks` `{number|null}` - Specifies a minimum number of weeks to show in a month. Defaults to 5.\n- `compact` `{boolean}` - Specifies whether or not the component should be compact view\n- `is-date-picker` `{boolean}` - Specifies whether or not the component is used in a date picker component popup\n- `legend` - Set array of legend items:\n  - `name` `{string}` - The name of the legend (required)\n  - `color` `{string}` - The color of the legend, either hex or IDS variable excluding `--ids-color-` part i.e. `green-60` (required)\n  - `dates` `{Array}` - Array of dates (either dates or dayOfWeek is required)\n  - `dayOfWeek` `{Array}` - Array of days of week where 0 is Sunday (either dates or dayOfWeek is required)\n- `disable` `{Object}` - Disable dates settings:\n  - `dates` `{Array}` - Disable specific dates (in a format that can be converted to a date)\n  - `years` `{Array}` - Disable specific years\n  - `minDate` `{string}` - Disable up to a minimum date\n  - `maxDate` `{string}` - Disable up to a maximum date\n  - `dayOfWeek` `{Array}` - Disable a specific of days of the week 0-6\n  - `isEnable` `{boolean}` - Enables the disabled dates. Default is false\n- `show-picklist-year` `{boolean}` Whether or not to show a list of years in the toolbar datepicker picklist, default if true\n- `show-picklist-month` `{boolean}` Whether or not to show a list of months in the toolbar datepicker picklist, default is true\n- `show-picklist-week` `{boolean}` Whether or not to show week numbers in the toolbar datepicker picklist\n- `display-time` `{boolean}` Whether or not to display time information in calendar events\n- `display-comments` `{boolean}` Whether or not to display comments in calendar events\n- `group-events` `{boolean}` Whether or not to group similar calendar events by type\n\n## Settings (Properties)\n\n- `eventsData` `{Array<CalendarEventData>}` - Array of calendar event data to populate the month view\n- `eventTypesData` `{Array<CalendarEventTypeData>}` - Array of calendar event types used to categorize calendar events\n\n## Events\n\n- `dayselected` - Fires when a day is selected\n- `beforeeventrendered` Fires for each event rendered (full day or in day) before the element is added to the DOM\n- `aftereventrendered` Fires for each event rendered (full day or in day) after the element is added to the DOM\n\n## Methods\n\n- `isDisabledByDate(date: Date): boolean` - Defines if a date is in disabled settings\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> - Tabbing will tab across the header elements and into the monthview.\n- <kbd>Shift + Tab</kbd> reverses the direction of the tab order.\n- <kbd>Up</kbd> and <kbd>Down</kbd> goes to the same day of the week in the previous or next week respectively. If the user advances past the end of the month they continue into the next or previous month as appropriate\n- <kbd>Left</kbd> and <kbd>Right</kbd> advances one day to the next, also in a continuum. Visually, focus is moved from day to day and wraps from row to row in a grid of days and weeks\n- <kbd>Control + Page Up</kbd> moves to the same date in the previous year\n- <kbd>Control + Page Down</kbd> moves to the same date in the next year\n- <kbd>Home</kbd> moves to the first day of the current month\n- <kbd>End</kbd> moves to the last day of the current month\n- <kbd>Page Up</kbd> moves to the same date in the previous month\n- <kbd>Page Down</kbd> moves to the same date in the next month\n- <kbd>T</kbd> moves to today's date\n\n## Features (With Code Examples)\nWith no settings. Month/Day/Year defaults to current date. First day of the week is 0 - Sunday.\n\n```html\n<ids-month-view></ids-month-view>\n```\n\nSpecified date. First day of the week is 1 - Monday. Showing Today button in the toolbar.\n\n```html\n<ids-month-view\n  show-today=\"true\"\n  month=\"10\"\n  year=\"2021\"\n  day=\"15\"\n  first-day-of-week=\"1\"\n></ids-month-view>\n```\n\nSpecified date range. Showing more than one month of days. Calendar toolbar is hidden\n\n```html\n<ids-month-view\n  start-date=\"07/14/2021\"\n  end-date=\"02/03/2022\"\n></ids-month-view>\n```\n\nThe component can be controlled dynamically\n\n```js\nconst monthView = document.querySelector('ids-month-view');\n\n// Changing month (March)\nmonthView.month = 2;\n\n// Changing day\nmonthView.day = 4;\n\n// Changing year\nmonthView.year = 2016;\n\n// Changing first day of the week (Monday)\nmonthView.firstDayOfWeek = 1;\n\n// Make it compact\nmonthView.compact = true;\n\n// Showing date range\nmonthView.startDate = '07/14/2021';\nmonthView.endDate = '02/02/2022';\n\n// Set legend\nmonthView.legend = [\n  {\n    name: 'Public Holiday',\n    color: 'green-60',\n    dates: ['12/31/2021', '12/24/2021', '1/1/2022'],\n  },\n  { name: 'Weekends', color: 'orange-60', dayOfWeek: [0, 6] },\n  {\n    name: 'Other',\n    color: 'red-30',\n    dates: ['1/8/2022', '1/9/2022', '1/23/2022'],\n  },\n  {\n    name: 'Half Days',\n    color: 'purple-60',\n    dates: ['1/21/2022', '1/22/2022'],\n  },\n  {\n    name: 'Full Days',\n    color: '#1677ee',\n    dates: ['1/24/2022', '1/25/2022'],\n  }\n];\n\n// Unset legend\nmonthView.legend = null;\n\n// Add disabled dates\nmonthView.disableSettings = {\n  dates: ['2/7/2018', '2/9/2018', '2/10/2018', '2/11/2018'],\n  dayOfWeek: [0, 6],\n  minDate: '2/6/2018',\n  maxDate: '2/12/2018',\n  years: [2017, 2018],\n  isEnable: true\n}\n```\n\n## Accessibility\n\nThe monthview is a very complex component to code for accessibility. We take the following approach:\n\n- Add an `aria-label` to the calendar element\n- Add `aria-selected=true` to selected day\n- Each calendar item should have an audible label to announce the day of week while arrowing through days\n- For comparison, see a similar <a href=\"http://oaa-accessibility.org/example/15/\" target=\"_blank\">example</a>\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This is a new component for 4.x\n\n**4.x to 5.x**\n\n- MonthView is now a custom element `<ids-month-view></ids-month-view>`\n- Events are now just plain JS events\n- Some options and events are not converted yet\n- To set range of dates now there are `start-date` and `end-date` attributes instead of `displayRange` setting\n"}},{"name":"ids-multiselect","attributes":[{"name":"mo","description":"Watches for changes","values":[]},{"name":"options-data","values":[]},{"name":"internal-selected-list","values":[]},{"name":"initial-selected-list","values":[]},{"name":"disabled","description":"Gets the value of the disabled property","values":[]},{"name":"tags","description":"returns whether the multiselect is set to display selections as tags","values":[]},{"name":"placeholder","description":"Get the placeholder attribute","values":[]},{"name":"max","description":"returns the maximum number of allowed selections","values":[]},{"name":"select-all","description":"returns whether the multiselect has select all enabled","values":[]},{"name":"tag-color","description":"Gets the tag color","values":[]},{"name":"show-apply","description":"Gets whether the multiselect shows apply button","values":[]},{"name":"show-cancel","description":"Gets whether the multiselect shows cancel button","values":[]},{"name":"show-clear","description":"Gets whether the multiselect shows clear button","values":[]},{"name":"value","description":"Gets the current value of the component.","values":[]},{"name":"selected-options","description":"Returns the selected Listbox option based on the Dropdown's value.","values":[]},{"name":"typeahead","description":"Get the typeahead attribute","values":[]},{"name":"is-form-component","values":[]},{"name":"dropdown-list","values":[]},{"name":"trigger","values":[]},{"name":"list-box","values":[]},{"name":"label-clicked","values":[]},{"name":"label-el","values":[]},{"name":"opened-by-keyboard","description":"Sets to true when a keyboard operation opens the dropdown (prevents extraneous event triggering)","values":[]},{"name":"closed-by-keyboard","description":"Sets to true when a keyboard operation closes the dropdown (prevents extraneous event triggering)","values":[]},{"name":"initial-value-set","values":[]},{"name":"selected-ui-row-index","description":"UI row index of the selected option, reliable even with duplicate values","values":[]},{"name":"has-selected","description":"Sets to true when processing the selection of the user","values":[]},{"name":"initial-selected-index","description":"Stores the initial selectedIndex when dropdown opens (for Escape key restoration)","values":[]},{"name":"is-canceling-selection","description":"Flag to prevent overwriting selectedIndex during cancel operations","values":[]},{"name":"selected-option-data","description":"Selected option tracking for duplicate value handling","values":[]},{"name":"columns-data","values":[]},{"name":"max-columns-value","values":[]},{"name":"#is-multi-select","values":[]},{"name":"typeahead-input","values":[]},{"name":"value-before-search","values":[]},{"name":"no-results-selected","values":[]},{"name":"has-icons","description":"Check if dropdown options contain icons","values":[]},{"name":"has-avatar","description":"Check if dropdown options contain avatars","values":[]},{"name":"color-variants","description":"List of available color variants for this component","values":[]},{"name":"text-align","description":"Gets the text alignment of the displayed value","values":[]},{"name":"allow-blank","description":"Gets allow-blank value","values":[]},{"name":"input","description":"Get the input element","values":[]},{"name":"popup","description":"Get the popup element","values":[]},{"name":"multi-column","description":"Get whether the dropdown displays options in multiple columns","values":[]},{"name":"show-value","description":"Get whether to show the value instead of the label text","values":[]},{"name":"value-reset-tracking","description":"Set the value of the dropdown and reset dirty tracking","values":[]},{"name":"auto-size","description":"Get the auto-size setting","values":[]},{"name":"input-auto-size","description":"Get the input-auto-size setting","values":[]},{"name":"list-box-position-style","description":"Get the positioning style of the listbox popup","values":[]},{"name":"option-values","description":"Get all available option-values for the dropdown","values":[]},{"name":"labels","description":"Get all available labels of the dropdown","values":[]},{"name":"selected-option","description":"Get the selected Listbox option based on the Dropdown's value","values":[]},{"name":"selected","description":"Get the currently-selected Listbox option","values":[]},{"name":"selected-index","description":"Get the selected option index","values":[]},{"name":"options","description":"Get the currently available options","values":[]},{"name":"readonly","description":"Get the readonly state","values":[]},{"name":"max-height","description":"Set the max height value","values":[]},{"name":"disable-tooltip","description":"Get whether tooltip is disabled","values":[]},{"name":"overflow","description":"Get the overflow behavior","values":[]},{"name":"tooltip","description":"Get the tooltip text or behavior","values":[]},{"name":"dropdown-icon-el","description":"Get the currently-displayed IdsIcon in the trigger field","values":[]},{"name":"dropdown-color-swatch","description":"Get the dropdown color swatch","values":[]},{"name":"#search-value","values":[]},{"name":"no-search","description":"Get the no search state","values":[]},{"name":"combo-box","description":"Get the combobox state","values":[]},{"name":"combo-search","description":"Get the combo search function","values":[]},{"name":"after-show","description":"Get the afterShow function","values":[]},{"name":"before-show","description":"Get the before show function","values":[]},{"name":"data","description":"Get the dropdown options data","values":[]},{"name":"columns","description":"Get the dropdown columns configuration","values":[]},{"name":"max-columns","description":"Get the maximum number of columns","values":[]},{"name":"on-language-change","description":"Handle language changes by updating ARIA attributes","values":[]},{"name":"#is-first-render","description":"Flag to track initial render state for combobox value synchronization","values":[]},{"name":"validate","description":"Get the validate attribute","values":[]},{"name":"required","description":"Get the required state","values":[]},{"name":"validation-events","description":"Get the validation events","values":[]},{"name":"offset-container","description":"Get the offset container","values":[]},{"name":"list","description":"Get the list attribute","values":[]},{"name":"margin-block-end","description":"Gets the margin-block-end token key","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"show-no-results","description":"Get the show no results state","values":[]},{"name":"show-loading-indicator","description":"Get the show loading indicator state","values":[]},{"name":"tabbable","description":"Gets whether the dropdown can be tabbed to","values":[]},{"name":"search-field","description":"Get the search field element","values":[]},{"name":"skip-sanitize","description":"Gets whether HTML sanitization should be skipped for labels","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# IDS Multiselect\n\n## Description\nIds Multiselect is similar to Ids Dropdown except it allows the end user to select more than one option from a list. Selected items can be displayed as dismissible tags or a comma separated string.\n\n## Use Cases\n\n- Use when you want a user to select one or more options from a list of values\n\n## Terminology\n\n- **List Box**: The UX element that holds the items in the dropdown\n- **List Box Option**: The dropdown options but contained in a list box\n\n## Settings and Attributes\n\nIdsMultiselect inherits most of it's settings from ids-dropdown, please refer to that document [here](../ids-dropdown/README.md) for more details. Below are listed new settings or ones that have been modified or are different from ids-dropdown:\n\n- `disabled` {Boolean} Sets multiselect to disabled including dismissible tags\n- `tags` {Boolean} sets whether to use tags to display selected values\n- `tag-color` {String} Sets the color theme for tags when tags mode is enabled (e.g., 'info', 'success', 'warning', 'error')\n- `value` {Array} Sets the selected options to match the items in the array. This is no longer set as an attribute but as a property `document.querySelector('ids-multiselect').value = ['al', 'ar', 'ca']`\n- `max` {number} Sets maximum number of selected options\n- `selectedIndex` no longer provides functionality in ids-multiselect\n- `placeholder` sets the placeholder text for the input field\n- `select-all` {Boolean} Enables the select-all functionality, adding a \"Select all\" option at the top of the dropdown list\n- `show-apply` {Boolean} Shows an Apply button in the dropdown footer to confirm selections\n- `show-cancel` {Boolean} Shows a Cancel button in the dropdown footer to discard changes\n- `show-clear` {Boolean} Shows a Clear button in the dropdown footer to clear all selections\n- `skip-sanitize` {Boolean} If set to true, HTML content in option values and labels will not be sanitized, allowing raw HTML to be displayed. Use with caution as this can introduce XSS vulnerabilities if user input is not properly validated.\n\n## Events\n\nIdsMultiselect inherits events from ids-dropdown and adds the following events:\n\n- `open` Fires when the dropdown list is opened.\n- `close` Fires when the dropdown list is closed.\n- `selected` Fires when an option is selected or deselected in the multiselect dropdown. The event includes details about the selected option.\n- `change` Fires when the multiselect value changes (including when options are selected/deselected).\n- `apply` Fires when the Apply button is clicked. Contains the current selected values.\n- `cancel` Fires when the Cancel button is clicked. Restores the previous state.\n- `clear` Fires when the Clear button is clicked. Clears all selections.\n\nExample:\n\n```ts\nconst multiselect = document.querySelector('ids-multiselect');\nmultiselect.addEventListener('selected', (e: any) => {\n  console.info(`Selected: Value Changed to `, e.target.value, e.detail.value);\n});\n```\n\nWhen using the select-all feature, the `selected` event includes additional action types:\n\n- `selected-all` - Fired when all options are selected via the select-all option\n- `deselected-all` - Fired when all options are deselected via the select-all option\n\nExample:\n\n```ts\nconst multiselect = document.querySelector('ids-multiselect');\nmultiselect.addEventListener('selected', (e: any) => {\n  if (e.detail.action === 'selected-all') {\n    console.log('All options selected');\n  } else if (e.detail.action === 'deselected-all') {\n    console.log('All options deselected');\n  }\n});\n```\n\nWhen using footer buttons, you can listen for their specific events:\n\n```ts\nconst multiselect = document.querySelector('ids-multiselect');\n\n// Apply button clicked\nmultiselect.addEventListener('apply', (e: any) => {\n  console.log('Apply clicked with values:', e.detail.value);\n});\n\n// Cancel button clicked\nmultiselect.addEventListener('cancel', (e: any) => {\n  console.log('Cancel clicked, changes discarded');\n});\n\n// Clear button clicked\nmultiselect.addEventListener('clear', (e: any) => {\n  console.log('Clear clicked, all selections removed');\n});\n```\n\n## Features (With Code Examples)\n\nA basic example of a multiselect in action.\n\n```html\n<ids-multiselect id=\"dropdown-1\" label=\"Test Dropdown\">\n  <ids-list-box>\n    <ids-list-box-option id=\"al\" value=\"al\"><ids-checkbox label=\"Alabama\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ak\" value=\"ak\"><ids-checkbox label=\"Alaska\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"az\" value=\"az\"><ids-checkbox label=\"Arizona\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ar\" value=\"ar\"><ids-checkbox label=\"Arkansas\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ca\" value=\"ca\"><ids-checkbox label=\"California\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"co\" value=\"co\"><ids-checkbox label=\"Colorado\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\nExample with a maximum selection\n\n```html\n<ids-multiselect id=\"dropdown-1\" label=\"Test Dropdown\" max=\"3\">\n  <ids-list-box>\n    <ids-list-box-option id=\"al\" value=\"al\"><ids-checkbox label=\"Alabama\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ak\" value=\"ak\"><ids-checkbox label=\"Alaska\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"az\" value=\"az\"><ids-checkbox label=\"Arizona\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ar\" value=\"ar\"><ids-checkbox label=\"Arkansas\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ca\" value=\"ca\"><ids-checkbox label=\"California\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"co\" value=\"co\"><ids-checkbox label=\"Colorado\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\nExample with tags\n\n```html\n<ids-multiselect id=\"dropdown-1\" label=\"Test Dropdown\" max=\"3\" tags=\"true\">\n  <ids-list-box>\n    <ids-list-box-option id=\"al\" value=\"al\"><ids-checkbox label=\"Alabama\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ak\" value=\"ak\"><ids-checkbox label=\"Alaska\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"az\" value=\"az\"><ids-checkbox label=\"Arizona\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ar\" value=\"ar\"><ids-checkbox label=\"Arkansas\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ca\" value=\"ca\"><ids-checkbox label=\"California\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"co\" value=\"co\"><ids-checkbox label=\"Colorado\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\nExample with colored tags\n\n```html\n<ids-multiselect id=\"dropdown-1\" label=\"Test Dropdown\" tags=\"true\" tag-color=\"success\">\n  <ids-list-box>\n    <ids-list-box-option id=\"al\" value=\"al\"><ids-checkbox label=\"Alabama\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ak\" value=\"ak\"><ids-checkbox label=\"Alaska\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"az\" value=\"az\"><ids-checkbox label=\"Arizona\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ar\" value=\"ar\"><ids-checkbox label=\"Arkansas\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ca\" value=\"ca\"><ids-checkbox label=\"California\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"co\" value=\"co\"><ids-checkbox label=\"Colorado\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\nWith selected options initially. Add `selected` attribute to the selected options in the list.\n\n```html\n<ids-multiselect id=\"dropdown-1\" label=\"Test Dropdown\" max=\"3\" dirty-tracker=\"true\">\n  <ids-list-box>\n    <ids-list-box-option id=\"al\" value=\"al\" selected><ids-checkbox label=\"Alabama\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ak\" value=\"ak\"><ids-checkbox label=\"Alaska\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"az\" value=\"az\"><ids-checkbox label=\"Arizona\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ar\" value=\"ar\" selected><ids-checkbox label=\"Arkansas\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ca\" value=\"ca\"><ids-checkbox label=\"California\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"co\" value=\"co\"><ids-checkbox label=\"Colorado\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\nExample with a placeholder\n\n```html\n<ids-multiselect id=\"dropdown-1\" placeholder=\"Select states\" label=\"Test Dropdown\">\n  <ids-list-box>\n    <ids-list-box-option id=\"al\" value=\"al\"><ids-checkbox label=\"Alabama\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ak\" value=\"ak\"><ids-checkbox label=\"Alaska\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"az\" value=\"az\"><ids-checkbox label=\"Arizona\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ar\" value=\"ar\"><ids-checkbox label=\"Arkansas\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"ca\" value=\"ca\"><ids-checkbox label=\"California\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option id=\"co\" value=\"co\"><ids-checkbox label=\"Colorado\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\nExample with a select-all\n\n```html\n<ids-multiselect id=\"multiselect-select-all\" label=\"States with select all\" select-all>\n  <ids-list-box>\n    <ids-list-box-option value=\"al\"><ids-checkbox label=\"Alabama\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"ak\"><ids-checkbox label=\"Alaska\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"az\"><ids-checkbox label=\"Arizona\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"ar\"><ids-checkbox label=\"Arkansas\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"ca\"><ids-checkbox label=\"California\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\n### Footer Action Buttons\n\nExample with Apply and Cancel buttons\n\n```html\n<ids-multiselect id=\"multiselect-1\" label=\"States\" show-apply=\"true\" show-cancel=\"true\">\n  <ids-list-box>\n    <ids-list-box-option value=\"al\"><ids-checkbox label=\"Alabama\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"ak\"><ids-checkbox label=\"Alaska\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"az\"><ids-checkbox label=\"Arizona\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"ar\"><ids-checkbox label=\"Arkansas\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"ca\"><ids-checkbox label=\"California\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\nExample with Clear button\n\n```html\n<ids-multiselect id=\"multiselect-2\" label=\"States\" show-clear=\"true\">\n  <ids-list-box>\n    <ids-list-box-option value=\"opt1\"><ids-checkbox label=\"Option 1\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"opt2\"><ids-checkbox label=\"Option 2\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"opt3\"><ids-checkbox label=\"Option 3\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"opt4\"><ids-checkbox label=\"Option 4\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\nExample with all footer buttons\n\n```html\n<ids-multiselect id=\"multiselect-3\" label=\"States\" show-apply=\"true\" show-cancel=\"true\" show-clear=\"true\">\n  <ids-list-box>\n    <ids-list-box-option value=\"al\"><ids-checkbox label=\"Alabama\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"ak\"><ids-checkbox label=\"Alaska\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"az\"><ids-checkbox label=\"Arizona\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"ar\"><ids-checkbox label=\"Arkansas\"></ids-checkbox></ids-list-box-option>\n    <ids-list-box-option value=\"ca\"><ids-checkbox label=\"California\"></ids-checkbox></ids-list-box-option>\n  </ids-list-box>\n</ids-multiselect>\n```\n\n**Footer Button Behavior:**\n\n- **Apply Button**: Confirms the current selections and closes the dropdown. Fires the `apply` event.\n- **Cancel Button**: Discards any changes made during the current session and restores the previous state. Fires the `cancel` event.\n- **Clear Button**: Removes all current selections and updates the multiselect value to empty. Fires the `clear` event.\n\nThe buttons appear in the dropdown footer and are styled with appropriate appearances (Apply as primary, Cancel and Clear as secondary).\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: When the dropdown is open, Tab will select the currently highlighted option and close the dropdown, then move focus to the next focusable element\n- <kbd>Alt + Down Arrow / Down Arrow</kbd>: Opens the dropdown list and moves focus to the first option\n- <kbd>Enter</kbd>: When dropdown is open, selects/deselects the currently highlighted option\n- <kbd>Space</kbd>: When dropdown is open, selects/deselects the currently highlighted option. When input field is focused, allows normal typing\n- <kbd>Escape</kbd>: Closes the dropdown list without making changes\n- <kbd>Up/Down Arrow</kbd>: Navigates through options in the dropdown list\n- <kbd>Left/Right Arrow</kbd>: When footer buttons are focused, navigates between footer buttons horizontally\n- <kbd>Enter/Space</kbd>: When footer buttons are focused, activates the button (Apply, Cancel, or Clear)\n"}},{"name":"ids-notification-banner-service","attributes":[{"name":"open-notification-banners","values":[]},{"name":"count","values":[]}],"description":{"kind":"markdown","value":"# Ids Notification Banner\n\n## Description\n\nThe Notification Banner allows developers to display a message and optionally a link to more information. The user can dismiss the banner or click through the provided link. It sits the top of a page or a widget or inside any parent.\n\nGenerally, notification banners should be highly targeted to a specific user action within the purpose and function of the form or widget they appear in and not for global issues (Server error etc) and should communicate via friendly plain-spoken user oriented microcopy, not system-speak such as numerical error codes or status codes.\n\nTheir scope should be limited to communicating immediately on a user. Multiple notifications banners should be avoided in the same area if possible. Their scope should be limited to communicating on actions taking place within the widget.\n\n## Use Cases\n\nThere are 5 different types of notification banners. Each type has a unique background color and icon.\n\n- `success`\n- `warning`\n- `caution`\n- `info`\n- `error`\n\nYou can import the type `IdsNotificationBannerAlertType` if needed.\n\n## Features (With Code Examples)\n\nA success notification banner with link.\n\n```html\n<ids-notification-banner\n  id=\"ids-notification-banner-0\"\n  message-text=\"DTO rejected by your manager for Sept 30, 2023.\"\n  type=\"success\"\n  link=\"https://infor.com\">\n</ids-notification-banner>\n```\n\nAn info notification banner with custom link text\n\n```html\n<ids-notification-banner\n  id=\"ids-notification-banner-0\"\n  message-text=\"DTO rejected by your manager for Sept 30, 2023.\"\n  type=\"info\"\n  link=\"https://infor.com\"\n  link-text=\"Learn More\">\n</ids-notification-banner>\n```\n\nAn error notification banner with no link\n\n```html\n<ids-notification-banner\n  id=\"ids-notification-banner-0\"\n  message-text=\"DTO rejected by your manager for Sept 30, 2023.\"\n  type=\"error\">\n</ids-notification-banner>\n```\n\nAdd a notification banner dynamically\n\n```js\nconst notificationBanner = new IdsNotificationBanner();\nnotificationBanner.add({\n  id: 'ids-notification-banner-1',\n  parent: 'notification-container',\n  type: 'warning',\n  messageText: 'DTO accepted by your manager for Sept 30, 2023.',\n  link: 'https://infor.com',\n  linkText: 'Learn More'\n});\n```\n\n```html\n<div id=\"notification-banner\"></div>\n```\n\n## Using the Notification Service\n\nA service is provided that allows you to show and hide banner messages and get a count. The API works as follows:\n\n```js\nimport IdsNotificationBannerService from '../ids-notification-banner-service';\n\nIdsNotificationBannerService.show({\n  id: 'ids-notification-banner-1',\n  parent: 'notification-container',\n  type: 'warning',\n  messageText: 'DTO accepted by your manager for Sept 30, 2023.',\n  link: 'https://infor.com',\n  linkText: 'Learn More'\n});\n\nIdsNotificationBannerService.count();\nIdsNotificationBannerService.dismissAll();\nIdsNotificationBannerService.dismissOldest();\nIdsNotificationBannerService.dismissNewest();\n```\n\n## Settings and Attributes\n\n- `close-label-audible` `{string | null}` sets the audible text for the close button in banner\n- `id` `{string | null}` sets the id on the banner\n- `line-clamp` {number} sets number of message text rows to display before truncating\n- `link` {string | null} sets the url for the call to action in the banner\n- `link-text` `{string | null}` sets the custom text on the call to action (if `null` will display \"Click to view\")\n- `message-text` {string} text shown inside the banner\n- `parent` `{string | null}` CSS selector of the parent element (e.g., `#id`, `.class`, `div > p`, `[attribute=value]`)\n- `target` {string} sets the target attribute for the link (_self or _blank, defaults to _blank)\n- `type` {string | IdsNotificationBannerAlertType} can be 1 of 4 types (success, warning, info, error)\n- `wrap` {Boolean} toggles text wrapping for overflowing messages (default is ellipsis)\n\n## Events\n\n- `beforeclose` - Fires when the banner is closed. If you return false in the response you can veto the close\n- `close` - Fires while the banner is closing.\n- `afterclose` - Fires after the banner is closed.\n\n## Handling Link Click Event\n\nTo handle the click event when the link inside the notification banner is clicked, you can use the following code:\n\n```js\ndocument.querySelector('ids-notification-banner').addEventListener('click', (event) => {\n  console.info('Link clicked');\n});\n```\n\n## Methods\n\n### add(notification: IdsNotificationBannerSettings)\n\nShows a notification banner dynamically with the provided settings.\n\n**Parameters:**\n\n- `notification` {IdsNotificationBannerSettings} - Configuration object containing:\n  - `id?` {string} - Optional ID for the banner\n  - `parent?` {string} - CSS selector for parent element\n  - `type` {IdsNotificationBannerAlertType} - Banner type (success, warning, caution, info, error)\n  - `messageText?` {string | null} - Message content\n  - `link?` {string} - URL for the action link\n  - `linkText?` {string} - Custom text for the link\n  - `target?` {'_self' | '_blank'} - Link target attribute\n\n### show(settings?: IdsNotificationBannerSettings)\n\nDisplays the notification banner. If settings are provided, creates a service banner.\n\n**Parameters:**\n\n- `settings?` {IdsNotificationBannerSettings} - Optional configuration object\n\n### dismiss()\n\nRemoves the notification banner from the page. Triggers beforeclose, close, and afterclose events.\n\n## Themeable Parts\n\n- `bgColor` Allows you to further style the background\n- `closeBtn` Allows you to further style the close button\n- `messageText` Allows you to further style the message text\n- `linkText` Allows you to further style the link text\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n\n## Responsive Guidelines\n\n- The notification is 100% wide and will full the parent container by default\n- The message text will be non-breaking and display ellipsis when there is not enough visible space. Use the `line-clamp` attribute to set the number of lines to display before truncating.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Comparable to the inforSlideInDialog in 3.X\n\n**4.x to 5.x**\n\n- The notification component has been renamed to notification-banner\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-message></ids-message>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- The type, alert icon, message text, link and link text are all configurable via properties on the custom element\n- Additionally, user's can define the notification via a JS api, where the `parent` and `id` can be configured"}},{"name":"ids-notification-banner","attributes":[{"name":"#handlers","values":[]},{"name":"wrap","description":"Toggle text wrapping for overflowing messages.\nText overflow style is ellipsis by default.","values":[]},{"name":"type","description":"Set the type of the Notification Banner","values":[]},{"name":"link","description":"Set the link inside the Notification Banner","values":[]},{"name":"line-clamp","description":"Sets line clamp value to truncate message text","values":[]},{"name":"link-text","description":"Set the custom link text of the Notification Banner","values":[]},{"name":"close-label-audible","description":"Set the audible text for the close button","values":[]},{"name":"target","description":"Set the target attribute for the link","values":[]},{"name":"href","description":"Set the href attribute for the link","values":[]},{"name":"message-text","description":"Set the message text of the Notification Banner","values":[]},{"name":"message","description":"Set the message text of the Notification Banner","values":[]},{"name":"message-elem","values":[]},{"name":"is-service-banner","values":[]}],"description":{"kind":"markdown","value":"# Ids Notification Banner\n\n## Description\n\nThe Notification Banner allows developers to display a message and optionally a link to more information. The user can dismiss the banner or click through the provided link. It sits the top of a page or a widget or inside any parent.\n\nGenerally, notification banners should be highly targeted to a specific user action within the purpose and function of the form or widget they appear in and not for global issues (Server error etc) and should communicate via friendly plain-spoken user oriented microcopy, not system-speak such as numerical error codes or status codes.\n\nTheir scope should be limited to communicating immediately on a user. Multiple notifications banners should be avoided in the same area if possible. Their scope should be limited to communicating on actions taking place within the widget.\n\n## Use Cases\n\nThere are 5 different types of notification banners. Each type has a unique background color and icon.\n\n- `success`\n- `warning`\n- `caution`\n- `info`\n- `error`\n\nYou can import the type `IdsNotificationBannerAlertType` if needed.\n\n## Features (With Code Examples)\n\nA success notification banner with link.\n\n```html\n<ids-notification-banner\n  id=\"ids-notification-banner-0\"\n  message-text=\"DTO rejected by your manager for Sept 30, 2023.\"\n  type=\"success\"\n  link=\"https://infor.com\">\n</ids-notification-banner>\n```\n\nAn info notification banner with custom link text\n\n```html\n<ids-notification-banner\n  id=\"ids-notification-banner-0\"\n  message-text=\"DTO rejected by your manager for Sept 30, 2023.\"\n  type=\"info\"\n  link=\"https://infor.com\"\n  link-text=\"Learn More\">\n</ids-notification-banner>\n```\n\nAn error notification banner with no link\n\n```html\n<ids-notification-banner\n  id=\"ids-notification-banner-0\"\n  message-text=\"DTO rejected by your manager for Sept 30, 2023.\"\n  type=\"error\">\n</ids-notification-banner>\n```\n\nAdd a notification banner dynamically\n\n```js\nconst notificationBanner = new IdsNotificationBanner();\nnotificationBanner.add({\n  id: 'ids-notification-banner-1',\n  parent: 'notification-container',\n  type: 'warning',\n  messageText: 'DTO accepted by your manager for Sept 30, 2023.',\n  link: 'https://infor.com',\n  linkText: 'Learn More'\n});\n```\n\n```html\n<div id=\"notification-banner\"></div>\n```\n\n## Using the Notification Service\n\nA service is provided that allows you to show and hide banner messages and get a count. The API works as follows:\n\n```js\nimport IdsNotificationBannerService from '../ids-notification-banner-service';\n\nIdsNotificationBannerService.show({\n  id: 'ids-notification-banner-1',\n  parent: 'notification-container',\n  type: 'warning',\n  messageText: 'DTO accepted by your manager for Sept 30, 2023.',\n  link: 'https://infor.com',\n  linkText: 'Learn More'\n});\n\nIdsNotificationBannerService.count();\nIdsNotificationBannerService.dismissAll();\nIdsNotificationBannerService.dismissOldest();\nIdsNotificationBannerService.dismissNewest();\n```\n\n## Settings and Attributes\n\n- `close-label-audible` `{string | null}` sets the audible text for the close button in banner\n- `id` `{string | null}` sets the id on the banner\n- `line-clamp` {number} sets number of message text rows to display before truncating\n- `link` {string | null} sets the url for the call to action in the banner\n- `link-text` `{string | null}` sets the custom text on the call to action (if `null` will display \"Click to view\")\n- `message-text` {string} text shown inside the banner\n- `parent` `{string | null}` CSS selector of the parent element (e.g., `#id`, `.class`, `div > p`, `[attribute=value]`)\n- `target` {string} sets the target attribute for the link (_self or _blank, defaults to _blank)\n- `type` {string | IdsNotificationBannerAlertType} can be 1 of 4 types (success, warning, info, error)\n- `wrap` {Boolean} toggles text wrapping for overflowing messages (default is ellipsis)\n\n## Events\n\n- `beforeclose` - Fires when the banner is closed. If you return false in the response you can veto the close\n- `close` - Fires while the banner is closing.\n- `afterclose` - Fires after the banner is closed.\n\n## Handling Link Click Event\n\nTo handle the click event when the link inside the notification banner is clicked, you can use the following code:\n\n```js\ndocument.querySelector('ids-notification-banner').addEventListener('click', (event) => {\n  console.info('Link clicked');\n});\n```\n\n## Methods\n\n### add(notification: IdsNotificationBannerSettings)\n\nShows a notification banner dynamically with the provided settings.\n\n**Parameters:**\n\n- `notification` {IdsNotificationBannerSettings} - Configuration object containing:\n  - `id?` {string} - Optional ID for the banner\n  - `parent?` {string} - CSS selector for parent element\n  - `type` {IdsNotificationBannerAlertType} - Banner type (success, warning, caution, info, error)\n  - `messageText?` {string | null} - Message content\n  - `link?` {string} - URL for the action link\n  - `linkText?` {string} - Custom text for the link\n  - `target?` {'_self' | '_blank'} - Link target attribute\n\n### show(settings?: IdsNotificationBannerSettings)\n\nDisplays the notification banner. If settings are provided, creates a service banner.\n\n**Parameters:**\n\n- `settings?` {IdsNotificationBannerSettings} - Optional configuration object\n\n### dismiss()\n\nRemoves the notification banner from the page. Triggers beforeclose, close, and afterclose events.\n\n## Themeable Parts\n\n- `bgColor` Allows you to further style the background\n- `closeBtn` Allows you to further style the close button\n- `messageText` Allows you to further style the message text\n- `linkText` Allows you to further style the link text\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n\n## Responsive Guidelines\n\n- The notification is 100% wide and will full the parent container by default\n- The message text will be non-breaking and display ellipsis when there is not enough visible space. Use the `line-clamp` attribute to set the number of lines to display before truncating.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Comparable to the inforSlideInDialog in 3.X\n\n**4.x to 5.x**\n\n- The notification component has been renamed to notification-banner\n- If using properties/settings these are now attributes.\n- Markup has changed to a custom element `<ids-message></ids-message>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- The type, alert icon, message text, link and link text are all configurable via properties on the custom element\n- Additionally, user's can define the notification via a JS api, where the `parent` and `id` can be configured"}},{"name":"ids-page-examples","description":{"kind":"markdown","value":"# ids-page-examples\n\nThe section in the demo app shows a series of example ERP pages that are utilizing the components.\n\n## Use cases\n\n- See how components can be used together in a page.\n- Check performance of the components.\n- Have more tests for the components.\n- More integration test examples for the components.\n\n## Examples\n\n- `stacked high density (example index)` shows a 4 column layout with a header and compact input fields. The page uses 4 column layout and the ids-layout-grid component and ids-fieldset and ids-expandable areas.\n\n## Ai prompts used\n\n- Open `index.ts` and ask: Add imports for module nav, image, expandable area, field sets, and all input field\n- Select the example.html and ask: In this section i want to add a ids-header, and a header area that spans the top with an ids-image with a placeholder and two input fields for item next to each other. Then add a expandable area in that have a 4 column ids-layout-grid and in each column a field set with names Code, Miscellaneous, Costs and Quantities and 10 input fields under that\n- Select elements like ids-layout-grid and ask: Can you add the options for the different col breakpoints\n- Select the form and ask: Can you make all the text sentence case\n- Wrap each of these in an ids-layout-cell: Failed did not work\n- How do these work? I want 4 cols but at mobile i want 2 cols `cols-sm=\"2\" cols=\"4\"`: Solved i needed cols-md not just cols and it explained the breakpoints.\n- how can i make this text lighter with the api? `<ids-text font-size=\"16\" type=\"h2\">`: Solved explained the api well\n- On design.infor.com what does it say about using sentence case in labels: Solved it said to use sentence case\n- How does this setting work: label-collapse: Got it wrong its label-state\n- Select an input and change to an ids-dropdown with two items: Solved explained the api well\n- Why id aria-expanded not allowed here according to Axe Dev Tools: Found issue about the role.\n\n"}},{"name":"ids-pager-attributes","description":{"kind":"markdown","value":"# ids-pager\n\nThe IDS Pager Component is used to provide an interface for browsing paginated data, providing methods of navigating and calculating the pages when provided a baseline of attributes.\n\n## Use Cases\n\n- There is a table, grid, document or other listing of data, which is displayed via pagination.\n- Controlling the pagination or keeping track of what is browsed in a data set.\n- Presenting digestible portions of large data sets.\n\n## Slots\n\n`start` and `end` slots allow you to position content to the left or the right side of the pager panel. If no slot is provided, the child-contents of the pager component will be automatically inserted into the middle slot.\n\n## Sub-Components\n\n**`<ids-pager-button>`**: represents a navigation button within the pager that is flagged with an attribute flag specifying what clicking it accomplishes e.g. `first`, `last`, `previous`, or `next`.\n\n**`<ids-pager-number-list>`**: provides a list of page numbered buttons which a user can click.\n\n**`<ids-pager-input>`**: provides a way for user to input numbers directly for the parent `ids-pager`.\n\n## Settings (ids-pager)\n\n- `page-size` {number} number of items to paginate\n- `page-number` {number} 1-based page index. Should reflect what page number is currently being displayed.\n- `total` {number} number of items the pager tracks\n- `disabled` {boolean} whether or not to disable this pager and all navigation buttons nested inside of it\n- `page-sizes` {Array<string>} A list of page sizes to show in the pager dropdown. Note that adding a new array you may need to set the page size or it will be automatically added to the list.\n\n```js\ndocument.querySelector('ids-pager').pageSize = 100\ndocument.querySelector('ids-pager').pageSizes = [100, 200]\n```\n\n## Settings (ids-pager-number-list)\n\n- `disabled` {boolean} whether to override the natural or parent-disabled functionality to specifically disable the number buttons in this component.\n- `label` {string} sets the aria label text\n- `step` {number} sets the number of step for page number list\n\n## Settings (ids-pager-button)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n- `label` {string} sets the aria label text\n\n## Settings (ids-pager-input)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n\n## Themeable Parts (ids-pager)\n\n**container** - the overall `ids-pager` container\n\n## Themeable Parts (ids-pager-button)\n\n**button** - the `ids-button` component\n**icon** - the `ids-icon` component\n\n## Features (with code samples)\n\nA pager with a data set that represents 10 entries per page, with 100 items overall, with basic navigation buttons, and a user input:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"1\">\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with a data set that represents 20 entries per page, with 63 items overall, with basic navigation buttons to go to the next or previous page, and a user input to enter a page number directly:\n```html\n<ids-pager page-size=\"20\" total=\"63\" page-number=\"2\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, surrounded by navigation buttons:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"150\">\n  <section>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-number-list></ids-pager-number-list>\n    <ids-pager-button next></ids-pager-button>\n  </section>\n  <section slot=\"end\">Right-Aligned Content</section>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with custom steps limit:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"2\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with show all step buttons (no-limit):\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"-1\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with aria-label:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button label=\"Previous page\" previous></ids-pager-button>\n  <ids-pager-number-list label=\"Page {num} of {total}\"></ids-pager-number-list>\n  <ids-pager-button label=\"Next page\" next></ids-pager-button>\n</ids-pager>\n```\n\n### Disabling Functionality\n\nA pager with all navigation buttons explicitly disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\" disabled>\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with only the `first` button disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <ids-pager-button first disabled></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\n### With Aligned Sections on the Margins\n\nUser-defined right aligned content:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\nA pager with user-defined content aligned to the left and to the right of the central navigation buttons:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section slot=\"start\">\n    user defined left-aligned content\n  </section>\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\n## Events\n\n- `pagechange` Fires when the current page number changes through any interaction (buttons, direct input, etc.)\n- `pagenext/pagelast/pagefirst/pageprevious` Fires when each respective navigation buttons are clicked\n- `pagesizechange` Fires when the number of items per page is modified via the dropdown\n\n## Keyboard Guidelines\n\n- <kbd>TAB</kbd> Move between `ids-pager-buttons` as well as inputs and `ids-pager-number-list` buttons, and also goes to the next element if at the end of the pager.\n- <kbd>SHIFT + TAB</kbd> should work similar to TAB but in reverse, and also to the previous element if at the beginning of the pager.\n- <kbd>ENTER</kbd> while focusing on the `ids-pager-input` submits the value\n\n## Usage Tips\n\n- the `page-size`, `page-number` and `total` are only useful in the context of the `ids-pager`. They should not be controlled at the level of the interactive buttons or the number list.\n- Content can be laid out for additional buttons/interactions/etc other than the `ids-pager-button`, but the standard navigation and user input components should be used wherever possible.\n- the page count on the pager can be accessed on the `ids-pager` element at any time via the `pageCount` property via JS for example:\n```js\n  const idsElement = document.querySelector('ids-pager');\n  const pageCount = idsElement.pageCount;\n```\n\n## Accessibility\n\n- 1.4.3 Contrast (Minimum) - there should be enough contrast on the background which the wizard resides on in the page.\n\n## Regional Considerations\n\nAll elements will flip to the alternate side in Right To Left mode, including user defined content. Alignment on left and right aligned slots will also flip.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This did not exist as a standalone component\n- Datagrid paging has new options - see data grid docs\n\n**4.x to 5.x**\n\n- Pager is now a web component called ids-pager\n- Only has a standalone version now (simplified)\n- If using properties/settings are now attributes.\n- Markup has changed to a custom element `<ids-pager>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- content is automatically managed/aligned via nesting controls inside of `<ids-pager-section>`\n- pagination is controlled via attributes on the `<ids-pager>` (`page-number`, `total`, `page-size`), and manages buttons and controls automatically.\n- buttons are managed by `<ids-pager-button>` with given functionality flags e.g. `<ids-pager-button start>`.\n- input box can be inserted `<ids-pager-input>`, and a number list with `<ids-pager-number-list>`\n"}},{"name":"ids-pager-button","attributes":[{"name":"default-page-size","values":[]},{"name":"root-node","values":[]},{"name":"button","values":[]},{"name":"icon","values":[]},{"name":"pager","description":"Reference to the pager parent","values":[]},{"name":"page-count","values":[]},{"name":"first","values":[]},{"name":"last","values":[]},{"name":"next","values":[]},{"name":"previous","values":[]},{"name":"disabled","values":[]},{"name":"type","values":[]},{"name":"total","values":[]},{"name":"nav-disabled","values":[]},{"name":"parent-disabled","values":[]},{"name":"page-number","values":[]},{"name":"page-size","values":[]},{"name":"label","description":"Set the aria label text","values":[]}],"description":{"kind":"markdown","value":"# ids-pager\n\nThe IDS Pager Component is used to provide an interface for browsing paginated data, providing methods of navigating and calculating the pages when provided a baseline of attributes.\n\n## Use Cases\n\n- There is a table, grid, document or other listing of data, which is displayed via pagination.\n- Controlling the pagination or keeping track of what is browsed in a data set.\n- Presenting digestible portions of large data sets.\n\n## Slots\n\n`start` and `end` slots allow you to position content to the left or the right side of the pager panel. If no slot is provided, the child-contents of the pager component will be automatically inserted into the middle slot.\n\n## Sub-Components\n\n**`<ids-pager-button>`**: represents a navigation button within the pager that is flagged with an attribute flag specifying what clicking it accomplishes e.g. `first`, `last`, `previous`, or `next`.\n\n**`<ids-pager-number-list>`**: provides a list of page numbered buttons which a user can click.\n\n**`<ids-pager-input>`**: provides a way for user to input numbers directly for the parent `ids-pager`.\n\n## Settings (ids-pager)\n\n- `page-size` {number} number of items to paginate\n- `page-number` {number} 1-based page index. Should reflect what page number is currently being displayed.\n- `total` {number} number of items the pager tracks\n- `disabled` {boolean} whether or not to disable this pager and all navigation buttons nested inside of it\n- `page-sizes` {Array<string>} A list of page sizes to show in the pager dropdown. Note that adding a new array you may need to set the page size or it will be automatically added to the list.\n\n```js\ndocument.querySelector('ids-pager').pageSize = 100\ndocument.querySelector('ids-pager').pageSizes = [100, 200]\n```\n\n## Settings (ids-pager-number-list)\n\n- `disabled` {boolean} whether to override the natural or parent-disabled functionality to specifically disable the number buttons in this component.\n- `label` {string} sets the aria label text\n- `step` {number} sets the number of step for page number list\n\n## Settings (ids-pager-button)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n- `label` {string} sets the aria label text\n\n## Settings (ids-pager-input)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n\n## Themeable Parts (ids-pager)\n\n**container** - the overall `ids-pager` container\n\n## Themeable Parts (ids-pager-button)\n\n**button** - the `ids-button` component\n**icon** - the `ids-icon` component\n\n## Features (with code samples)\n\nA pager with a data set that represents 10 entries per page, with 100 items overall, with basic navigation buttons, and a user input:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"1\">\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with a data set that represents 20 entries per page, with 63 items overall, with basic navigation buttons to go to the next or previous page, and a user input to enter a page number directly:\n```html\n<ids-pager page-size=\"20\" total=\"63\" page-number=\"2\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, surrounded by navigation buttons:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"150\">\n  <section>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-number-list></ids-pager-number-list>\n    <ids-pager-button next></ids-pager-button>\n  </section>\n  <section slot=\"end\">Right-Aligned Content</section>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with custom steps limit:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"2\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with show all step buttons (no-limit):\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"-1\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with aria-label:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button label=\"Previous page\" previous></ids-pager-button>\n  <ids-pager-number-list label=\"Page {num} of {total}\"></ids-pager-number-list>\n  <ids-pager-button label=\"Next page\" next></ids-pager-button>\n</ids-pager>\n```\n\n### Disabling Functionality\n\nA pager with all navigation buttons explicitly disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\" disabled>\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with only the `first` button disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <ids-pager-button first disabled></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\n### With Aligned Sections on the Margins\n\nUser-defined right aligned content:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\nA pager with user-defined content aligned to the left and to the right of the central navigation buttons:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section slot=\"start\">\n    user defined left-aligned content\n  </section>\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\n## Events\n\n- `pagechange` Fires when the current page number changes through any interaction (buttons, direct input, etc.)\n- `pagenext/pagelast/pagefirst/pageprevious` Fires when each respective navigation buttons are clicked\n- `pagesizechange` Fires when the number of items per page is modified via the dropdown\n\n## Keyboard Guidelines\n\n- <kbd>TAB</kbd> Move between `ids-pager-buttons` as well as inputs and `ids-pager-number-list` buttons, and also goes to the next element if at the end of the pager.\n- <kbd>SHIFT + TAB</kbd> should work similar to TAB but in reverse, and also to the previous element if at the beginning of the pager.\n- <kbd>ENTER</kbd> while focusing on the `ids-pager-input` submits the value\n\n## Usage Tips\n\n- the `page-size`, `page-number` and `total` are only useful in the context of the `ids-pager`. They should not be controlled at the level of the interactive buttons or the number list.\n- Content can be laid out for additional buttons/interactions/etc other than the `ids-pager-button`, but the standard navigation and user input components should be used wherever possible.\n- the page count on the pager can be accessed on the `ids-pager` element at any time via the `pageCount` property via JS for example:\n```js\n  const idsElement = document.querySelector('ids-pager');\n  const pageCount = idsElement.pageCount;\n```\n\n## Accessibility\n\n- 1.4.3 Contrast (Minimum) - there should be enough contrast on the background which the wizard resides on in the page.\n\n## Regional Considerations\n\nAll elements will flip to the alternate side in Right To Left mode, including user defined content. Alignment on left and right aligned slots will also flip.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This did not exist as a standalone component\n- Datagrid paging has new options - see data grid docs\n\n**4.x to 5.x**\n\n- Pager is now a web component called ids-pager\n- Only has a standalone version now (simplified)\n- If using properties/settings are now attributes.\n- Markup has changed to a custom element `<ids-pager>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- content is automatically managed/aligned via nesting controls inside of `<ids-pager-section>`\n- pagination is controlled via attributes on the `<ids-pager>` (`page-number`, `total`, `page-size`), and manages buttons and controls automatically.\n- buttons are managed by `<ids-pager-button>` with given functionality flags e.g. `<ids-pager-button start>`.\n- input box can be inserted `<ids-pager-input>`, and a number list with `<ids-pager-number-list>`\n"}},{"name":"ids-pager-dropdown","attributes":[{"name":"root-node","values":[]},{"name":"sizes","values":[]},{"name":"default-page-size","values":[]},{"name":"pager","description":"Reference to the pager parent","values":[]},{"name":"menu-button","description":"Reference to ids-menu-button#pager-size-menu-button","values":[]},{"name":"popup-menu","description":"Reference to ids-popup-menu#pager-size-menu","values":[]},{"name":"on-locale-change","description":"Handle Locale (and language) change","values":[]},{"name":"label","description":"Get the label for the pager-dropdown button","values":[]},{"name":"page-size","description":"Get the page-size attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-pager\n\nThe IDS Pager Component is used to provide an interface for browsing paginated data, providing methods of navigating and calculating the pages when provided a baseline of attributes.\n\n## Use Cases\n\n- There is a table, grid, document or other listing of data, which is displayed via pagination.\n- Controlling the pagination or keeping track of what is browsed in a data set.\n- Presenting digestible portions of large data sets.\n\n## Slots\n\n`start` and `end` slots allow you to position content to the left or the right side of the pager panel. If no slot is provided, the child-contents of the pager component will be automatically inserted into the middle slot.\n\n## Sub-Components\n\n**`<ids-pager-button>`**: represents a navigation button within the pager that is flagged with an attribute flag specifying what clicking it accomplishes e.g. `first`, `last`, `previous`, or `next`.\n\n**`<ids-pager-number-list>`**: provides a list of page numbered buttons which a user can click.\n\n**`<ids-pager-input>`**: provides a way for user to input numbers directly for the parent `ids-pager`.\n\n## Settings (ids-pager)\n\n- `page-size` {number} number of items to paginate\n- `page-number` {number} 1-based page index. Should reflect what page number is currently being displayed.\n- `total` {number} number of items the pager tracks\n- `disabled` {boolean} whether or not to disable this pager and all navigation buttons nested inside of it\n- `page-sizes` {Array<string>} A list of page sizes to show in the pager dropdown. Note that adding a new array you may need to set the page size or it will be automatically added to the list.\n\n```js\ndocument.querySelector('ids-pager').pageSize = 100\ndocument.querySelector('ids-pager').pageSizes = [100, 200]\n```\n\n## Settings (ids-pager-number-list)\n\n- `disabled` {boolean} whether to override the natural or parent-disabled functionality to specifically disable the number buttons in this component.\n- `label` {string} sets the aria label text\n- `step` {number} sets the number of step for page number list\n\n## Settings (ids-pager-button)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n- `label` {string} sets the aria label text\n\n## Settings (ids-pager-input)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n\n## Themeable Parts (ids-pager)\n\n**container** - the overall `ids-pager` container\n\n## Themeable Parts (ids-pager-button)\n\n**button** - the `ids-button` component\n**icon** - the `ids-icon` component\n\n## Features (with code samples)\n\nA pager with a data set that represents 10 entries per page, with 100 items overall, with basic navigation buttons, and a user input:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"1\">\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with a data set that represents 20 entries per page, with 63 items overall, with basic navigation buttons to go to the next or previous page, and a user input to enter a page number directly:\n```html\n<ids-pager page-size=\"20\" total=\"63\" page-number=\"2\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, surrounded by navigation buttons:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"150\">\n  <section>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-number-list></ids-pager-number-list>\n    <ids-pager-button next></ids-pager-button>\n  </section>\n  <section slot=\"end\">Right-Aligned Content</section>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with custom steps limit:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"2\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with show all step buttons (no-limit):\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"-1\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with aria-label:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button label=\"Previous page\" previous></ids-pager-button>\n  <ids-pager-number-list label=\"Page {num} of {total}\"></ids-pager-number-list>\n  <ids-pager-button label=\"Next page\" next></ids-pager-button>\n</ids-pager>\n```\n\n### Disabling Functionality\n\nA pager with all navigation buttons explicitly disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\" disabled>\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with only the `first` button disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <ids-pager-button first disabled></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\n### With Aligned Sections on the Margins\n\nUser-defined right aligned content:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\nA pager with user-defined content aligned to the left and to the right of the central navigation buttons:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section slot=\"start\">\n    user defined left-aligned content\n  </section>\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\n## Events\n\n- `pagechange` Fires when the current page number changes through any interaction (buttons, direct input, etc.)\n- `pagenext/pagelast/pagefirst/pageprevious` Fires when each respective navigation buttons are clicked\n- `pagesizechange` Fires when the number of items per page is modified via the dropdown\n\n## Keyboard Guidelines\n\n- <kbd>TAB</kbd> Move between `ids-pager-buttons` as well as inputs and `ids-pager-number-list` buttons, and also goes to the next element if at the end of the pager.\n- <kbd>SHIFT + TAB</kbd> should work similar to TAB but in reverse, and also to the previous element if at the beginning of the pager.\n- <kbd>ENTER</kbd> while focusing on the `ids-pager-input` submits the value\n\n## Usage Tips\n\n- the `page-size`, `page-number` and `total` are only useful in the context of the `ids-pager`. They should not be controlled at the level of the interactive buttons or the number list.\n- Content can be laid out for additional buttons/interactions/etc other than the `ids-pager-button`, but the standard navigation and user input components should be used wherever possible.\n- the page count on the pager can be accessed on the `ids-pager` element at any time via the `pageCount` property via JS for example:\n```js\n  const idsElement = document.querySelector('ids-pager');\n  const pageCount = idsElement.pageCount;\n```\n\n## Accessibility\n\n- 1.4.3 Contrast (Minimum) - there should be enough contrast on the background which the wizard resides on in the page.\n\n## Regional Considerations\n\nAll elements will flip to the alternate side in Right To Left mode, including user defined content. Alignment on left and right aligned slots will also flip.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This did not exist as a standalone component\n- Datagrid paging has new options - see data grid docs\n\n**4.x to 5.x**\n\n- Pager is now a web component called ids-pager\n- Only has a standalone version now (simplified)\n- If using properties/settings are now attributes.\n- Markup has changed to a custom element `<ids-pager>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- content is automatically managed/aligned via nesting controls inside of `<ids-pager-section>`\n- pagination is controlled via attributes on the `<ids-pager>` (`page-number`, `total`, `page-size`), and manages buttons and controls automatically.\n- buttons are managed by `<ids-pager-button>` with given functionality flags e.g. `<ids-pager-button start>`.\n- input box can be inserted `<ids-pager-input>`, and a number list with `<ids-pager-number-list>`\n"}},{"name":"ids-pager-input","attributes":[{"name":"default-page-size","values":[]},{"name":"root-node","values":[]},{"name":"input","values":[]},{"name":"#input-changed","description":"Track and use to prvent multiple input change events","values":[]},{"name":"on-locale-change","description":"Handle Locale (and language) change","values":[]},{"name":"pager","description":"Reference to the pager parent","values":[]},{"name":"page-size","values":[]},{"name":"page-number","values":[]},{"name":"total","values":[]},{"name":"page-count","values":[]},{"name":"disabled","values":[]},{"name":"parent-disabled","values":[]},{"name":"disabled-overall","values":[]}],"description":{"kind":"markdown","value":"# ids-pager\n\nThe IDS Pager Component is used to provide an interface for browsing paginated data, providing methods of navigating and calculating the pages when provided a baseline of attributes.\n\n## Use Cases\n\n- There is a table, grid, document or other listing of data, which is displayed via pagination.\n- Controlling the pagination or keeping track of what is browsed in a data set.\n- Presenting digestible portions of large data sets.\n\n## Slots\n\n`start` and `end` slots allow you to position content to the left or the right side of the pager panel. If no slot is provided, the child-contents of the pager component will be automatically inserted into the middle slot.\n\n## Sub-Components\n\n**`<ids-pager-button>`**: represents a navigation button within the pager that is flagged with an attribute flag specifying what clicking it accomplishes e.g. `first`, `last`, `previous`, or `next`.\n\n**`<ids-pager-number-list>`**: provides a list of page numbered buttons which a user can click.\n\n**`<ids-pager-input>`**: provides a way for user to input numbers directly for the parent `ids-pager`.\n\n## Settings (ids-pager)\n\n- `page-size` {number} number of items to paginate\n- `page-number` {number} 1-based page index. Should reflect what page number is currently being displayed.\n- `total` {number} number of items the pager tracks\n- `disabled` {boolean} whether or not to disable this pager and all navigation buttons nested inside of it\n- `page-sizes` {Array<string>} A list of page sizes to show in the pager dropdown. Note that adding a new array you may need to set the page size or it will be automatically added to the list.\n\n```js\ndocument.querySelector('ids-pager').pageSize = 100\ndocument.querySelector('ids-pager').pageSizes = [100, 200]\n```\n\n## Settings (ids-pager-number-list)\n\n- `disabled` {boolean} whether to override the natural or parent-disabled functionality to specifically disable the number buttons in this component.\n- `label` {string} sets the aria label text\n- `step` {number} sets the number of step for page number list\n\n## Settings (ids-pager-button)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n- `label` {string} sets the aria label text\n\n## Settings (ids-pager-input)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n\n## Themeable Parts (ids-pager)\n\n**container** - the overall `ids-pager` container\n\n## Themeable Parts (ids-pager-button)\n\n**button** - the `ids-button` component\n**icon** - the `ids-icon` component\n\n## Features (with code samples)\n\nA pager with a data set that represents 10 entries per page, with 100 items overall, with basic navigation buttons, and a user input:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"1\">\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with a data set that represents 20 entries per page, with 63 items overall, with basic navigation buttons to go to the next or previous page, and a user input to enter a page number directly:\n```html\n<ids-pager page-size=\"20\" total=\"63\" page-number=\"2\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, surrounded by navigation buttons:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"150\">\n  <section>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-number-list></ids-pager-number-list>\n    <ids-pager-button next></ids-pager-button>\n  </section>\n  <section slot=\"end\">Right-Aligned Content</section>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with custom steps limit:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"2\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with show all step buttons (no-limit):\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"-1\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with aria-label:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button label=\"Previous page\" previous></ids-pager-button>\n  <ids-pager-number-list label=\"Page {num} of {total}\"></ids-pager-number-list>\n  <ids-pager-button label=\"Next page\" next></ids-pager-button>\n</ids-pager>\n```\n\n### Disabling Functionality\n\nA pager with all navigation buttons explicitly disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\" disabled>\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with only the `first` button disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <ids-pager-button first disabled></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\n### With Aligned Sections on the Margins\n\nUser-defined right aligned content:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\nA pager with user-defined content aligned to the left and to the right of the central navigation buttons:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section slot=\"start\">\n    user defined left-aligned content\n  </section>\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\n## Events\n\n- `pagechange` Fires when the current page number changes through any interaction (buttons, direct input, etc.)\n- `pagenext/pagelast/pagefirst/pageprevious` Fires when each respective navigation buttons are clicked\n- `pagesizechange` Fires when the number of items per page is modified via the dropdown\n\n## Keyboard Guidelines\n\n- <kbd>TAB</kbd> Move between `ids-pager-buttons` as well as inputs and `ids-pager-number-list` buttons, and also goes to the next element if at the end of the pager.\n- <kbd>SHIFT + TAB</kbd> should work similar to TAB but in reverse, and also to the previous element if at the beginning of the pager.\n- <kbd>ENTER</kbd> while focusing on the `ids-pager-input` submits the value\n\n## Usage Tips\n\n- the `page-size`, `page-number` and `total` are only useful in the context of the `ids-pager`. They should not be controlled at the level of the interactive buttons or the number list.\n- Content can be laid out for additional buttons/interactions/etc other than the `ids-pager-button`, but the standard navigation and user input components should be used wherever possible.\n- the page count on the pager can be accessed on the `ids-pager` element at any time via the `pageCount` property via JS for example:\n```js\n  const idsElement = document.querySelector('ids-pager');\n  const pageCount = idsElement.pageCount;\n```\n\n## Accessibility\n\n- 1.4.3 Contrast (Minimum) - there should be enough contrast on the background which the wizard resides on in the page.\n\n## Regional Considerations\n\nAll elements will flip to the alternate side in Right To Left mode, including user defined content. Alignment on left and right aligned slots will also flip.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This did not exist as a standalone component\n- Datagrid paging has new options - see data grid docs\n\n**4.x to 5.x**\n\n- Pager is now a web component called ids-pager\n- Only has a standalone version now (simplified)\n- If using properties/settings are now attributes.\n- Markup has changed to a custom element `<ids-pager>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- content is automatically managed/aligned via nesting controls inside of `<ids-pager-section>`\n- pagination is controlled via attributes on the `<ids-pager>` (`page-number`, `total`, `page-size`), and manages buttons and controls automatically.\n- buttons are managed by `<ids-pager-button>` with given functionality flags e.g. `<ids-pager-button start>`.\n- input box can be inserted `<ids-pager-input>`, and a number list with `<ids-pager-number-list>`\n"}},{"name":"ids-pager-number-list","attributes":[{"name":"default-step","values":[]},{"name":"default-page-size","values":[]},{"name":"root-node","values":[]},{"name":"pager","description":"Reference to the pager parent","values":[]},{"name":"page-size","values":[]},{"name":"page-number","values":[]},{"name":"total","values":[]},{"name":"page-count","values":[]},{"name":"disabled","values":[]},{"name":"parent-disabled","values":[]},{"name":"disabled-overall","values":[]},{"name":"label","description":"Set the aria label text","values":[]},{"name":"step","description":"Set the number of step for page number list","values":[]}],"description":{"kind":"markdown","value":"# ids-pager\n\nThe IDS Pager Component is used to provide an interface for browsing paginated data, providing methods of navigating and calculating the pages when provided a baseline of attributes.\n\n## Use Cases\n\n- There is a table, grid, document or other listing of data, which is displayed via pagination.\n- Controlling the pagination or keeping track of what is browsed in a data set.\n- Presenting digestible portions of large data sets.\n\n## Slots\n\n`start` and `end` slots allow you to position content to the left or the right side of the pager panel. If no slot is provided, the child-contents of the pager component will be automatically inserted into the middle slot.\n\n## Sub-Components\n\n**`<ids-pager-button>`**: represents a navigation button within the pager that is flagged with an attribute flag specifying what clicking it accomplishes e.g. `first`, `last`, `previous`, or `next`.\n\n**`<ids-pager-number-list>`**: provides a list of page numbered buttons which a user can click.\n\n**`<ids-pager-input>`**: provides a way for user to input numbers directly for the parent `ids-pager`.\n\n## Settings (ids-pager)\n\n- `page-size` {number} number of items to paginate\n- `page-number` {number} 1-based page index. Should reflect what page number is currently being displayed.\n- `total` {number} number of items the pager tracks\n- `disabled` {boolean} whether or not to disable this pager and all navigation buttons nested inside of it\n- `page-sizes` {Array<string>} A list of page sizes to show in the pager dropdown. Note that adding a new array you may need to set the page size or it will be automatically added to the list.\n\n```js\ndocument.querySelector('ids-pager').pageSize = 100\ndocument.querySelector('ids-pager').pageSizes = [100, 200]\n```\n\n## Settings (ids-pager-number-list)\n\n- `disabled` {boolean} whether to override the natural or parent-disabled functionality to specifically disable the number buttons in this component.\n- `label` {string} sets the aria label text\n- `step` {number} sets the number of step for page number list\n\n## Settings (ids-pager-button)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n- `label` {string} sets the aria label text\n\n## Settings (ids-pager-input)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n\n## Themeable Parts (ids-pager)\n\n**container** - the overall `ids-pager` container\n\n## Themeable Parts (ids-pager-button)\n\n**button** - the `ids-button` component\n**icon** - the `ids-icon` component\n\n## Features (with code samples)\n\nA pager with a data set that represents 10 entries per page, with 100 items overall, with basic navigation buttons, and a user input:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"1\">\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with a data set that represents 20 entries per page, with 63 items overall, with basic navigation buttons to go to the next or previous page, and a user input to enter a page number directly:\n```html\n<ids-pager page-size=\"20\" total=\"63\" page-number=\"2\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, surrounded by navigation buttons:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"150\">\n  <section>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-number-list></ids-pager-number-list>\n    <ids-pager-button next></ids-pager-button>\n  </section>\n  <section slot=\"end\">Right-Aligned Content</section>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with custom steps limit:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"2\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with show all step buttons (no-limit):\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"-1\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with aria-label:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button label=\"Previous page\" previous></ids-pager-button>\n  <ids-pager-number-list label=\"Page {num} of {total}\"></ids-pager-number-list>\n  <ids-pager-button label=\"Next page\" next></ids-pager-button>\n</ids-pager>\n```\n\n### Disabling Functionality\n\nA pager with all navigation buttons explicitly disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\" disabled>\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with only the `first` button disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <ids-pager-button first disabled></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\n### With Aligned Sections on the Margins\n\nUser-defined right aligned content:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\nA pager with user-defined content aligned to the left and to the right of the central navigation buttons:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section slot=\"start\">\n    user defined left-aligned content\n  </section>\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\n## Events\n\n- `pagechange` Fires when the current page number changes through any interaction (buttons, direct input, etc.)\n- `pagenext/pagelast/pagefirst/pageprevious` Fires when each respective navigation buttons are clicked\n- `pagesizechange` Fires when the number of items per page is modified via the dropdown\n\n## Keyboard Guidelines\n\n- <kbd>TAB</kbd> Move between `ids-pager-buttons` as well as inputs and `ids-pager-number-list` buttons, and also goes to the next element if at the end of the pager.\n- <kbd>SHIFT + TAB</kbd> should work similar to TAB but in reverse, and also to the previous element if at the beginning of the pager.\n- <kbd>ENTER</kbd> while focusing on the `ids-pager-input` submits the value\n\n## Usage Tips\n\n- the `page-size`, `page-number` and `total` are only useful in the context of the `ids-pager`. They should not be controlled at the level of the interactive buttons or the number list.\n- Content can be laid out for additional buttons/interactions/etc other than the `ids-pager-button`, but the standard navigation and user input components should be used wherever possible.\n- the page count on the pager can be accessed on the `ids-pager` element at any time via the `pageCount` property via JS for example:\n```js\n  const idsElement = document.querySelector('ids-pager');\n  const pageCount = idsElement.pageCount;\n```\n\n## Accessibility\n\n- 1.4.3 Contrast (Minimum) - there should be enough contrast on the background which the wizard resides on in the page.\n\n## Regional Considerations\n\nAll elements will flip to the alternate side in Right To Left mode, including user defined content. Alignment on left and right aligned slots will also flip.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This did not exist as a standalone component\n- Datagrid paging has new options - see data grid docs\n\n**4.x to 5.x**\n\n- Pager is now a web component called ids-pager\n- Only has a standalone version now (simplified)\n- If using properties/settings are now attributes.\n- Markup has changed to a custom element `<ids-pager>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- content is automatically managed/aligned via nesting controls inside of `<ids-pager-section>`\n- pagination is controlled via attributes on the `<ids-pager>` (`page-number`, `total`, `page-size`), and manages buttons and controls automatically.\n- buttons are managed by `<ids-pager-button>` with given functionality flags e.g. `<ids-pager-button start>`.\n- input box can be inserted `<ids-pager-input>`, and a number list with `<ids-pager-number-list>`\n"}},{"name":"ids-pager","attributes":[{"name":"default-step","values":[]},{"name":"default-page-size","values":[]},{"name":"sizes","values":[]},{"name":"elements","description":"Gets an object containing references to key elements within the pager component.","values":[]},{"name":"disabled","values":[]},{"name":"page-size","values":[]},{"name":"page-sizes","description":"Gets page sizes","values":[]},{"name":"page-number","values":[]},{"name":"page-count","values":[]},{"name":"step","description":"Set the number of step for page number list","values":[]},{"name":"total","values":[]},{"name":"type","values":[]}],"description":{"kind":"markdown","value":"# ids-pager\n\nThe IDS Pager Component is used to provide an interface for browsing paginated data, providing methods of navigating and calculating the pages when provided a baseline of attributes.\n\n## Use Cases\n\n- There is a table, grid, document or other listing of data, which is displayed via pagination.\n- Controlling the pagination or keeping track of what is browsed in a data set.\n- Presenting digestible portions of large data sets.\n\n## Slots\n\n`start` and `end` slots allow you to position content to the left or the right side of the pager panel. If no slot is provided, the child-contents of the pager component will be automatically inserted into the middle slot.\n\n## Sub-Components\n\n**`<ids-pager-button>`**: represents a navigation button within the pager that is flagged with an attribute flag specifying what clicking it accomplishes e.g. `first`, `last`, `previous`, or `next`.\n\n**`<ids-pager-number-list>`**: provides a list of page numbered buttons which a user can click.\n\n**`<ids-pager-input>`**: provides a way for user to input numbers directly for the parent `ids-pager`.\n\n## Settings (ids-pager)\n\n- `page-size` {number} number of items to paginate\n- `page-number` {number} 1-based page index. Should reflect what page number is currently being displayed.\n- `total` {number} number of items the pager tracks\n- `disabled` {boolean} whether or not to disable this pager and all navigation buttons nested inside of it\n- `page-sizes` {Array<string>} A list of page sizes to show in the pager dropdown. Note that adding a new array you may need to set the page size or it will be automatically added to the list.\n\n```js\ndocument.querySelector('ids-pager').pageSize = 100\ndocument.querySelector('ids-pager').pageSizes = [100, 200]\n```\n\n## Settings (ids-pager-number-list)\n\n- `disabled` {boolean} whether to override the natural or parent-disabled functionality to specifically disable the number buttons in this component.\n- `label` {string} sets the aria label text\n- `step` {number} sets the number of step for page number list\n\n## Settings (ids-pager-button)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n- `label` {string} sets the aria label text\n\n## Settings (ids-pager-input)\n\n- `disabled` {boolean} whether to override natural or parent-disabled functionality to specifically disable this button.\n\n## Themeable Parts (ids-pager)\n\n**container** - the overall `ids-pager` container\n\n## Themeable Parts (ids-pager-button)\n\n**button** - the `ids-button` component\n**icon** - the `ids-icon` component\n\n## Features (with code samples)\n\nA pager with a data set that represents 10 entries per page, with 100 items overall, with basic navigation buttons, and a user input:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"1\">\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with a data set that represents 20 entries per page, with 63 items overall, with basic navigation buttons to go to the next or previous page, and a user input to enter a page number directly:\n```html\n<ids-pager page-size=\"20\" total=\"63\" page-number=\"2\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, surrounded by navigation buttons:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"150\">\n  <section>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-number-list></ids-pager-number-list>\n    <ids-pager-button next></ids-pager-button>\n  </section>\n  <section slot=\"end\">Right-Aligned Content</section>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with custom steps limit:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"2\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with numbered-page-buttons for navigation, with show all step buttons (no-limit):\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"500\">\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-number-list step=\"-1\"></ids-pager-number-list>\n  <ids-pager-button next></ids-pager-button>\n</ids-pager>\n```\n\nA pager with aria-label:\n```html\n<ids-pager page-size=\"20\" page-number=\"10\" total=\"1500\">\n  <ids-pager-button label=\"Previous page\" previous></ids-pager-button>\n  <ids-pager-number-list label=\"Page {num} of {total}\"></ids-pager-number-list>\n  <ids-pager-button label=\"Next page\" next></ids-pager-button>\n</ids-pager>\n```\n\n### Disabling Functionality\n\nA pager with all navigation buttons explicitly disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\" disabled>\n  <ids-pager-button first></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\nA pager with only the `first` button disabled:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <ids-pager-button first disabled></ids-pager-button>\n  <ids-pager-button previous></ids-pager-button>\n  <ids-pager-input></ids-pager-input>\n  <ids-pager-button next></ids-pager-button>\n  <ids-pager-button last></ids-pager-button>\n</ids-pager>\n```\n\n### With Aligned Sections on the Margins\n\nUser-defined right aligned content:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\nA pager with user-defined content aligned to the left and to the right of the central navigation buttons:\n```html\n<ids-pager page-size=\"10\" total=\"100\" page-number=\"2\">\n  <section slot=\"start\">\n    user defined left-aligned content\n  </section>\n  <section>\n    <ids-pager-button first></ids-pager-button>\n    <ids-pager-button previous></ids-pager-button>\n    <ids-pager-input></ids-pager-input>\n    <ids-pager-button next></ids-pager-button>\n    <ids-pager-button last></ids-pager-button>\n  </section>\n  <section slot=\"end\">\n    user defined right-aligned content\n  </section>\n</ids-pager>\n```\n\n## Events\n\n- `pagechange` Fires when the current page number changes through any interaction (buttons, direct input, etc.)\n- `pagenext/pagelast/pagefirst/pageprevious` Fires when each respective navigation buttons are clicked\n- `pagesizechange` Fires when the number of items per page is modified via the dropdown\n\n## Keyboard Guidelines\n\n- <kbd>TAB</kbd> Move between `ids-pager-buttons` as well as inputs and `ids-pager-number-list` buttons, and also goes to the next element if at the end of the pager.\n- <kbd>SHIFT + TAB</kbd> should work similar to TAB but in reverse, and also to the previous element if at the beginning of the pager.\n- <kbd>ENTER</kbd> while focusing on the `ids-pager-input` submits the value\n\n## Usage Tips\n\n- the `page-size`, `page-number` and `total` are only useful in the context of the `ids-pager`. They should not be controlled at the level of the interactive buttons or the number list.\n- Content can be laid out for additional buttons/interactions/etc other than the `ids-pager-button`, but the standard navigation and user input components should be used wherever possible.\n- the page count on the pager can be accessed on the `ids-pager` element at any time via the `pageCount` property via JS for example:\n```js\n  const idsElement = document.querySelector('ids-pager');\n  const pageCount = idsElement.pageCount;\n```\n\n## Accessibility\n\n- 1.4.3 Contrast (Minimum) - there should be enough contrast on the background which the wizard resides on in the page.\n\n## Regional Considerations\n\nAll elements will flip to the alternate side in Right To Left mode, including user defined content. Alignment on left and right aligned slots will also flip.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- This did not exist as a standalone component\n- Datagrid paging has new options - see data grid docs\n\n**4.x to 5.x**\n\n- Pager is now a web component called ids-pager\n- Only has a standalone version now (simplified)\n- If using properties/settings are now attributes.\n- Markup has changed to a custom element `<ids-pager>`\n- If using events events are now plain JS events for example\n- Can now be imported as a single JS file and used with encapsulated styles\n- content is automatically managed/aligned via nesting controls inside of `<ids-pager-section>`\n- pagination is controlled via attributes on the `<ids-pager>` (`page-number`, `total`, `page-size`), and manages buttons and controls automatically.\n- buttons are managed by `<ids-pager-button>` with given functionality flags e.g. `<ids-pager-button start>`.\n- input box can be inserted `<ids-pager-input>`, and a number list with `<ids-pager-number-list>`\n"}},{"name":"ids-personalize","attributes":[{"name":"state","description":"Holds the personalization color","values":[]},{"name":"color-map","description":"Color name to hex value mapping","values":[]},{"name":"color","description":"Get the current primary color","values":[]},{"name":"color-names","description":"Get all available color names","values":[]},{"name":"color-name","description":"Map a legacy Soho color or newer color name to the corresponding hex value.","values":[]},{"name":"use-color-progression","description":"Determine if using the old method of color progression","values":[]}],"description":{"kind":"markdown","value":"# Ids Personalization API\n\n## Description\n\nOur concept of Personalization is changing the primary color for some components. You may want to do this for various reasons to differentiate the screens.\n\n## Use Cases\n\n- When you want to mark an instance of an app with a color. For example for test environments.\n- When you want to add a customer color to the app\n- When you prefer a dark vs light color or are color blind or find the color more pleasing\n\n## Components that Support Personalization\n\nOnly a subset of components support personalization:\n\n- `Headers and Subheaders` - Changes its background color and buttons, search and text and buttons and breadcrumbs in it will be reflected.\n- `Module Tabs` - The tabs and sub tabs and states.\n\n## Recommended Colors\n\nYou can use any color but when following the Ids Color Palette the following background colors would be recommended.\n\n|            | Default  | Orange      | Purple      | Blue      | Green      | Neutral      | Red      | Teal      |\n|------------|----------|-------------|-------------|-----------|------------|--------------|----------|-----------|\n| Hex Value  | `ffffff` | `bb5500`    | `7928e1`    | `0066d4`  | `1f9254`   | `6f6f76`     | `8d0b0e` | `297b7b`  |\n| Token name |          | `orange-90` | `purple-60` | `blue-70` | `green-80` | `neutral-60` | `red-90` | `teal-90` |\n\n## Terminology\n\n- **Personalization**: A broad term to describe changing the look of the applications main color for some top level components\n\n## Features (With Code Examples)\n\nAdd an ids-theme-switcher to the page near the top and set the version and mode properties.\n\n```js\nimport IdsPersonalization from '<path>/ids-personalize';\nconst personalize = new IdsPersonalization();\n\n// Set color by hex value\npersonalize.color = '#800';\n\n// Set color by name\npersonalize.colorName = 'amber';\n\n// Get available color names\nconsole.log(personalize.colorNames);\n\n// See generated colors\nconsole.log(personalize.colorProgression(personalize.color));\n```\n\n## Settings and Attributes\n\n- `color` {string} Get or set the personalization color\n- `colorName` {string} Set the personalization color using a predefined color name, you can use the legacy names or new names here.\n- `colorNames` {string[]} Get array of all available color names\n- `colorProgression` {Record} Displays 10 primary color token values and the text color\n- `useColorProgression` {boolean} Use the old behavior of color progression\n\n## Methods\n\n- `resetToDefault` {void} Removes any previous personalization styles from the page.\n\n## Color Progression Approach (In Doubt as go forward)\n\nFor a period of time we had an approach that used color progression to change the color on a variety of components. When called it changes the primary color tokens with a generated sheet. And updates the text color to one of good contrast. Then a style sheet is appended with the token changes. This is not currently the preferred approach.\n\n```js\nIdsGlobal.personalize.useColorProgression = true\ntrue\nIdsGlobal.personalize.color = '#800'\n```\n\nIf using this approach the following components will also be changed by color progression.\n\n- `Buttons` - The various states.\n- `Tabs` - The tabs and states.\n- `Misc` - Any items that get a primary color will also reflect. This include checkboxes, selection states (some), focus, progress bar but this is subject to change.\n\n## Converting from Previous Versions\n\n- 3.x: This version did not have any personalization\n- 4.x: [Personalization](https://github.com/infor-design/enterprise/tree/main/src/components/personalize) api added\n- 5.x: Personalization api changed to `const pers = new IdsPersonalization();` and only one color is needed, in addition `form area` personalization or `header` area personalization is no longer supported.\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. The New Version of the theme has better color usage than the classic theme.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1.   The New Version of the theme has better contrast than the classic theme. Light and Dark mode pass WCAG AA and High Contrast passes WCAG AAA\n\n## Regional Considerations\n\nAs a point of interest colors can have certain meanings associated with them for countries and cultures. We found this [article on color meaning](https://www.shutterstock.com/blog/color-symbolism-and-meanings-around-the-world) interesting.\n"}},{"name":"ids-pie-chart","attributes":[{"name":"initialized","values":[]},{"name":"svg","values":[]},{"name":"svg-container","values":[]},{"name":"empty-message","values":[]},{"name":"legend","values":[]},{"name":"percents","values":[]},{"name":"totals","values":[]},{"name":"datasource","description":"Reference to datasource API","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"on-locale-change","values":[]},{"name":"on-language-change","values":[]},{"name":"legend-formatter","description":"Set the format on the legend items","values":[]},{"name":"title","description":"Set the chart title element for accessibility","values":[]},{"name":"view-box-size","description":"Viewbox size (square)","values":[]},{"name":"selection-elements","description":"Return chart elements that get selection","values":[]},{"name":"#slice-angles","description":"Hold the angles for each slice","values":[]},{"name":"#tooltip-dot-size","description":"Hold the size for tooltip dot","values":[]},{"name":"#tooltip-dots","description":"Hold the tooltip dots","values":[]},{"name":"donut","description":"Sets the chart to donut chart","values":[]},{"name":"donut-text","description":"Sets the charts middle text","values":[]},{"name":"height","description":"The width of the chart (in pixels) or 'inherit' from the parent","values":[]},{"name":"width","description":"The width of the chart (in pixels) or 'inherit' from the parent","values":[]},{"name":"data","description":"Set the data array of the chart","values":[]},{"name":"colors","description":"Utility function to get the colors series being used in this chart","values":[]},{"name":"animated","description":"Set the animation on/off","values":[]},{"name":"suppress-tooltips","description":"Set the tooltips on/off","values":[]},{"name":"default-selectable","values":[]}],"description":{"kind":"markdown","value":"# ids-pie-chart\n\n## Description\n\nA pie chart (or donut chart) is a circular statistical graphic which is divided into slices to illustrate numerical proportion. In a pie chart, the arc length of each slice is proportional to the quantity it represents.\n\nThe pie chart can be made into a donut chart by setting the `donut` setting. A donut chart is almost identical to a pie chart, but the center is cut out (hence the name `donut`). Donut charts are also used to show proportions of categories that make up the whole, but the center can also be used to display a data label.\n\nYou can control the size of the pie/donut chart by setting the size of the parent element the pie chart lives in. This may include possibly using an inset margin in some cases.\n\nHovering a chart slice with show a tooltip with the slice's value. This data is also shown as a percentage in the legend.\n\n## Use Cases\n\n- Showcasing part-to-whole relationships.\n- Compare any type of content or data that can be broken down into comparative categories Revenue, demographics, market shares, survey results\n- Display different data points that total 100%\n\n## Usage Considerations\n\n- You don’t want to display more than six categories of data or the pie chart can be difficult to read and compare the relative size of slices.\n- If you have a lot of smaller slices this can be difficult to read.\n- Hover tooltips should only be used to reveal additional non-critical information.\n\n## Terminology\n\n- **Slice**: The pieces of the pie in a pie style chart represented by an individual data point\n- **Arcs**: The lengths of the slices in a donut style chart represented by an individual data point\n- **Donut**: The center is cut out on a pie chart too look like a donut\n\n## Features (With Code Examples)\n\nAn pie chart is defined with the custom element. By default it will size to the parent element but a width and height can also be set.\n\n```html\n<ids-pie-chart title=\"A pie chart showing component usage\" id=\"index-example\" suppress-tooltips=\"true\"></ids-pie-chart>\n```\n\nDatasets can be added to the pie chart by passing in an array of objects. Each object must have a `data` and object with `name` and `values` to form the data points. Other information like the `color`, `tooltip` or accessible `pattern` can be provided.\n\n```js\nconst data = [{\n   \"data\": [{\n     \"name\": \"Item A\",\n     \"tooltip\": \"<b>Item A</b> ${percent}%\",\n     \"value\": 10.1,\n     \"pattern\": \"mesh\"\n   },{\n     \"name\": \"Item B\",\n     \"tooltip\": \"<b>Item B</b> ${value}\",\n     \"value\": 12.2,\n     \"pattern\": \"mixed\"\n   }, {\n     \"name\": \"Item C\",\n     \"tooltip\": \"<b>Item C</b> ${value}\",\n     \"value\": 14.35,\n     \"pattern\": \"lines\"\n   }];\n\ndocument.querySelector('ids-pie-chart').data = lineData;\n```\n\nA chart can also be a `donut`. If used provided or `donut-text` for the center. Be consice since there isnt a lot of room.\n\n## Class Hierarchy\n\n- IdsPieChart\n  - IdsElement\n- Mixins\n  IdsChartSelectionMixin\n  IdsChartLegendMixin\n  IdsLocaleMixin\n  IdsEventsMixin\n\n## Data Settings\n\nThe following data attributes can be used on the data passed to a chart. If using typescript the type is `IdsPieChartData`.\n\n- `data` {object} A data group with one or more `name` and `value` pairs.\n- `name` {string} The name for the legend text and tooltip representing the slice.\n- `value` {number} The value of the slice, calculated to a whole of 100% with the other data points.\n- `color` {string} The color of this axis group. This can be either a hex value for example `#FF0000` or a color name like `red` or an ids variable like `var(--ids-color-blue-20)`.\n- `tooltip` {string} The custom tooltip string (as static text). See the tooltip section for more information.\n- `pattern` {string} The name of the pattern to show instead of a solid color. See the pattern section for more information.\n- `patternColor` {string} The color to show for the pattern. This can be either a hex value for example `#FF0000` or a color name like `red` or an ids variable like `var(--ids-color-blue-20)`.\n\n## Settings\n\n- `legendPlacement` {string} By default the legend will be placed to the right of the chart but it can also be set to `bottom` or `top` or `left`.\n- `animated` {boolean} Disable the animation of the chart by setting this to false.\n- `data` {Array} The data points to use as described previously\n- `donut` {boolean} Set to true to make a donut chart.\n- `donutText` {string} The text to showin the middle of the chart. Be consice since there isnt a lot of room.\n- `height` {number} To set the height of the chart to a specific value in pixels.\n- `width` {number} To set the width of the chart to a specific value in pixels.\n- `title` {string} The topic of the chart. This will be used only for accessibility / screen readers and should always be set.\n- `suppress-tooltips` {boolean} Disable the tooltips (they are currently experimental).\n- `legendFormatter` {Function} A function to format the legend text for each data point.\n- `selectable` {boolean} Sets the selection mode.\n\nHere is an example of a pie chart with a legendFormatter.\n\n```js\nchart.legendFormatter = (slice, data) => {\n  return `${slice.name}: ${slice.value}`;\n}\n```\n\n## Patterns\n\nThe pie/donut chart includes patterns that can be used to assist color blind users. To use a pattern specify it on the `pattern` attribute it in the data. You can also set a `patternColor` otherwise it will use the default color for that item in the series.\n\n```js\nconst data: [{\n  \"name\": \"Item C\",\n  \"tooltip\": \"<b>Item C</b> ${value}\",\n  \"value\": 14.35,\n  \"pattern\": \"lines\"\n}, {\n  \"name\": \"Item D\",\n  \"tooltip\": \"<b>Item D</b> ${value}\",\n  \"value\": 15.6,\n  \"pattern\": \"pipes\"\n}];\n```\n\nThe following patterns are supported:\n\n```sh\narrows\nboxes\ncheckers\npatches\ncircles\nexes\ndiamonds\ndots\nstars\nmixed\nsquares\nhex\nbig-hex\nintersect\nlines\nbars\npipes\nmesh\npluses\nwaves\nbig-waves\n```\n\nHowever some look better than others when zoomed. So suggest:\n\n```sh\nmesh\ncircles\nboxes\ndots\nmixed\nlines\npipes\n```\n\n## Tooltip Customizations\n\nYou can customize the tooltip by changing some of the API settings. For just a static tooltip you can use the `tooltip` setting in the data at the same place as the `name` property.\n\nIf you need to change which items get tooltips you can override `tooltipElements` getter.\n\n```js\ntooltipElements() {\n  return this.container.querySelectorAll('circle'); // return the ones that get events\n}\n\nIf you need to change the tooltip contents you can override the `tooltipTemplate` function.\n\n```js\ntooltipTemplate() {\n  return '<b>${label}</b> ${value}';\n}\n```\n\nOr you can modify the tooltip in the slot.\n\n## Events\n\n- `rendered` Fires each time the chart is rendered or rerendered (on resize).\n- `beforeselected` Fires before selected, you can return false in the response to veto.\n- `selected` Fires after selected.\n- `beforedeselected` Fires before deselected, you can return false in the response to veto.\n- `deselected` Fires after deselected.\n\n## Methods\n\n- `rerender` Re render and reanimate the chart.\n- `tooltipData` Override the data for the tooltip.\n- `tooltipTemplate` Override the tooltip markup\n\n## Themeable Parts\n\n- `container` the outer container div element\n- `chart` the svg outer element\n- `circles` each circle element in the chart\n\n## Animation\n\nThe slices animate clockwise with a cubic bezier curve at 600ms.\n\n## States and Variations\n\n- selected (future)\n- disabled (future)\n\n## Keyboard Guidelines\n\nThe legend items are focusable and can be navigated with the tabs keys.\n\n## Responsive Guidelines\n\n- The area chart will fill the size of its parent container and readjust when the window is resized to the parent using css/svg viewbox\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n- The pie chart was added after version 3.6 so new in 4.x\n\n**4.x to 5.x**\n- Pie component has changed to a custom element `<ids-pie-chart></ids-pie-chart>`\n- Donut component has been combined with a setting `<ids-pie-chart donut=\"true\" donut-text=\"Some Test\"></ids-pie-chart>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.\n- Markup is to treat the pie slices as a list `role=\"list\"`. The pie slices are `role=\"listitem\"`. The tab index is not visible to the user as it is not needed and can be navigated with a screen reader.\n- Using voice over the sequence is to\n  - Navigate to the parent element above it  or parent page\n  - Hold <kbd>caps lock + left/right arrow</kbd>\n  - You will hear the title , followed by number of items and then each list item\n  - Proceed to use <kbd>caps lock + left/right arrow</kbd> will move through the list items announcing the values\n- The contrast and actual colors can be a concern for visibility impaired and color blind people. However, you can customize the color by passing higher contrast colors. Or you can add a pattern to the color with the `pattern` attribute.\n\n## Regional Considerations\n\nChart labels should be localized in the current language. The chart will flip in RTL mode. Note that in RTL languages clockwise is the same so the chart slices / arcs are not rotated.  For some color blind users the svg patterns can be used.\n"}},{"name":"ids-picker-popup-common","description":{"kind":"markdown","value":"# ids-popup\n\nThe IDS Popup Component allows for the placement of any HTML content in a fixed/absolute-positioned container anywhere on a page.  The component provides API for setting coordinates, or aligning the container in relation to a \"parent\" element on the page.  Additional API exists for modifying alignment, visibility, and controlling animation.\n\nThis component is a building-block component for many \"placeable\" IDS Components, such as the [Popup Menu](../ids-popup-menu/README.md) and [Modal](../ids-modal/README.md)\n\n## Use Cases\n\n- Placing HTML content using X/Y coordinates\n- Placing HTML content against a target element and using X/Y offsets\n\n## Terminology\n\n### Alignment\n\n**Align Target** Defines an external element that serves as a \"triggering\" element for the Popup.\n**Align Edge** Also called the \"primary alignment\", given two alignment values, the first one is the edge of an Align Target that the Popup will be placed against immediately. For example \"bottom\" will cause the Popup to be aligned at the bottom of the Align Target.\n**Primary Alignment** See \"Align Edge\"\n**Secondary Alignment** Given two alignment values, the secondary alignment is optional, and will cause the Popup to line up the given edge with the Align Target's given edge.  For example, given `top, left`, the secondary alignment will cause the Popup to align primarily to the top of the Align Target, but will also line up both the Popup and the Align Targets' left edges.\n\n### Other\n\n**Arrow** Popups can optionally display arrows that can point to content when used with an Align Target.\n**Arrow Target** The element that a Popup's Arrow will point toward.  This defaults to an Align Target, but can also be defined separately.\n**Bleeds** Determines when Popups are allowed to exist outside their defined Containing Element.  A Popup that does not bleed will remain contained, no matter what coordinates/offsets are provided.\n**Containing Element** Popups are confined to a contained area inside of a page.  This area may be the entire document body,\nan [IDS Container](../ids-container/README.md), or a custom-defined element.  If bleeding is disabled, the Popup will never cross the boundaries of the container.\n**Coordinates** When placed directly in a page (not aligned against an element), a Popup uses its provided x/y values as coordinates as if plotted on a graph.\n**Offsets** When placed against a parent element, a Popup uses its provided x/y values as offsets from the base position detected.\n**Type** Defines the style of Popup that can be used.  There are several different display types, the most common one being `menu`.\n\n## Themeable Parts\n\n- `popup` allows you to further style or adjust the outer popup element\n- `arrow` allows you to adjust the arrow element\n\n## Settings and Attributes\n\n- `align` {string} determines the direction of alignment for the Popup. Can be 'left', 'right', 'top', 'bottom', 'center', or a comma-delimited list.\n- `align-edge` {string} determines which edge of the Popup to align with. Can be 'flip', 'inner', or 'outer'.\n- `align-target` {string|HTMLElement} sets the element to align with via a CSS selector or direct element reference.\n- `align-x` {string} sets the horizontal alignment. Can be 'left', 'center', or 'right'.\n- `align-y` {string} sets the vertical alignment. Can be 'top', 'center', or 'bottom'.\n- `animated` {boolean} enables animation when showing/hiding the Popup.\n- `animation-style` {string} sets the animation style. Can be 'fade', 'scale', or 'slide'.\n- `arrow` {string} specifies whether to show the Popup arrow and in which direction. Can be 'bottom', 'left', 'right', 'top', or 'none'.\n- `arrow-target` {string|HTMLElement} sets the element to align the arrow with via a CSS selector or direct element reference.\n- `bleed` {boolean} if true, allows the Popup to cross the defined containing element boundary.\n- `center-on-overflow `{boolean} if true, centers the Popup when it overflows the screen.\n- `close-on-scroll` {boolean} determines if the Popup should close when scrolling occurs. Default is true. Set to false to keep the Popup open during scrolling.\n- `max-height` {string} sets the maximum height of the Popup.\n- `max-width` {string} sets the maximum width of the Popup.\n- `offset-container` {string} sets a CSS selector for an element to use for offset calculations.\n- `position-style` {string} sets the positioning method. Can be 'absolute' or 'viewport'.\n- `type` {string} sets the Popup type. Can be 'menu', 'tooltip', or 'none'.\n- `visible` {boolean} controls the visibility of the Popup.\n- `wait-for-content` {boolean} if true, waits for dynamic content changes (like Angular *ngIf) before showing the popup. Useful for preventing race conditions with arrow placement.\n- `x` {number} sets the horizontal offset in pixels.\n- `y` {number} sets the vertical offset in pixels.\n\n## Features (with code samples)\n\nCreating a Context-menu style that would open on click might look like the following:\n\n```html\n<ids-popup id=\"my-popup\" x=\"0\" y=\"10\" align=\"top, left\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\nTo create a Popup that appears to align itself against a button, you could do the following:\n\n```html\n<ids-popup id=\"my-popup\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n\n...\n\n<ids-button id=\"my-button\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Using Visibility\n\nDisplay the Popup using the `visible` attribute:\n\n```html\n<ids-popup id=\"my-popup\"  x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" visible=\"true\">\n    <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\nProgrammatically, you can use the `visible` JS property:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.visible = true;\n```\n\n... or explicitly call `show()` or `hide()` methods:\n\n```js\nconst popup = document.querySelector('#my-popup');\nawait popup.show();\n\n// close\nawait popup.hide();\n```\n\nWhen the Popup is visible, it's possible to tell the Popup to re-render its position by using `place()`:\n\n```js\nconst popup = document.querySelector('#my-popup');\nawait popup.place();\n```\n\n### Size\n\nIdsPopup size can be controlled with the `max-height`, `width` and `height` properties.  These are convenience properties that set CSS-friendly size values on the IdsPopup's shadow root container:\n\n```html\n<ids-popup id=\"my-popup\" width=\"100%\" height=\"100%\" max-height=\"550px\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" visible=\"true\">\n    <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\n### Place\n\nThe Popup's coordinates/offsets can be set individually.  The action of using the x/y setters will change the stored position internally, but will not automatically be rendered.  Also, the position will not be rendered if the Popup is not visible.\n\nTo initially set a Popup's position, you can use the following:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.x = 100;\npopup.y = 200;\nawait popup.show();\nawait popup.place();\n```\n\nIt's also possible to set both coordinate values, make the Popup visible, and render the placement in one pass using `setPosition()`:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.setPosition(100, 200, true, true);\n```\n\n### Position Styles\n\nThere are three position styles:\n\n`fixed` - Uses simpler algorithms using `position: fixed;` and ignores container scrolling.\n`absolute` - Uses `position: fixed;` and accounts for container scrolling.\n`viewport` - This ignores the x/y offsets and positions the Popup directly in the middle of the viewport.  This is used for [Modals](../ids-modal/README.md)\n\n### Animation Styles\n\nIf the `animated` property is set, the `animation-styles` available are:\n\n- `fade`: animates in/out using a simple fade transition.\n- `scale-in`: Grows in from the center, shrinks out to the center on top of a simple fade transition. This is used on [Modals](../ids-modal/README.md)\n\n### Using Arrows\n\nSome Popup styles need to \"point\" at their triggering element for context, such as [Tooltips](../ids-tooltip/README.md).  To create a Popup that uses an arrow, simply tell it which way to point:\n\n```html\n<ids-popup id=\"my-popup\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" arrow=\"top\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n<ids-button id=\"my-button\">\n  <span>My Button</span>\n</ids-button>\n```\n\nIn this configuration, if a Popup is given offset value that corresponds to the `alignEdge` is not greater than the size of the Popup, the arrow's placement will be autocorrect to try and stay in alignment with the `arrowTarget`. If the offset value is greater, the arrow will hide automatically.\n\n### Using Bleeds and Containment\n\nPopups can be configured to remain inside of a set boundary element, referred to as a Containing Element.  If defined, the Popup will not cross the boundaries the containing element.  An example of this functionality is the prevention of an [IdsPopupMenu](../ids-popup-menu/README.md) from appearing to be cut off by the browser's edges.\n\nUse of a containing element could be configured in this manner:\n\n```html\n<ids-popup id=\"my-popup\" x=\"0\" y=\"0\" align=\"top, left\">\n  <div slot=\"content\" style=\"width: 100px; height: 100px;\">My Popup</div>\n</ids-popup>\n\n<div id=\"my-container\" style=\"width: 500px; height: 500px;\"></div>\n```\n```js\nconst popup = document.querySelector('#my-popup');\nconst container = document.querySelector('#my-container');\npopup.containingElem = container;\n```\n\nAfter setting the `containingElem` property, setting coordinates will place the Popup in a position that accounts for not crossing the container's edges.  For example:\n\n```js\npopup.x = 500;\n```\n\nGiven this value, the Popup will attempt to set the X coordinate at 500px using the default alignment of `top, left`, which places the left-most edge of the Popup at 500px.  Placing in this position would cross the boundary of the container, so instead the Popup will be nudged back into the containing element entirely, ending up with an X placement around 400px.\n\nIt's also possible to disable the check for bleeding, if necessary:\n\n```js\npopup.bleed = false;\n```\n\nRunning this immediately after our example above will cause the Popup to actually be placed at 500px.\n\nIf we decide to remove containment by the element, we can simply set it back to it's default:\n\n```js\npopup.containingElem = document.querySelector('ids-container');\n```\n\n### Alter placement programmatically\n\nIn some cases, you may want to slightly adjust the values provided by the built-in placement methods.  The `onPlace` callback can be implemented for this purpose:\n\n```js\npopup.onPlace = (popupRect) => {\n  popupRect.x += 100;\n  popupRect.y += 50;\n  return popupRect;\n}\n```\n\nThe `popupRect` argument provides access to the editable [`DOMRect`](https://developer.mozilla.org/en-US/docs/Web/API/DOMRect) object that the IdsPopup uses to place itself.  The callback returns the DOMRect with modified values.\n\nThere is also a `onPlaceEnd` callback that is fired when the placement is complete.  This can be used to perform additional actions after the placement is fully complete.\n\n```js\npopup.onPlaceEnd = (popupRect, popupElem) => {\n  popupElem.arrowTarget.style.backgroundColor = 'red';\n}\n```\n\n#### onXYSwitch callback\n\nWhen using `alignTarget` and offsets, occasionally it may be necessary for a 'top' or 'bottom'-aligned IdsPopup to switch axes and become aligned 'right' or 'left', for the purposes of remaining inside a container area.  After this occurs, an `onXYSwitch` callback is fired with an object containing several parameters.  You can modify this object and return it to provide additional changes to the placement algorithm:\n\n- `x/y`: number values that will be used for offsets\n- `flip`: boolean true if a flip occurs at all\n- `shouldSwitchXY`: boolean true if the flip that occurred also switched the x/y axes\n- `targetEdge`: the original target edge\n- `oppositeEdge`: the edge that will be used in the case of a normal, same-axis flip\n\nFor example, this occurs when [`IdsDatePicker`]('../ids-date-picker/README.md')'s popup flips to align on the X axis, which requires more space away from its target.\n\n#### Keep Open\n\nIdsPopup is programmed to automatically close on outside click events. To keep the popup open until `hide()` is called programmatically, use the `keep-open` setting.\n\n- `keepOpen {boolean}`: Toggle to keep popup open when clicked outside of its container.\n\nFor example, this occurs when [`IdsDatePicker`]('../ids-date-picker/README.md')'s popup flips to align on the X axis, which requires more space away from its target.\n\n## Usage Tips\n\n- When making a Popup that is placed in reference to an adjacent element, it must be placed AFTER it in the DOM. Placing it BEFORE the adjacent element can cause its placement to be incorrect on its first render.\n- When using an `alignTarget`, also using the `arrow` setting and pointing it in the direction of the `alignTarget` can help contextualize the relationship between the two elements.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Place was added in v4.2.2\n- All separate placement/popup logic was replaced with Place internally (not called)\n- Place could be invoked on a custom component with `$('#my-element').place();`\n\n**4.x to 5.x**\n\n- Place is now a custom element `<ids-popup></ids-popup>`\n- This is the new base component to be used for building Popupmenu, Tooltip, Modal, and any other component that requires placement of a absolute/fixed-position element.\n- All options/settings are now attributes: x, y, align, alignX, alignY, alignEdge, alignTarget, animated, visible.\n- Popup is now driven by its own HTMLElement rather than a being a behavior applied to any element: `<ids-popup x=\"0\" y=\"0\" align=\"top, left\">My Popup</ids-popup>`\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-picker-popup","attributes":[{"name":"vetoable-event-types","values":[]},{"name":"visible","values":[]}],"description":{"kind":"markdown","value":"# ids-popup\n\nThe IDS Popup Component allows for the placement of any HTML content in a fixed/absolute-positioned container anywhere on a page.  The component provides API for setting coordinates, or aligning the container in relation to a \"parent\" element on the page.  Additional API exists for modifying alignment, visibility, and controlling animation.\n\nThis component is a building-block component for many \"placeable\" IDS Components, such as the [Popup Menu](../ids-popup-menu/README.md) and [Modal](../ids-modal/README.md)\n\n## Use Cases\n\n- Placing HTML content using X/Y coordinates\n- Placing HTML content against a target element and using X/Y offsets\n\n## Terminology\n\n### Alignment\n\n**Align Target** Defines an external element that serves as a \"triggering\" element for the Popup.\n**Align Edge** Also called the \"primary alignment\", given two alignment values, the first one is the edge of an Align Target that the Popup will be placed against immediately. For example \"bottom\" will cause the Popup to be aligned at the bottom of the Align Target.\n**Primary Alignment** See \"Align Edge\"\n**Secondary Alignment** Given two alignment values, the secondary alignment is optional, and will cause the Popup to line up the given edge with the Align Target's given edge.  For example, given `top, left`, the secondary alignment will cause the Popup to align primarily to the top of the Align Target, but will also line up both the Popup and the Align Targets' left edges.\n\n### Other\n\n**Arrow** Popups can optionally display arrows that can point to content when used with an Align Target.\n**Arrow Target** The element that a Popup's Arrow will point toward.  This defaults to an Align Target, but can also be defined separately.\n**Bleeds** Determines when Popups are allowed to exist outside their defined Containing Element.  A Popup that does not bleed will remain contained, no matter what coordinates/offsets are provided.\n**Containing Element** Popups are confined to a contained area inside of a page.  This area may be the entire document body,\nan [IDS Container](../ids-container/README.md), or a custom-defined element.  If bleeding is disabled, the Popup will never cross the boundaries of the container.\n**Coordinates** When placed directly in a page (not aligned against an element), a Popup uses its provided x/y values as coordinates as if plotted on a graph.\n**Offsets** When placed against a parent element, a Popup uses its provided x/y values as offsets from the base position detected.\n**Type** Defines the style of Popup that can be used.  There are several different display types, the most common one being `menu`.\n\n## Themeable Parts\n\n- `popup` allows you to further style or adjust the outer popup element\n- `arrow` allows you to adjust the arrow element\n\n## Settings and Attributes\n\n- `align` {string} determines the direction of alignment for the Popup. Can be 'left', 'right', 'top', 'bottom', 'center', or a comma-delimited list.\n- `align-edge` {string} determines which edge of the Popup to align with. Can be 'flip', 'inner', or 'outer'.\n- `align-target` {string|HTMLElement} sets the element to align with via a CSS selector or direct element reference.\n- `align-x` {string} sets the horizontal alignment. Can be 'left', 'center', or 'right'.\n- `align-y` {string} sets the vertical alignment. Can be 'top', 'center', or 'bottom'.\n- `animated` {boolean} enables animation when showing/hiding the Popup.\n- `animation-style` {string} sets the animation style. Can be 'fade', 'scale', or 'slide'.\n- `arrow` {string} specifies whether to show the Popup arrow and in which direction. Can be 'bottom', 'left', 'right', 'top', or 'none'.\n- `arrow-target` {string|HTMLElement} sets the element to align the arrow with via a CSS selector or direct element reference.\n- `bleed` {boolean} if true, allows the Popup to cross the defined containing element boundary.\n- `center-on-overflow `{boolean} if true, centers the Popup when it overflows the screen.\n- `close-on-scroll` {boolean} determines if the Popup should close when scrolling occurs. Default is true. Set to false to keep the Popup open during scrolling.\n- `max-height` {string} sets the maximum height of the Popup.\n- `max-width` {string} sets the maximum width of the Popup.\n- `offset-container` {string} sets a CSS selector for an element to use for offset calculations.\n- `position-style` {string} sets the positioning method. Can be 'absolute' or 'viewport'.\n- `type` {string} sets the Popup type. Can be 'menu', 'tooltip', or 'none'.\n- `visible` {boolean} controls the visibility of the Popup.\n- `wait-for-content` {boolean} if true, waits for dynamic content changes (like Angular *ngIf) before showing the popup. Useful for preventing race conditions with arrow placement.\n- `x` {number} sets the horizontal offset in pixels.\n- `y` {number} sets the vertical offset in pixels.\n\n## Features (with code samples)\n\nCreating a Context-menu style that would open on click might look like the following:\n\n```html\n<ids-popup id=\"my-popup\" x=\"0\" y=\"10\" align=\"top, left\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\nTo create a Popup that appears to align itself against a button, you could do the following:\n\n```html\n<ids-popup id=\"my-popup\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n\n...\n\n<ids-button id=\"my-button\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Using Visibility\n\nDisplay the Popup using the `visible` attribute:\n\n```html\n<ids-popup id=\"my-popup\"  x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" visible=\"true\">\n    <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\nProgrammatically, you can use the `visible` JS property:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.visible = true;\n```\n\n... or explicitly call `show()` or `hide()` methods:\n\n```js\nconst popup = document.querySelector('#my-popup');\nawait popup.show();\n\n// close\nawait popup.hide();\n```\n\nWhen the Popup is visible, it's possible to tell the Popup to re-render its position by using `place()`:\n\n```js\nconst popup = document.querySelector('#my-popup');\nawait popup.place();\n```\n\n### Size\n\nIdsPopup size can be controlled with the `max-height`, `width` and `height` properties.  These are convenience properties that set CSS-friendly size values on the IdsPopup's shadow root container:\n\n```html\n<ids-popup id=\"my-popup\" width=\"100%\" height=\"100%\" max-height=\"550px\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" visible=\"true\">\n    <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\n### Place\n\nThe Popup's coordinates/offsets can be set individually.  The action of using the x/y setters will change the stored position internally, but will not automatically be rendered.  Also, the position will not be rendered if the Popup is not visible.\n\nTo initially set a Popup's position, you can use the following:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.x = 100;\npopup.y = 200;\nawait popup.show();\nawait popup.place();\n```\n\nIt's also possible to set both coordinate values, make the Popup visible, and render the placement in one pass using `setPosition()`:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.setPosition(100, 200, true, true);\n```\n\n### Position Styles\n\nThere are three position styles:\n\n`fixed` - Uses simpler algorithms using `position: fixed;` and ignores container scrolling.\n`absolute` - Uses `position: fixed;` and accounts for container scrolling.\n`viewport` - This ignores the x/y offsets and positions the Popup directly in the middle of the viewport.  This is used for [Modals](../ids-modal/README.md)\n\n### Animation Styles\n\nIf the `animated` property is set, the `animation-styles` available are:\n\n- `fade`: animates in/out using a simple fade transition.\n- `scale-in`: Grows in from the center, shrinks out to the center on top of a simple fade transition. This is used on [Modals](../ids-modal/README.md)\n\n### Using Arrows\n\nSome Popup styles need to \"point\" at their triggering element for context, such as [Tooltips](../ids-tooltip/README.md).  To create a Popup that uses an arrow, simply tell it which way to point:\n\n```html\n<ids-popup id=\"my-popup\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" arrow=\"top\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n<ids-button id=\"my-button\">\n  <span>My Button</span>\n</ids-button>\n```\n\nIn this configuration, if a Popup is given offset value that corresponds to the `alignEdge` is not greater than the size of the Popup, the arrow's placement will be autocorrect to try and stay in alignment with the `arrowTarget`. If the offset value is greater, the arrow will hide automatically.\n\n### Using Bleeds and Containment\n\nPopups can be configured to remain inside of a set boundary element, referred to as a Containing Element.  If defined, the Popup will not cross the boundaries the containing element.  An example of this functionality is the prevention of an [IdsPopupMenu](../ids-popup-menu/README.md) from appearing to be cut off by the browser's edges.\n\nUse of a containing element could be configured in this manner:\n\n```html\n<ids-popup id=\"my-popup\" x=\"0\" y=\"0\" align=\"top, left\">\n  <div slot=\"content\" style=\"width: 100px; height: 100px;\">My Popup</div>\n</ids-popup>\n\n<div id=\"my-container\" style=\"width: 500px; height: 500px;\"></div>\n```\n```js\nconst popup = document.querySelector('#my-popup');\nconst container = document.querySelector('#my-container');\npopup.containingElem = container;\n```\n\nAfter setting the `containingElem` property, setting coordinates will place the Popup in a position that accounts for not crossing the container's edges.  For example:\n\n```js\npopup.x = 500;\n```\n\nGiven this value, the Popup will attempt to set the X coordinate at 500px using the default alignment of `top, left`, which places the left-most edge of the Popup at 500px.  Placing in this position would cross the boundary of the container, so instead the Popup will be nudged back into the containing element entirely, ending up with an X placement around 400px.\n\nIt's also possible to disable the check for bleeding, if necessary:\n\n```js\npopup.bleed = false;\n```\n\nRunning this immediately after our example above will cause the Popup to actually be placed at 500px.\n\nIf we decide to remove containment by the element, we can simply set it back to it's default:\n\n```js\npopup.containingElem = document.querySelector('ids-container');\n```\n\n### Alter placement programmatically\n\nIn some cases, you may want to slightly adjust the values provided by the built-in placement methods.  The `onPlace` callback can be implemented for this purpose:\n\n```js\npopup.onPlace = (popupRect) => {\n  popupRect.x += 100;\n  popupRect.y += 50;\n  return popupRect;\n}\n```\n\nThe `popupRect` argument provides access to the editable [`DOMRect`](https://developer.mozilla.org/en-US/docs/Web/API/DOMRect) object that the IdsPopup uses to place itself.  The callback returns the DOMRect with modified values.\n\nThere is also a `onPlaceEnd` callback that is fired when the placement is complete.  This can be used to perform additional actions after the placement is fully complete.\n\n```js\npopup.onPlaceEnd = (popupRect, popupElem) => {\n  popupElem.arrowTarget.style.backgroundColor = 'red';\n}\n```\n\n#### onXYSwitch callback\n\nWhen using `alignTarget` and offsets, occasionally it may be necessary for a 'top' or 'bottom'-aligned IdsPopup to switch axes and become aligned 'right' or 'left', for the purposes of remaining inside a container area.  After this occurs, an `onXYSwitch` callback is fired with an object containing several parameters.  You can modify this object and return it to provide additional changes to the placement algorithm:\n\n- `x/y`: number values that will be used for offsets\n- `flip`: boolean true if a flip occurs at all\n- `shouldSwitchXY`: boolean true if the flip that occurred also switched the x/y axes\n- `targetEdge`: the original target edge\n- `oppositeEdge`: the edge that will be used in the case of a normal, same-axis flip\n\nFor example, this occurs when [`IdsDatePicker`]('../ids-date-picker/README.md')'s popup flips to align on the X axis, which requires more space away from its target.\n\n#### Keep Open\n\nIdsPopup is programmed to automatically close on outside click events. To keep the popup open until `hide()` is called programmatically, use the `keep-open` setting.\n\n- `keepOpen {boolean}`: Toggle to keep popup open when clicked outside of its container.\n\nFor example, this occurs when [`IdsDatePicker`]('../ids-date-picker/README.md')'s popup flips to align on the X axis, which requires more space away from its target.\n\n## Usage Tips\n\n- When making a Popup that is placed in reference to an adjacent element, it must be placed AFTER it in the DOM. Placing it BEFORE the adjacent element can cause its placement to be incorrect on its first render.\n- When using an `alignTarget`, also using the `arrow` setting and pointing it in the direction of the `alignTarget` can help contextualize the relationship between the two elements.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Place was added in v4.2.2\n- All separate placement/popup logic was replaced with Place internally (not called)\n- Place could be invoked on a custom component with `$('#my-element').place();`\n\n**4.x to 5.x**\n\n- Place is now a custom element `<ids-popup></ids-popup>`\n- This is the new base component to be used for building Popupmenu, Tooltip, Modal, and any other component that requires placement of a absolute/fixed-position element.\n- All options/settings are now attributes: x, y, align, alignX, alignY, alignEdge, alignTarget, animated, visible.\n- Popup is now driven by its own HTMLElement rather than a being a behavior applied to any element: `<ids-popup x=\"0\" y=\"0\" align=\"top, left\">My Popup</ids-popup>`\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-popup-attributes","description":{"kind":"markdown","value":"# ids-popup\n\nThe IDS Popup Component allows for the placement of any HTML content in a fixed/absolute-positioned container anywhere on a page.  The component provides API for setting coordinates, or aligning the container in relation to a \"parent\" element on the page.  Additional API exists for modifying alignment, visibility, and controlling animation.\n\nThis component is a building-block component for many \"placeable\" IDS Components, such as the [Popup Menu](../ids-popup-menu/README.md) and [Modal](../ids-modal/README.md)\n\n## Use Cases\n\n- Placing HTML content using X/Y coordinates\n- Placing HTML content against a target element and using X/Y offsets\n\n## Terminology\n\n### Alignment\n\n**Align Target** Defines an external element that serves as a \"triggering\" element for the Popup.\n**Align Edge** Also called the \"primary alignment\", given two alignment values, the first one is the edge of an Align Target that the Popup will be placed against immediately. For example \"bottom\" will cause the Popup to be aligned at the bottom of the Align Target.\n**Primary Alignment** See \"Align Edge\"\n**Secondary Alignment** Given two alignment values, the secondary alignment is optional, and will cause the Popup to line up the given edge with the Align Target's given edge.  For example, given `top, left`, the secondary alignment will cause the Popup to align primarily to the top of the Align Target, but will also line up both the Popup and the Align Targets' left edges.\n\n### Other\n\n**Arrow** Popups can optionally display arrows that can point to content when used with an Align Target.\n**Arrow Target** The element that a Popup's Arrow will point toward.  This defaults to an Align Target, but can also be defined separately.\n**Bleeds** Determines when Popups are allowed to exist outside their defined Containing Element.  A Popup that does not bleed will remain contained, no matter what coordinates/offsets are provided.\n**Containing Element** Popups are confined to a contained area inside of a page.  This area may be the entire document body,\nan [IDS Container](../ids-container/README.md), or a custom-defined element.  If bleeding is disabled, the Popup will never cross the boundaries of the container.\n**Coordinates** When placed directly in a page (not aligned against an element), a Popup uses its provided x/y values as coordinates as if plotted on a graph.\n**Offsets** When placed against a parent element, a Popup uses its provided x/y values as offsets from the base position detected.\n**Type** Defines the style of Popup that can be used.  There are several different display types, the most common one being `menu`.\n\n## Themeable Parts\n\n- `popup` allows you to further style or adjust the outer popup element\n- `arrow` allows you to adjust the arrow element\n\n## Settings and Attributes\n\n- `align` {string} determines the direction of alignment for the Popup. Can be 'left', 'right', 'top', 'bottom', 'center', or a comma-delimited list.\n- `align-edge` {string} determines which edge of the Popup to align with. Can be 'flip', 'inner', or 'outer'.\n- `align-target` {string|HTMLElement} sets the element to align with via a CSS selector or direct element reference.\n- `align-x` {string} sets the horizontal alignment. Can be 'left', 'center', or 'right'.\n- `align-y` {string} sets the vertical alignment. Can be 'top', 'center', or 'bottom'.\n- `animated` {boolean} enables animation when showing/hiding the Popup.\n- `animation-style` {string} sets the animation style. Can be 'fade', 'scale', or 'slide'.\n- `arrow` {string} specifies whether to show the Popup arrow and in which direction. Can be 'bottom', 'left', 'right', 'top', or 'none'.\n- `arrow-target` {string|HTMLElement} sets the element to align the arrow with via a CSS selector or direct element reference.\n- `bleed` {boolean} if true, allows the Popup to cross the defined containing element boundary.\n- `center-on-overflow `{boolean} if true, centers the Popup when it overflows the screen.\n- `close-on-scroll` {boolean} determines if the Popup should close when scrolling occurs. Default is true. Set to false to keep the Popup open during scrolling.\n- `max-height` {string} sets the maximum height of the Popup.\n- `max-width` {string} sets the maximum width of the Popup.\n- `offset-container` {string} sets a CSS selector for an element to use for offset calculations.\n- `position-style` {string} sets the positioning method. Can be 'absolute' or 'viewport'.\n- `type` {string} sets the Popup type. Can be 'menu', 'tooltip', or 'none'.\n- `visible` {boolean} controls the visibility of the Popup.\n- `wait-for-content` {boolean} if true, waits for dynamic content changes (like Angular *ngIf) before showing the popup. Useful for preventing race conditions with arrow placement.\n- `x` {number} sets the horizontal offset in pixels.\n- `y` {number} sets the vertical offset in pixels.\n\n## Features (with code samples)\n\nCreating a Context-menu style that would open on click might look like the following:\n\n```html\n<ids-popup id=\"my-popup\" x=\"0\" y=\"10\" align=\"top, left\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\nTo create a Popup that appears to align itself against a button, you could do the following:\n\n```html\n<ids-popup id=\"my-popup\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n\n...\n\n<ids-button id=\"my-button\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Using Visibility\n\nDisplay the Popup using the `visible` attribute:\n\n```html\n<ids-popup id=\"my-popup\"  x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" visible=\"true\">\n    <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\nProgrammatically, you can use the `visible` JS property:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.visible = true;\n```\n\n... or explicitly call `show()` or `hide()` methods:\n\n```js\nconst popup = document.querySelector('#my-popup');\nawait popup.show();\n\n// close\nawait popup.hide();\n```\n\nWhen the Popup is visible, it's possible to tell the Popup to re-render its position by using `place()`:\n\n```js\nconst popup = document.querySelector('#my-popup');\nawait popup.place();\n```\n\n### Size\n\nIdsPopup size can be controlled with the `max-height`, `width` and `height` properties.  These are convenience properties that set CSS-friendly size values on the IdsPopup's shadow root container:\n\n```html\n<ids-popup id=\"my-popup\" width=\"100%\" height=\"100%\" max-height=\"550px\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" visible=\"true\">\n    <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\n### Place\n\nThe Popup's coordinates/offsets can be set individually.  The action of using the x/y setters will change the stored position internally, but will not automatically be rendered.  Also, the position will not be rendered if the Popup is not visible.\n\nTo initially set a Popup's position, you can use the following:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.x = 100;\npopup.y = 200;\nawait popup.show();\nawait popup.place();\n```\n\nIt's also possible to set both coordinate values, make the Popup visible, and render the placement in one pass using `setPosition()`:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.setPosition(100, 200, true, true);\n```\n\n### Position Styles\n\nThere are three position styles:\n\n`fixed` - Uses simpler algorithms using `position: fixed;` and ignores container scrolling.\n`absolute` - Uses `position: fixed;` and accounts for container scrolling.\n`viewport` - This ignores the x/y offsets and positions the Popup directly in the middle of the viewport.  This is used for [Modals](../ids-modal/README.md)\n\n### Animation Styles\n\nIf the `animated` property is set, the `animation-styles` available are:\n\n- `fade`: animates in/out using a simple fade transition.\n- `scale-in`: Grows in from the center, shrinks out to the center on top of a simple fade transition. This is used on [Modals](../ids-modal/README.md)\n\n### Using Arrows\n\nSome Popup styles need to \"point\" at their triggering element for context, such as [Tooltips](../ids-tooltip/README.md).  To create a Popup that uses an arrow, simply tell it which way to point:\n\n```html\n<ids-popup id=\"my-popup\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" arrow=\"top\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n<ids-button id=\"my-button\">\n  <span>My Button</span>\n</ids-button>\n```\n\nIn this configuration, if a Popup is given offset value that corresponds to the `alignEdge` is not greater than the size of the Popup, the arrow's placement will be autocorrect to try and stay in alignment with the `arrowTarget`. If the offset value is greater, the arrow will hide automatically.\n\n### Using Bleeds and Containment\n\nPopups can be configured to remain inside of a set boundary element, referred to as a Containing Element.  If defined, the Popup will not cross the boundaries the containing element.  An example of this functionality is the prevention of an [IdsPopupMenu](../ids-popup-menu/README.md) from appearing to be cut off by the browser's edges.\n\nUse of a containing element could be configured in this manner:\n\n```html\n<ids-popup id=\"my-popup\" x=\"0\" y=\"0\" align=\"top, left\">\n  <div slot=\"content\" style=\"width: 100px; height: 100px;\">My Popup</div>\n</ids-popup>\n\n<div id=\"my-container\" style=\"width: 500px; height: 500px;\"></div>\n```\n```js\nconst popup = document.querySelector('#my-popup');\nconst container = document.querySelector('#my-container');\npopup.containingElem = container;\n```\n\nAfter setting the `containingElem` property, setting coordinates will place the Popup in a position that accounts for not crossing the container's edges.  For example:\n\n```js\npopup.x = 500;\n```\n\nGiven this value, the Popup will attempt to set the X coordinate at 500px using the default alignment of `top, left`, which places the left-most edge of the Popup at 500px.  Placing in this position would cross the boundary of the container, so instead the Popup will be nudged back into the containing element entirely, ending up with an X placement around 400px.\n\nIt's also possible to disable the check for bleeding, if necessary:\n\n```js\npopup.bleed = false;\n```\n\nRunning this immediately after our example above will cause the Popup to actually be placed at 500px.\n\nIf we decide to remove containment by the element, we can simply set it back to it's default:\n\n```js\npopup.containingElem = document.querySelector('ids-container');\n```\n\n### Alter placement programmatically\n\nIn some cases, you may want to slightly adjust the values provided by the built-in placement methods.  The `onPlace` callback can be implemented for this purpose:\n\n```js\npopup.onPlace = (popupRect) => {\n  popupRect.x += 100;\n  popupRect.y += 50;\n  return popupRect;\n}\n```\n\nThe `popupRect` argument provides access to the editable [`DOMRect`](https://developer.mozilla.org/en-US/docs/Web/API/DOMRect) object that the IdsPopup uses to place itself.  The callback returns the DOMRect with modified values.\n\nThere is also a `onPlaceEnd` callback that is fired when the placement is complete.  This can be used to perform additional actions after the placement is fully complete.\n\n```js\npopup.onPlaceEnd = (popupRect, popupElem) => {\n  popupElem.arrowTarget.style.backgroundColor = 'red';\n}\n```\n\n#### onXYSwitch callback\n\nWhen using `alignTarget` and offsets, occasionally it may be necessary for a 'top' or 'bottom'-aligned IdsPopup to switch axes and become aligned 'right' or 'left', for the purposes of remaining inside a container area.  After this occurs, an `onXYSwitch` callback is fired with an object containing several parameters.  You can modify this object and return it to provide additional changes to the placement algorithm:\n\n- `x/y`: number values that will be used for offsets\n- `flip`: boolean true if a flip occurs at all\n- `shouldSwitchXY`: boolean true if the flip that occurred also switched the x/y axes\n- `targetEdge`: the original target edge\n- `oppositeEdge`: the edge that will be used in the case of a normal, same-axis flip\n\nFor example, this occurs when [`IdsDatePicker`]('../ids-date-picker/README.md')'s popup flips to align on the X axis, which requires more space away from its target.\n\n#### Keep Open\n\nIdsPopup is programmed to automatically close on outside click events. To keep the popup open until `hide()` is called programmatically, use the `keep-open` setting.\n\n- `keepOpen {boolean}`: Toggle to keep popup open when clicked outside of its container.\n\nFor example, this occurs when [`IdsDatePicker`]('../ids-date-picker/README.md')'s popup flips to align on the X axis, which requires more space away from its target.\n\n## Usage Tips\n\n- When making a Popup that is placed in reference to an adjacent element, it must be placed AFTER it in the DOM. Placing it BEFORE the adjacent element can cause its placement to be incorrect on its first render.\n- When using an `alignTarget`, also using the `arrow` setting and pointing it in the direction of the `alignTarget` can help contextualize the relationship between the two elements.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Place was added in v4.2.2\n- All separate placement/popup logic was replaced with Place internally (not called)\n- Place could be invoked on a custom component with `$('#my-element').place();`\n\n**4.x to 5.x**\n\n- Place is now a custom element `<ids-popup></ids-popup>`\n- This is the new base component to be used for building Popupmenu, Tooltip, Modal, and any other component that requires placement of a absolute/fixed-position element.\n- All options/settings are now attributes: x, y, align, alignX, alignY, alignEdge, alignTarget, animated, visible.\n- Popup is now driven by its own HTMLElement rather than a being a behavior applied to any element: `<ids-popup x=\"0\" y=\"0\" align=\"top, left\">My Popup</ids-popup>`\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-popup","attributes":[{"name":"should-update","values":[]},{"name":"scroll-parent-elem","values":[]},{"name":"use-right","values":[]},{"name":"#mo","description":"Watches for changes","values":[]},{"name":"#content-observer","description":"Watches for changes when visibility set to true and wait-for-content is set to true","values":[]},{"name":"#ro","description":"Watches for resizing that occurs whenever the page changes dimensions, and re-applies some\ncoordinate-specific values to the Popup's inner container.","values":[]},{"name":"inner-rect","description":"Get measurements of the inner \".ids-popup\" <div>","values":[]},{"name":"wrapper","description":"Get reference to the `content-wrapper` element","values":[]},{"name":"#align-target","values":[]},{"name":"align-target","description":"Sets the element to align with via a css selector","values":[]},{"name":"#align","values":[]},{"name":"align","values":[]},{"name":"#align-x","values":[]},{"name":"align-x","description":"Strategy for the parent X alignment (see the ALIGNMENTS_X array)","values":[]},{"name":"#align-y","values":[]},{"name":"align-y","values":[]},{"name":"#align-edge","values":[]},{"name":"#target-align-edge","description":"Updates when the popup changing its primary align edge","values":[]},{"name":"align-edge","description":"Specifies the edge of the parent element to be placed adjacent,\nin configurations where a relative placement occurs","values":[]},{"name":"opposite-align-edge","description":"Get the opposite edge of the currently-defined `alignEdge` property","values":[]},{"name":"max-height","description":"Set the max height value","values":[]},{"name":"keep-open","description":"Get whether the popup should remain open when clicking outside","values":[]},{"name":"animated","description":"Whether or not the component should animate its movement","values":[]},{"name":"animation-style","values":[]},{"name":"offset-container","description":"Get the offset container CSS selector","values":[]},{"name":"#bleed","values":[]},{"name":"bleed","values":[]},{"name":"#bleed-x","values":[]},{"name":"bleed-x","values":[]},{"name":"#bleed-y","values":[]},{"name":"bleed-y","values":[]},{"name":"#containing-elem","values":[]},{"name":"containing-elem","values":[]},{"name":"#arrow","values":[]},{"name":"arrow","description":"Specifies whether to show the Popup Arrow, and in which direction.\nThe direction is in relation to the alignment setting. So for example of you align: top\nyou want arrow: top as well.","values":[]},{"name":"center-on-overflow","description":"Get whether popup should center itself when it overflows the screen","values":[]},{"name":"close-on-scroll","description":"Get whether the popup should close on document scroll","values":[]},{"name":"arrow-el","description":"Get reference to the internal arrow element","values":[]},{"name":"#arrow-target","values":[]},{"name":"arrow-target","description":"Sets the element to align with via a css selector","values":[]},{"name":"#position-style","values":[]},{"name":"position-style","values":[]},{"name":"#type","values":[]},{"name":"type","values":[]},{"name":"open","values":[]},{"name":"#visible","values":[]},{"name":"visible","description":"Get whether the component should be displayed","values":[]},{"name":"wait-for-content","description":"Get whether to wait for dynamic content before showing popup","values":[]},{"name":"#x","values":[]},{"name":"x","description":"Get the X coordinate","values":[]},{"name":"#y","values":[]},{"name":"y","description":"Get the Y coordinate","values":[]},{"name":"height","description":"Get the popup height","values":[]},{"name":"width","description":"Get the popup width","values":[]},{"name":"round","description":"Get whether the popup has rounded corners","values":[]}],"description":{"kind":"markdown","value":"# ids-popup\n\nThe IDS Popup Component allows for the placement of any HTML content in a fixed/absolute-positioned container anywhere on a page.  The component provides API for setting coordinates, or aligning the container in relation to a \"parent\" element on the page.  Additional API exists for modifying alignment, visibility, and controlling animation.\n\nThis component is a building-block component for many \"placeable\" IDS Components, such as the [Popup Menu](../ids-popup-menu/README.md) and [Modal](../ids-modal/README.md)\n\n## Use Cases\n\n- Placing HTML content using X/Y coordinates\n- Placing HTML content against a target element and using X/Y offsets\n\n## Terminology\n\n### Alignment\n\n**Align Target** Defines an external element that serves as a \"triggering\" element for the Popup.\n**Align Edge** Also called the \"primary alignment\", given two alignment values, the first one is the edge of an Align Target that the Popup will be placed against immediately. For example \"bottom\" will cause the Popup to be aligned at the bottom of the Align Target.\n**Primary Alignment** See \"Align Edge\"\n**Secondary Alignment** Given two alignment values, the secondary alignment is optional, and will cause the Popup to line up the given edge with the Align Target's given edge.  For example, given `top, left`, the secondary alignment will cause the Popup to align primarily to the top of the Align Target, but will also line up both the Popup and the Align Targets' left edges.\n\n### Other\n\n**Arrow** Popups can optionally display arrows that can point to content when used with an Align Target.\n**Arrow Target** The element that a Popup's Arrow will point toward.  This defaults to an Align Target, but can also be defined separately.\n**Bleeds** Determines when Popups are allowed to exist outside their defined Containing Element.  A Popup that does not bleed will remain contained, no matter what coordinates/offsets are provided.\n**Containing Element** Popups are confined to a contained area inside of a page.  This area may be the entire document body,\nan [IDS Container](../ids-container/README.md), or a custom-defined element.  If bleeding is disabled, the Popup will never cross the boundaries of the container.\n**Coordinates** When placed directly in a page (not aligned against an element), a Popup uses its provided x/y values as coordinates as if plotted on a graph.\n**Offsets** When placed against a parent element, a Popup uses its provided x/y values as offsets from the base position detected.\n**Type** Defines the style of Popup that can be used.  There are several different display types, the most common one being `menu`.\n\n## Themeable Parts\n\n- `popup` allows you to further style or adjust the outer popup element\n- `arrow` allows you to adjust the arrow element\n\n## Settings and Attributes\n\n- `align` {string} determines the direction of alignment for the Popup. Can be 'left', 'right', 'top', 'bottom', 'center', or a comma-delimited list.\n- `align-edge` {string} determines which edge of the Popup to align with. Can be 'flip', 'inner', or 'outer'.\n- `align-target` {string|HTMLElement} sets the element to align with via a CSS selector or direct element reference.\n- `align-x` {string} sets the horizontal alignment. Can be 'left', 'center', or 'right'.\n- `align-y` {string} sets the vertical alignment. Can be 'top', 'center', or 'bottom'.\n- `animated` {boolean} enables animation when showing/hiding the Popup.\n- `animation-style` {string} sets the animation style. Can be 'fade', 'scale', or 'slide'.\n- `arrow` {string} specifies whether to show the Popup arrow and in which direction. Can be 'bottom', 'left', 'right', 'top', or 'none'.\n- `arrow-target` {string|HTMLElement} sets the element to align the arrow with via a CSS selector or direct element reference.\n- `bleed` {boolean} if true, allows the Popup to cross the defined containing element boundary.\n- `center-on-overflow `{boolean} if true, centers the Popup when it overflows the screen.\n- `close-on-scroll` {boolean} determines if the Popup should close when scrolling occurs. Default is true. Set to false to keep the Popup open during scrolling.\n- `max-height` {string} sets the maximum height of the Popup.\n- `max-width` {string} sets the maximum width of the Popup.\n- `offset-container` {string} sets a CSS selector for an element to use for offset calculations.\n- `position-style` {string} sets the positioning method. Can be 'absolute' or 'viewport'.\n- `type` {string} sets the Popup type. Can be 'menu', 'tooltip', or 'none'.\n- `visible` {boolean} controls the visibility of the Popup.\n- `wait-for-content` {boolean} if true, waits for dynamic content changes (like Angular *ngIf) before showing the popup. Useful for preventing race conditions with arrow placement.\n- `x` {number} sets the horizontal offset in pixels.\n- `y` {number} sets the vertical offset in pixels.\n\n## Features (with code samples)\n\nCreating a Context-menu style that would open on click might look like the following:\n\n```html\n<ids-popup id=\"my-popup\" x=\"0\" y=\"10\" align=\"top, left\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\nTo create a Popup that appears to align itself against a button, you could do the following:\n\n```html\n<ids-popup id=\"my-popup\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n\n...\n\n<ids-button id=\"my-button\">\n  <span>My Button</span>\n</ids-button>\n```\n\n### Using Visibility\n\nDisplay the Popup using the `visible` attribute:\n\n```html\n<ids-popup id=\"my-popup\"  x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" visible=\"true\">\n    <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\nProgrammatically, you can use the `visible` JS property:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.visible = true;\n```\n\n... or explicitly call `show()` or `hide()` methods:\n\n```js\nconst popup = document.querySelector('#my-popup');\nawait popup.show();\n\n// close\nawait popup.hide();\n```\n\nWhen the Popup is visible, it's possible to tell the Popup to re-render its position by using `place()`:\n\n```js\nconst popup = document.querySelector('#my-popup');\nawait popup.place();\n```\n\n### Size\n\nIdsPopup size can be controlled with the `max-height`, `width` and `height` properties.  These are convenience properties that set CSS-friendly size values on the IdsPopup's shadow root container:\n\n```html\n<ids-popup id=\"my-popup\" width=\"100%\" height=\"100%\" max-height=\"550px\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" visible=\"true\">\n    <div slot=\"content\">My Popup</div>\n</ids-popup>\n```\n\n### Place\n\nThe Popup's coordinates/offsets can be set individually.  The action of using the x/y setters will change the stored position internally, but will not automatically be rendered.  Also, the position will not be rendered if the Popup is not visible.\n\nTo initially set a Popup's position, you can use the following:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.x = 100;\npopup.y = 200;\nawait popup.show();\nawait popup.place();\n```\n\nIt's also possible to set both coordinate values, make the Popup visible, and render the placement in one pass using `setPosition()`:\n\n```js\nconst popup = document.querySelector('#my-popup');\npopup.setPosition(100, 200, true, true);\n```\n\n### Position Styles\n\nThere are three position styles:\n\n`fixed` - Uses simpler algorithms using `position: fixed;` and ignores container scrolling.\n`absolute` - Uses `position: fixed;` and accounts for container scrolling.\n`viewport` - This ignores the x/y offsets and positions the Popup directly in the middle of the viewport.  This is used for [Modals](../ids-modal/README.md)\n\n### Animation Styles\n\nIf the `animated` property is set, the `animation-styles` available are:\n\n- `fade`: animates in/out using a simple fade transition.\n- `scale-in`: Grows in from the center, shrinks out to the center on top of a simple fade transition. This is used on [Modals](../ids-modal/README.md)\n\n### Using Arrows\n\nSome Popup styles need to \"point\" at their triggering element for context, such as [Tooltips](../ids-tooltip/README.md).  To create a Popup that uses an arrow, simply tell it which way to point:\n\n```html\n<ids-popup id=\"my-popup\" x=\"10\" y=\"10\" align=\"top, left\" alignTarget=\"#my-button\" arrow=\"top\">\n  <div slot=\"content\">My Popup</div>\n</ids-popup>\n<ids-button id=\"my-button\">\n  <span>My Button</span>\n</ids-button>\n```\n\nIn this configuration, if a Popup is given offset value that corresponds to the `alignEdge` is not greater than the size of the Popup, the arrow's placement will be autocorrect to try and stay in alignment with the `arrowTarget`. If the offset value is greater, the arrow will hide automatically.\n\n### Using Bleeds and Containment\n\nPopups can be configured to remain inside of a set boundary element, referred to as a Containing Element.  If defined, the Popup will not cross the boundaries the containing element.  An example of this functionality is the prevention of an [IdsPopupMenu](../ids-popup-menu/README.md) from appearing to be cut off by the browser's edges.\n\nUse of a containing element could be configured in this manner:\n\n```html\n<ids-popup id=\"my-popup\" x=\"0\" y=\"0\" align=\"top, left\">\n  <div slot=\"content\" style=\"width: 100px; height: 100px;\">My Popup</div>\n</ids-popup>\n\n<div id=\"my-container\" style=\"width: 500px; height: 500px;\"></div>\n```\n```js\nconst popup = document.querySelector('#my-popup');\nconst container = document.querySelector('#my-container');\npopup.containingElem = container;\n```\n\nAfter setting the `containingElem` property, setting coordinates will place the Popup in a position that accounts for not crossing the container's edges.  For example:\n\n```js\npopup.x = 500;\n```\n\nGiven this value, the Popup will attempt to set the X coordinate at 500px using the default alignment of `top, left`, which places the left-most edge of the Popup at 500px.  Placing in this position would cross the boundary of the container, so instead the Popup will be nudged back into the containing element entirely, ending up with an X placement around 400px.\n\nIt's also possible to disable the check for bleeding, if necessary:\n\n```js\npopup.bleed = false;\n```\n\nRunning this immediately after our example above will cause the Popup to actually be placed at 500px.\n\nIf we decide to remove containment by the element, we can simply set it back to it's default:\n\n```js\npopup.containingElem = document.querySelector('ids-container');\n```\n\n### Alter placement programmatically\n\nIn some cases, you may want to slightly adjust the values provided by the built-in placement methods.  The `onPlace` callback can be implemented for this purpose:\n\n```js\npopup.onPlace = (popupRect) => {\n  popupRect.x += 100;\n  popupRect.y += 50;\n  return popupRect;\n}\n```\n\nThe `popupRect` argument provides access to the editable [`DOMRect`](https://developer.mozilla.org/en-US/docs/Web/API/DOMRect) object that the IdsPopup uses to place itself.  The callback returns the DOMRect with modified values.\n\nThere is also a `onPlaceEnd` callback that is fired when the placement is complete.  This can be used to perform additional actions after the placement is fully complete.\n\n```js\npopup.onPlaceEnd = (popupRect, popupElem) => {\n  popupElem.arrowTarget.style.backgroundColor = 'red';\n}\n```\n\n#### onXYSwitch callback\n\nWhen using `alignTarget` and offsets, occasionally it may be necessary for a 'top' or 'bottom'-aligned IdsPopup to switch axes and become aligned 'right' or 'left', for the purposes of remaining inside a container area.  After this occurs, an `onXYSwitch` callback is fired with an object containing several parameters.  You can modify this object and return it to provide additional changes to the placement algorithm:\n\n- `x/y`: number values that will be used for offsets\n- `flip`: boolean true if a flip occurs at all\n- `shouldSwitchXY`: boolean true if the flip that occurred also switched the x/y axes\n- `targetEdge`: the original target edge\n- `oppositeEdge`: the edge that will be used in the case of a normal, same-axis flip\n\nFor example, this occurs when [`IdsDatePicker`]('../ids-date-picker/README.md')'s popup flips to align on the X axis, which requires more space away from its target.\n\n#### Keep Open\n\nIdsPopup is programmed to automatically close on outside click events. To keep the popup open until `hide()` is called programmatically, use the `keep-open` setting.\n\n- `keepOpen {boolean}`: Toggle to keep popup open when clicked outside of its container.\n\nFor example, this occurs when [`IdsDatePicker`]('../ids-date-picker/README.md')'s popup flips to align on the X axis, which requires more space away from its target.\n\n## Usage Tips\n\n- When making a Popup that is placed in reference to an adjacent element, it must be placed AFTER it in the DOM. Placing it BEFORE the adjacent element can cause its placement to be incorrect on its first render.\n- When using an `alignTarget`, also using the `arrow` setting and pointing it in the direction of the `alignTarget` can help contextualize the relationship between the two elements.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Place was added in v4.2.2\n- All separate placement/popup logic was replaced with Place internally (not called)\n- Place could be invoked on a custom component with `$('#my-element').place();`\n\n**4.x to 5.x**\n\n- Place is now a custom element `<ids-popup></ids-popup>`\n- This is the new base component to be used for building Popupmenu, Tooltip, Modal, and any other component that requires placement of a absolute/fixed-position element.\n- All options/settings are now attributes: x, y, align, alignX, alignY, alignEdge, alignTarget, animated, visible.\n- Popup is now driven by its own HTMLElement rather than a being a behavior applied to any element: `<ids-popup x=\"0\" y=\"0\" align=\"top, left\">My Popup</ids-popup>`\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-popup-menu","attributes":[{"name":"container","description":"Component's first child element (in IdsPopupMenu, this is always an IdsPopup component)","values":[]},{"name":"is-overflow-item","description":"Flag for overflow items in toolbar","values":[]},{"name":"#dynamic-content-rendered","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"#mo","values":[]},{"name":"items","values":[]},{"name":"groups","values":[]},{"name":"focus-target","values":[]},{"name":"parent-menu","values":[]},{"name":"align","description":"Retrieves the `align` setting from the internal IdsPopup","values":[]},{"name":"visible","values":[]},{"name":"before-show","description":"Get the before show function","values":[]},{"name":"max-height","description":"Set the max height value","values":[]},{"name":"position-style","values":[]},{"name":"width","description":"Gets width","values":[]},{"name":"y","description":"Sets the Y (top) coordinate of the Popup","values":[]},{"name":"x","description":"Sets the X (top) coordinate of the Popup","values":[]},{"name":"arrow","description":"Specifies whether to show the Popup Arrow, and in which direction.\nThe direction is in relation to the alignment setting. So for example of you align: top you want arrow: top as well.","values":[]},{"name":"offset-container","description":"Gets offset container if any","values":[]},{"name":"align-y","description":"Gets the align-y attribute value","values":[]}],"description":{"kind":"markdown","value":"# ids-popup-menu\n\n## Description\n\nThe Ids Popup Menu component allows the capability for providing lists of contextual options related to a current application, page, or widget.  The options within the menu provide values that can be acted on, events that can determine application function, and can contain toggle information.\n\nIds Popup Menus are able to be attached directly to the page, taking the place of standard browser context menus.  They are also able to be attached to specific components, such as buttons, input fields, and grid cells, to provide contextual options specific to those elements.\n\nThe Ids Popup Menu is a complex component that combines an [`IdsMenu`](../ids-menu/README.md) and [`IdsPopup`](./ids-popup/README.md) to create its core functionality.\n\n## Use Cases\n\n- Provide a list of actionable items related to an entire application (Context Menu behavior)\n- Provide a list of actionable items related to another widget (f.x.: MenuButton behavior, Data Grid cell options)\n- Attach major functions of an application to easily-accessible clicks/touches.\n\n## Terminology\n\n### Component Types\n\n**Menu** The base container element, `IdsMenu`, usually represented in the Shadow DOM with a standard HTML `<div>` tag.\n**Popup Menu** This specific component `IdsPopupMenu`, which wraps a standard menu in a \"Popup\" that can be hidden and shown on command.\n**Menu Item** A sub-component of the `IdsPopupMenu`, which is the actionable item within the menu.  These can have values, be selected or deselected, disabled, and icons.  They are also able to contain Submenus.\n**Menu Group** All menu items exist inside of an `IdsMenuGroup` sub-component type, which contains information about how selection can occur on its contained items. Selection be \"none\" (standard click behavior), \"single\" which allows only a single item in the group to be checked, or \"multi\" which allows any/all items in the group to be selected simultaneously. A menu can be comprised of one or multiple groups of items, and each group's selection within the parent menu is independent of the others.\n**Menu Header** This sub-component describes the contents of a specific Menu Group with an accessible heading, represented in the Shadow DOM with a `<li>`. Only one of these should exist within a Menu Group.\n**Separator** A simple sub-component that visually separates Menu Items.  These can be used either as direct children of the Menu between the Menu Groups (represented in Shadow DOM by a `<div>`), or inside of a Menu Group between the Menu Items (represented in Shadow DOM by a `<li>`).\n**Submenu** Nested `IdsPopupMenu` components that originate from a base Popup Menu.  These are attached to a parent menu item, and can be activated by hovering the menu item with a mouse, tapped, clicked, or by using some keyboard commands.\n\n### Behaviors\n\n**Keep Open** Defined on Menu Groups. The presence of this property causes a Popup Menu to remain open when one of the Menu Group's Menu Items is selected/deselected. The Popup Menu can only be closed by an explicit keyboard action, or by clicking/tapping outside of it. By default, selecting/deselecting a Menu Item will cause the Popup Menu to close.\n**Select** Defined on Menu Groups. This option defines the type of selection possible within the Menu Group. When this option is not present (default), simply selecting an item from the Popup Menu will store it as \"selected\" but not visually represent it as such. If this option exists and is set to \"single\", all Menu Items in the Menu Group will display a single-selectable checkmark when selected, causing the others in the group to become deselected. If this option is set to \"multiple\", each Menu Item in the group can be selected/deselected independently, and will be represented by a multi-selectable checkbox.\n**Target** Defined on Popup Menus. The Popup Menus can have a `target` property defined that will define another element in the page as being the \"actionable\" element for causing the menu to show/hide.\n**Trigger** Defined on Popup Menus. The name of the action that causes the Popup Menu to be displayed. The default behavior for Popup Menus will make them occur on the browser's document-level `contextmenu` event, but the trigger behavior can also occur on a left/right/middle `click`, as well as displaying when invoked by using the `immediate` behavior.\n\n## Settings (Attributes)\n\n### Popup Menu\n\n- `target` {HTMLElement} if defined, creates a link between this Popup Menu and another element in the DOM.\n- `trigger` {string} the action on which to activate the Popupmenu. This defaults to `contextmenu`, but can also be `click` or `immediate`.\n- `arrow` {string} If defined overrides the default arrow position. The typical use case is to set this to `none` to not show any arrow.\n- `offset-container` {string} CSS Selector for container element from which a popup with position-style `fixed` should adjust itself from. Such as when a parent container has `container-type: size`, which affects the popup's fixed position calculation.\n\n### Menu Group\n\n- `keep-open` {boolean} if true, causes the parent Popup Menu to remain open when an item within this group is selected/deselected.\n- `select` {string} Determines selection type. This defaults to \"none\", but can be \"single\" or \"multiple\".\n\n### Menu Item\n\n- `disabled` {boolean} set disabled state.\n- `href` {string} set the `href` attribute on the internal anchor.\n- `icon` {string} set the icon type used on the menu item.\n- `selected` {boolean} sets checkmark/checkbox state, if the menu item is selectable.\n- `submenu` {IdsPopupMenu} links a child Popupmenu to this element, if applicable.\n- `tabindex` {number} set the `tabindex` attribute on the internal anchor.\n- `value` {string} set the radio value.\n\n## Methods\n\n- `async beforeShow(opts)` A callback that fires when the menu is opened. You can inspect the parameter `opts` to see what menu and details about what is about to open. Since the method is async you can do a call back and it will wait. Then return structured [menu data](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/assets/data/menu-contents.json) when returned the menu will show with this data. If you return false the menu will not open. If you prefer to build the menu DOM yourself (e.g. to attach event handlers), manipulate `opts.contextElement` and return `true` to signal the menu should open without data handling.\n\n## Features (With Code Examples)\n\nIt's possible to create a Popupmenu that stands alone and takes the place of the browser's context menu by default:\n\n```html\n<ids-popup-menu id=\"popupmenu\">\n    <ids-menu-group>\n        <ids-menu-item value=\"1\">One</ids-menu-item>\n        <ids-menu-item value=\"2\">Two</ids-menu-item>\n        <ids-menu-item value=\"3\">Three</ids-menu-item>\n    </ids-menu-group>\n</ids-popup-menu>\n```\n\nIt's also possible to recreate this structure in raw Javascript:\n\n```js\nconst menu = new IdsPopupMenu();\nmenu.id = 'popupmenu';\ndocument.body.appendChild(menu);\n\nconst group = new IdsMenuGroup();\nmenu.appendChild(group);\n\nconst itemOne = new IdsMenuItem();\nitemOne.value = 1;\ngroup.appendChild(itemOne);\n\nconst itemTwo = new IdsMenuItem();\nitemTwo.value = 1;\ngroup.appendChild(itemTwo);\n\nconst itemThree = new IdsMenuItem();\nitemThree.value = 1;\ngroup.appendChild(itemThree);\n```\n\nAdditionally, it's possible to use an [IdsDataSource](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/core/README.md#ids-data-source) to populate the Popup Menu dynamically.  The component has a standardize JSON format that can be used to create a menu structure quickly:\n\n```js\nconst menu = new IdsPopupMenu();\nmenu.data = {\n    id: 'popupmenu',\n    contents: [\n        {\n            type: 'group',\n            items: [\n                {\n                    text: 'One',\n                    value: 1\n                },\n                {\n                    text: 'Two',\n                    value: 2\n                },\n                {\n                    text: 'Three',\n                    value: 3\n                },\n            ]\n        }\n    ]\n}\ndocument.body.appendChild(menu);\n```\n\nIn some cases you may want to dynamically fetch data for the menu when it opens. You can do this by using the `beforeShow` callback.  This callback is called when the menu is opened and can be used to fetch data for the menu. This also fires when opening submenus.\n\nFor a working example see [load-data.html](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/components/ids-popup-menu/demos/load-data.html) and [load-data](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/components/ids-popup-menu/demos/load-data.ts). You should return return structured [menu data](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/assets/data/menu-contents.json) to control the menu. For dynamic submenus you can either return the submenu data directly on the initial call or use an empty contents area for the submenu if you plan  on fetching that dynamically `\"contents\": [{}]`.\n\n```js\npopupmenuEl.beforeShow = async (opts: any) => {\n  if (opts.isSubmenu) {\n    const submenuData = await fetch(...);\n    return submenuData;\n  }\n  const menuData = await fetch(...);\n  return menuData;\n};\n```\n\nIf you need to build the menu DOM yourself (for example to attach click handlers), use `opts.contextElement` to target the correct element and return `true`:\n\n```js\npopupmenuEl.beforeShow = async (opts: any) => {\n  const target = opts.contextElement;\n  const res = await fetch('/api/menu-items');\n  const items = await res.json();\n\n  target.innerHTML = '';\n  const group = document.createElement('ids-menu-group');\n  items.forEach((item) => {\n    const menuItem = document.createElement('ids-menu-item');\n    menuItem.value = item.value;\n    menuItem.textContent = item.text;\n    menuItem.addEventListener('click', () => handleClick(item));\n    group.appendChild(menuItem);\n  });\n  target.appendChild(group);\n  return true;\n};\n```\n\n## Events\n\n- `beforeshow` Fires just before the menu is shown. Can not currently be vetoed.\n- `show` Fires when the menu is shown.\n- `show` Fires after showing is complete.\n- `beforehide` Fires before the menu is hidden.\n- `hide` Fires as the menu is hidden.\n- `afterhide` Fires after hiding is complete.\n- `selected` Fires when a menu item is selected on the entire menu\n- `click` Fires for each `ids-menu-item` if attached to individual menu items\n\n### Size\n\nIdsPopupMenu accepts `max-height` and `width` properties, which it passes directly into its inner [IdsPopup](../ids-popup/README.md#size) component for sizing:\n\n```html\n<ids-popup-menu id=\"popupmenu\" max-height=\"550px\" width=\"400px\"></ids-popupmenu>\n```\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Replace usage of `.inforContextMenu()` with `.contextmenu()` or `.popupmenu()` (depending on the use case)\n\n**4.x to 5.x**\n\n- Popup Menu is now a custom element `<ids-popup-menu></ids-popup-menu>`.\n- Events triggered by the Popup Menu are now plain JS (for example `selected`/`deselected`)\n- Selection of items is now divided up by Menu Groups `<ids-menu-group></ids-menu-group>`.  Multiple menu groups in each Popup Menu are supported, and selection in one group will not affect selection in other groups.\n- Many previous settings are now attribute-friendly (for example `closeOnSelect` is now a `keep-open` attribute on menu groups).\n- Made dynamic menus possible by using [IdsDataSource](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/core/README.md#ids-data-source)\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> Can be used to navigate to the next available menu item with a 0+ tab-index value.\n- <kbd>Shift + Tab</kbd> Does the opposite, navigating to the previous available menu item.\n- <kbd>Up/down arrow</kbd> navigate up and down the list.\n- <kbd>Left/right arrow</kbd> traverses nested Popup Menus.  If the currently-highlighted menu item contains a Submenu, pressing the right arrow will open that Submenu.  If the left arrow is pressed while a nested menu item is focused, its Submenu will be closed and focus will be returned to the parent menu item.\n- <kbd>Enter/Return</kbd> Perform selection/deselection where available.  On items that contain submenus, this will not select/deselect and will instead trigger the submenu.\n- <kbd>Shift+F10</kbd> can be used to trigger document-level Popup Menus that are bound to the `contextmenu` event.\n- <kbd>Fn + F12</kbd> is the default macOS context menu keyboard shortcut. To use it, you need to enable \"Alternate pointer actions\" by going to the Apple menu > System Preferences/Settings > Accessibility > Pointer Control > Alternate pointer actions.\n"}},{"name":"ids-process-indicator-step","attributes":[{"name":"label","description":"Sets the label for the step","values":[]},{"name":"status","description":"Sets the status for the step which determines the icon","values":[]}],"description":{"kind":"markdown","value":"# ids-process-indicator\n\n## Description\n\nIndicates the process of an activity over a timeline with process steps showing details and status of what needs to be done and/or has been done/started/cancelled.\n\n## Use Cases\n\n- To show which stages of production are complete in a development lifecycle and what is left to be finished\n\n## Terminology\n\n- **Process Step**: each task/stage/to-do within the whole process\n- **Status**: done, started, or cancelled as indicated by a filled circle, empty circle, or red circle with an X, respectively\n- **Label**: the title of the process step\n\n## Settings (Attributes)\n\nUtilizes the child component IDS Process Step  which has `label` and `status` attribute. The colored process line will draw to the farthest process step with a non-null status. Which has the following attributes:\n\n- `label` {string} the title of the process step\n- `status` {string} `done` || `started` || `cancelled`\n\n## Features (With Code Samples)\n\nA simple process indicator with 3 process steps\n\n```html\n  <ids-process-indicator>\n    <ids-process-indicator-step label=\"Preparation\" status=\"done\"></ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Manufacturing\" status=\"started\"></ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Final Stage\"></ids-process-indicator-step>\n  </ids-process-indicator>\n```\n\nA simple process indicator with 2 process steps and additional details\n\n```html\n  <ids-process-indicator>\n    <ids-process-indicator-step label=\"Preparation\" status=\"done\">\n      <ids-text>Order the parts</ids-text>\n      <ids-text>Jan 31, 2021</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Manufacturing\" status=\"started\">\n      <ids-text>Assemble and package product</ids-text>\n      <ids-text>Anticipated: Mar 1, 2021</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Final Stage\" status=\"started\">\n      <ids-text>Deliver product to stores</ids-text>\n      <ids-text>Anticipated: July 1, 2021</ids-text>\n    </ids-process-indicator-step>\n  </ids-process-indicator>\n```\n\nA process indicator with 4 process steps and the 3 different possible statuses\n\n```html\n  <ids-process-indicator>\n    <ids-process-indicator-step label=\"Preparation\" status=\"done\">\n      <ids-text>Order the parts</ids-text>\n      <ids-text>Jan 31, 2021</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Manufacturing\" status=\"started\">\n      <ids-text>Assemble and package product</ids-text>\n      <ids-text>Anticipated: Mar 1, 2021</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Advertising\" status=\"cancelled\">\n      <ids-text>Assemble and package product</ids-text>\n      <ids-text>Anticipated: May 1, 2021</ids-text>\n      <ids-text>Cancelled due to COVID-19</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Final Stage\">\n      <ids-text>Deliver product to stores</ids-text>\n      <ids-text>Anticipated: July 1, 2021</ids-text>\n    </ids-process-indicator-step>\n  </ids-process-indicator>\n```\n\n## Responsive Guidelines\n\n- The component stretches to 100% width of its container (horizontal orientation)\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Process Indicator was a new component in v4.0.0\n- Can be invoked with `$('#my-element').processindicator();`\n\n**4.x to 5.x**\n\n- Process Indicator is now a custom element `<ids-process-indicator></ids-process-indicator>`\n\n### Converting from 4.x\n\n```html\n    <div class=\"process-indicator compact responsive has-labels\">\n      <span class=\"responsive-label\"><span>Current:</span> 3rd Level - Multiple Approvers</span>\n      <div class=\"display\">\n\n        <div class=\"step\" id=\"step3\" data-automation-id=\"step3-automation-id\">\n          <span class=\"label\">2nd Level</span>\n          <div class=\"lines\">\n            <span class=\"indicator darker\"></span>\n            <span class=\"separator darker\"></span>\n          </div>\n          <div class=\"details\">\n            <span class=\"heading\">Unreleased</span>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-success\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-success\"></use>\n              </svg>\n              <span>Melissa Nash</span>\n            </a>\n            <span>January 22, 2021 | 02:42AM</span>\n          </div>\n        </div>\n\n        <div class=\"step current\" id=\"step4\" data-automation-id=\"step4-automation-id\">\n          <span class=\"label\">3rd Level - Multiple Approvers</span>\n          <div class=\"lines\">\n            <span class=\"indicator processing\"></span>\n            <span class=\"separator darker\"></span>\n          </div>\n          <div class=\"details\">\n            <span class=\"heading\">Unreleased</span>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-success\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-success\"></use>\n              </svg>\n              <span>Garret Rounds</span>\n            </a>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-empty-circle\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-empty-circle\"></use>\n              </svg>\n              <span>Evelyn Lewis</span>\n            </a>\n            <span>Feb 2, 2021 | 21:12AM</span>\n          </div>\n        </div>\n\n        <div class=\"step\" id=\"step5\" data-automation-id=\"step5-automation-id\">\n          <span class=\"label\">4th level</span>\n          <div class=\"lines\">\n            <span class=\"indicator icon current\">\n              <svg class=\"icon icon-rejected-solid\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-rejected-solid\"></use>\n              </svg>\n            </span>\n            <span class=\"separator\"></span>\n          </div>\n          <div class=\"details\">\n            <span class=\"heading\">Status</span>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-rejected-outline\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-rejected-outline\"></use>\n              </svg>\n              <span>John Jones</span>\n            </a>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-empty-circle\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-empty-circle\"></use>\n              </svg>\n              <span>James Martin</span>\n            </a>\n            <span>Feb 12, 2021 | 14:12AM</span>\n          </div>\n        </div>\n      </div>\n    </div>\n\n\n```\nis the 4.x equivalent of the web component example below\n\n```html\n  <ids-process-indicator>\n    <ids-process-indicator-step label=\"2nd Level\" status=\"done\">\n      <ids-text>Unreleased</ids-text>\n      <ids-icon icon=\"success\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>Melissa Nash</span></ids-hyperlink>\n      <ids-text class=\"date\">January 22, 2021 02:42 AM</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"3rd Level - Multiple Approvers\" status=\"started\">\n      <ids-text>Unreleased</ids-text>\n      <ids-icon icon=\"success\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>Garret Rounds</span></ids-hyperlink>\n      <br>\n      <ids-icon icon=\"empty-circle\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>Evelyn Lewis</span></ids-hyperlink>\n      <ids-text class=\"date\">Feb 2, 2021 21:12 AM</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"4th Level\" status=\"cancelled\">\n      <ids-text>Status</ids-text>\n      <ids-icon icon=\"rejected-outline\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>John Jones</span></ids-hyperlink>\n      <br>\n      <ids-icon icon=\"empty-circle\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>James Martin</span></ids-hyperlink>\n      <ids-text class=\"date\">Feb 12, 2021 14:12 AM</ids-text>\n    </ids-process-indicator-step>\n  </ids-process-indicator>\n```\n"}},{"name":"ids-process-indicator","attributes":[],"description":{"kind":"markdown","value":"# ids-process-indicator\n\n## Description\n\nIndicates the process of an activity over a timeline with process steps showing details and status of what needs to be done and/or has been done/started/cancelled.\n\n## Use Cases\n\n- To show which stages of production are complete in a development lifecycle and what is left to be finished\n\n## Terminology\n\n- **Process Step**: each task/stage/to-do within the whole process\n- **Status**: done, started, or cancelled as indicated by a filled circle, empty circle, or red circle with an X, respectively\n- **Label**: the title of the process step\n\n## Settings (Attributes)\n\nUtilizes the child component IDS Process Step  which has `label` and `status` attribute. The colored process line will draw to the farthest process step with a non-null status. Which has the following attributes:\n\n- `label` {string} the title of the process step\n- `status` {string} `done` || `started` || `cancelled`\n\n## Features (With Code Samples)\n\nA simple process indicator with 3 process steps\n\n```html\n  <ids-process-indicator>\n    <ids-process-indicator-step label=\"Preparation\" status=\"done\"></ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Manufacturing\" status=\"started\"></ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Final Stage\"></ids-process-indicator-step>\n  </ids-process-indicator>\n```\n\nA simple process indicator with 2 process steps and additional details\n\n```html\n  <ids-process-indicator>\n    <ids-process-indicator-step label=\"Preparation\" status=\"done\">\n      <ids-text>Order the parts</ids-text>\n      <ids-text>Jan 31, 2021</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Manufacturing\" status=\"started\">\n      <ids-text>Assemble and package product</ids-text>\n      <ids-text>Anticipated: Mar 1, 2021</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Final Stage\" status=\"started\">\n      <ids-text>Deliver product to stores</ids-text>\n      <ids-text>Anticipated: July 1, 2021</ids-text>\n    </ids-process-indicator-step>\n  </ids-process-indicator>\n```\n\nA process indicator with 4 process steps and the 3 different possible statuses\n\n```html\n  <ids-process-indicator>\n    <ids-process-indicator-step label=\"Preparation\" status=\"done\">\n      <ids-text>Order the parts</ids-text>\n      <ids-text>Jan 31, 2021</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Manufacturing\" status=\"started\">\n      <ids-text>Assemble and package product</ids-text>\n      <ids-text>Anticipated: Mar 1, 2021</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Advertising\" status=\"cancelled\">\n      <ids-text>Assemble and package product</ids-text>\n      <ids-text>Anticipated: May 1, 2021</ids-text>\n      <ids-text>Cancelled due to COVID-19</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"Final Stage\">\n      <ids-text>Deliver product to stores</ids-text>\n      <ids-text>Anticipated: July 1, 2021</ids-text>\n    </ids-process-indicator-step>\n  </ids-process-indicator>\n```\n\n## Responsive Guidelines\n\n- The component stretches to 100% width of its container (horizontal orientation)\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Process Indicator was a new component in v4.0.0\n- Can be invoked with `$('#my-element').processindicator();`\n\n**4.x to 5.x**\n\n- Process Indicator is now a custom element `<ids-process-indicator></ids-process-indicator>`\n\n### Converting from 4.x\n\n```html\n    <div class=\"process-indicator compact responsive has-labels\">\n      <span class=\"responsive-label\"><span>Current:</span> 3rd Level - Multiple Approvers</span>\n      <div class=\"display\">\n\n        <div class=\"step\" id=\"step3\" data-automation-id=\"step3-automation-id\">\n          <span class=\"label\">2nd Level</span>\n          <div class=\"lines\">\n            <span class=\"indicator darker\"></span>\n            <span class=\"separator darker\"></span>\n          </div>\n          <div class=\"details\">\n            <span class=\"heading\">Unreleased</span>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-success\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-success\"></use>\n              </svg>\n              <span>Melissa Nash</span>\n            </a>\n            <span>January 22, 2021 | 02:42AM</span>\n          </div>\n        </div>\n\n        <div class=\"step current\" id=\"step4\" data-automation-id=\"step4-automation-id\">\n          <span class=\"label\">3rd Level - Multiple Approvers</span>\n          <div class=\"lines\">\n            <span class=\"indicator processing\"></span>\n            <span class=\"separator darker\"></span>\n          </div>\n          <div class=\"details\">\n            <span class=\"heading\">Unreleased</span>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-success\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-success\"></use>\n              </svg>\n              <span>Garret Rounds</span>\n            </a>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-empty-circle\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-empty-circle\"></use>\n              </svg>\n              <span>Evelyn Lewis</span>\n            </a>\n            <span>Feb 2, 2021 | 21:12AM</span>\n          </div>\n        </div>\n\n        <div class=\"step\" id=\"step5\" data-automation-id=\"step5-automation-id\">\n          <span class=\"label\">4th level</span>\n          <div class=\"lines\">\n            <span class=\"indicator icon current\">\n              <svg class=\"icon icon-rejected-solid\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-rejected-solid\"></use>\n              </svg>\n            </span>\n            <span class=\"separator\"></span>\n          </div>\n          <div class=\"details\">\n            <span class=\"heading\">Status</span>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-rejected-outline\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-rejected-outline\"></use>\n              </svg>\n              <span>John Jones</span>\n            </a>\n            <a class=\"hyperlink hide-focus\" href=\"#\">\n              <svg class=\"icon icon-empty-circle\" focusable=\"false\" aria-hidden=\"true\" role=\"presentation\">\n                 <use href=\"#icon-empty-circle\"></use>\n              </svg>\n              <span>James Martin</span>\n            </a>\n            <span>Feb 12, 2021 | 14:12AM</span>\n          </div>\n        </div>\n      </div>\n    </div>\n\n\n```\nis the 4.x equivalent of the web component example below\n\n```html\n  <ids-process-indicator>\n    <ids-process-indicator-step label=\"2nd Level\" status=\"done\">\n      <ids-text>Unreleased</ids-text>\n      <ids-icon icon=\"success\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>Melissa Nash</span></ids-hyperlink>\n      <ids-text class=\"date\">January 22, 2021 02:42 AM</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"3rd Level - Multiple Approvers\" status=\"started\">\n      <ids-text>Unreleased</ids-text>\n      <ids-icon icon=\"success\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>Garret Rounds</span></ids-hyperlink>\n      <br>\n      <ids-icon icon=\"empty-circle\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>Evelyn Lewis</span></ids-hyperlink>\n      <ids-text class=\"date\">Feb 2, 2021 21:12 AM</ids-text>\n    </ids-process-indicator-step>\n    <ids-process-indicator-step label=\"4th Level\" status=\"cancelled\">\n      <ids-text>Status</ids-text>\n      <ids-icon icon=\"rejected-outline\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>John Jones</span></ids-hyperlink>\n      <br>\n      <ids-icon icon=\"empty-circle\" size=\"small\"></ids-icon>\n      <ids-hyperlink href=\"#\"><span>James Martin</span></ids-hyperlink>\n      <ids-text class=\"date\">Feb 12, 2021 14:12 AM</ids-text>\n    </ids-process-indicator-step>\n  </ids-process-indicator>\n```\n"}},{"name":"ids-progress-bar","attributes":[{"name":"completed","description":"Get calculated completed value","values":[]},{"name":"disabled","description":"Sets the component to disabled","values":[]},{"name":"label","description":"Set the `label` text","values":[]},{"name":"label-audible","description":"Sets to label text as audible","values":[]},{"name":"max","description":"Set the `max` attribute of progress","values":[]},{"name":"value","description":"Set the `value` attribute of progress","values":[]}],"description":{"kind":"markdown","value":"# ids-progress-bar\n\n## Description\n\nDisplays feedback about a system process. It is best for showing feedback about a system process to show an unspecified wait time or display the length of a running process. The IDS progress indicator is a simple web component and the value can be set with the `value` setting/attribute.\n\n## Use Cases\n\n- Showing feedback about a running system process\n\n## Terminology\n\n- Progress Bar: A standard basic progress element. It can set to a max and value.\n- Label: A label web component element to label the process being shown. Make sure the progress label is meaningful relative to progress.\n\n## Features (With Code Samples)\n\nA standard basic progress element:\n\n```html\n<ids-progress-bar label=\"Basic\" value=\"30\"></ids-progress-bar>\n```\n\nRepresent an Disabled progress in this way:\n\n```html\n<ids-progress-bar label=\"Disabled\" disabled=\"true\" value=\"30\"></ids-progress-bar>\n```\n\nSet the max and value attributes to show progress in this way:\n\n```html\n<ids-progress-bar label=\"Max\" max=\"1\" value=\"0.7\"></ids-progress-bar>\n```\n\nSet the audible (screen reader only) label to Progress:\n\n```html\n<ids-progress-bar label=\"Audible label\" label-audible=\"true\" value=\"30\"></ids-progress-bar>\n```\n\n## Settings (Attributes)\n\n- `disabled` {boolean} set the disabled state.\n- `label` {string} set the label text\n- `label-audible` {boolean} set the label to audible (screen reader only)\n- `max` {string|number} set the progress max attribute.\n- `value` {string|number} set the progress value attribute.\n\n## Responsive Guidelines\n\n- Default size is 100% wide and it based on fluid design, stretching to the parent content.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Progress component was added in 4.0.0\n- Progress can be invoked with `$('#my-element').progress();`\n\n**4.x to 5.x**\n\n- Progress component has been renamed to \"Progress Bar\"\n- Progress Bar is a custom element `<ids-progress-bar></ids-progress-bar>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n### Converting from 4.x\n\nThe IDS Progress Bar component is now a WebComponent. Instead of using classes to define it, it is done directly with a custom element and attributes:\n\n```html\n<!-- 4.x progress example -->\n<div class=\"field\">\n  <label id=\"pr-label1\">Percent complete</label>\n    <div class=\"progress\">\n      <div class=\"progress-bar\" data-value=\"50\" id=\"progress-bar1\" aria-labelledby=\"pr-label1\"></div>\n    </div>\n</div>\n\n<!-- this is the same progress using the WebComponent -->\n<ids-progress-bar label=\"Percent complete\" value=\"50\"></ids-progress-bar>\n\n```\n"}},{"name":"ids-progress-chart","attributes":[{"name":"percentage","values":[]},{"name":"icon","description":"Sets the icon inside the label","values":[]},{"name":"color","description":"Set the color of the bar","values":[]},{"name":"progress","description":"Set the numeric value of progress that has been completed","values":[]},{"name":"total","description":"Set the total value of possible progress that can be completed","values":[]},{"name":"label","description":"Set the label title of the bar","values":[]},{"name":"progress-label","description":"Set the label of completed progress--useful for displaying units","values":[]},{"name":"total-label","description":"Set the label of total possible progress--useful for displaying units","values":[]},{"name":"size","description":"Set the size of the progress bar (small, or normal (default)","values":[]}],"description":{"kind":"markdown","value":"# ids-progress-chart\n\n## Description\n\nSimilar to the [Progress Bar](../ids-progress-bar/README.md) web component, this component is more ideal for creating a standard bar chart visual. It is useful for showing the progress completed or time remaining for a task/goal, since it has customizable labels and colors. It is a simple web component where the amount of progress and total progress can be set with the `progress` and `total` setting/attribute, respectively. Labels can be set with `label`, `label-progress`, `label-total` and can include icons which need to be inserted as a child of the component in the HTML.\n\n## Use Cases\n\n- Showing progress or time remaining for a task/goal\n\n## Terminology\n\n- Progress Chart: A standard basic progress element which has progress, total progress, and 3 customizable labels\n- Label: A label web component element to label the title, amount of progress, and amount of total progress\n\n## Features (With Code Samples)\n\nThe examples below can be viewed at [http://localhost:4300/ids-progress-chart/readme-examples](http://localhost:4300/ids-progress-chart/readme-examples)\n\n### A standard basic progress chart\n\n```html\n<ids-progress-chart label=\"Basic\" progress=\"50\"></ids-progress-chart>\n```\n\nThe default total is 100, so even if you leave that field blank, it will render as 50% progress. There is also a default color for the progress bar.\n\n### Adding colors\n\n```html\n<ids-progress-chart label=\"#A876EB\" color=\"#A876EB\" progress=\"50\"></ids-progress-chart>\n```\n\nWith the use of IDS tokens, the above is visually identical to the following:\n\n```html\n<ids-progress-chart label=\"Purple-40\" color=\"purple-40\" progress=\"50\"></ids-progress-chart>\n```\n\n### Using Decimals\n\n```html\n<ids-progress-chart label=\"Decimals\" progress=\"0.7\" total=\"1\"></ids-progress-chart>\n```\n\n### Adding labels\n\n```html\n<ids-progress-chart label=\"Decimals with labels\" label-progress=\"0.7\" progress=\"0.7\" label-total=\"1\" total=\"1\"></ids-progress-chart>\n```\n\n```html\n<ids-progress-chart label=\"Sprint progress\" label-progress=\"1 week\" progress=\"1\" label-total=\"2 wks\" total=\"2\"></ids-progress-chart>\n```\n\n### Indicating caution, warning, or error\n\nThere are colors associated with the certain statuses\n\n```html\n<ids-progress-chart label=\"Error\" color=\"error\" progress=\"50\" label-progress=\"50%\"></ids-progress-chart>\n```\n\n```html\n<ids-progress-chart label=\"Warning\" color=\"warning\" progress=\"50\" label-progress=\"50%\"></ids-progress-chart>\n```\n\n```html\n<ids-progress-chart label=\"Caution\" color=\"caution\" progress=\"50\" label-progress=\"50%\"></ids-progress-chart>\n```\n\nThese are the few scenarios where it will color the progress label as well\n\n### Adding icons\n\nYou can include icons in the label heading\n\n```html\n<ids-progress-chart icon=\"error\" label=\"Error with icon\" color=\"error\" progress=\"50\"></ids-progress-chart>\n```\n\n### Adjust the size\n\nThere are 2 sizes, `small` and `normal`\n\n```html\n<ids-progress-chart label=\"Compact\" size=\"small\" progress=\"50\"></ids-progress-chart>\n```\n\nIcons adjust accordingly to the size of the chart\n\n```html\n<ids-progress-chart icon=\"alert\" label=\"Compact w/ icon\" size=\"small\" progress=\"50\"></ids-progress-chart>\n```\n\n## Settings (Attributes)\n\n- `progress` { string | number } set the progress value attribute\n- `total` { string | number } set the total progress value attribute\n- `color` { string } set the color of the progress bar\n- `size` { 'small' | 'normal' } set the size of the progress bar\n- `label` { string } set the title label\n- `icon` { string } set the icon type\n- `label-progress` { string } set the progress value label\n- `label-total` { string } set the total progress value label\n\n## Responsive Guidelines\n\n- By default, the width stretches to 100% of the parent container\n- The minimum width is 66px\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n*Completion Chart:*\n- The Completion Chart component was added in v4.4.0\n- Completion Chart is invoked with `$('#my-element').chart({ type: 'completion-target' });`\n\n*Targeted Achievement Chart:*\n- The Targeted Achievement Chart component is new in 4.4.0\n- Targeted Achievement Chart is invoked with `$('#my-element').chart({ type: 'targeted-achievement' });`\n\n**4.x to 5.x**\n\n- Features from both Targeted Achievement Charts and Completion Charts have been merged into a new web component called IdsProgressChart\n- IdsProgressChart is a custom element `<ids-progress-chart></ids-progress-chart>`\n\n### Converting from 4.x\n\nThe IDS Progress Chart component is now a WebComponent. Instead of using classes to define it, it is done directly with a custom element and attributes:\n\n```html\n<!-- 4.x progress chart example -->\n<div class=\"field\">\n  <div id=\"example-8c\" class=\"chart-container\"></div>\n</div>\n```\n\n```js\n  $('body').on('initialized', function() {\n    var dataset8 = [{\n      data: [{\n        name: {text: 'Old Progress Chart'},\n        info: {value: '13h'},\n        completed: {value: 13, color: '#D66221'}\n      }]\n    }];\n\n    var api8c = $('#example-8c').chart({dataset: dataset8, type: 'completion-target'}).data('chart');\n  });\n```\n\n<!-- this is the same progress chart using the WebComponent -->\n```html\n<ids-progress-chart label=\"New Progress Chart\" progress=\"13\" label-progress=\"13h\" color=\"#D66221\"></ids-progress-chart>\n```\n"}},{"name":"ids-radar-chart","attributes":[{"name":"initialized","values":[]},{"name":"svg","values":[]},{"name":"svg-container","values":[]},{"name":"empty-message","values":[]},{"name":"legend","values":[]},{"name":"datasource","description":"Reference to datasource API","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"on-locale-change","values":[]},{"name":"on-language-change","values":[]},{"name":"data","description":"Set the chart data","values":[]},{"name":"width","description":"Set the chart width","values":[]},{"name":"height","description":"Set the chart height","values":[]},{"name":"levels","description":"Set the number of levels (concentric circles)","values":[]},{"name":"max-value","description":"Set the maximum value","values":[]},{"name":"label-factor","description":"Set the label factor (distance from center)","values":[]},{"name":"wrap-width","description":"Set the wrap width for labels","values":[]},{"name":"opacity-area","description":"Set the area opacity","values":[]},{"name":"dot-radius","description":"Set the dot radius","values":[]},{"name":"opacity-circles","description":"Set the circle opacity","values":[]},{"name":"stroke-width","description":"Set the stroke width","values":[]},{"name":"round-strokes","description":"Set whether to use round strokes","values":[]},{"name":"show-crosslines","description":"Set whether to show crosslines","values":[]},{"name":"show-axis-labels","description":"Set whether to show axis labels","values":[]},{"name":"axis-formatter","description":"Set the axis formatter","values":[]},{"name":"suppress-tooltips","description":"Set whether to suppress tooltips","values":[]},{"name":"title","description":"Set the chart title element for accessibility","values":[]},{"name":"show-legend","description":"Set whether to show the legend","values":[]},{"name":"default-selectable","values":[]}],"description":{"kind":"markdown","value":"# Ids Radar Chart Component\n\n## Description\n\nThe IDS Radar Chart component is a web component for displaying multivariate data in the form of a two-dimensional chart with three or more quantitative variables represented on axes starting from the same point. It's also known as a spider chart or star chart.\n\n## Use Cases\n\n- Comparing multiple data series across several dimensions\n- Performance analysis across different metrics\n- Skills assessment visualization\n- Product comparison charts\n- Risk assessment displays\n\n## Terminology\n\n- **Radar Chart**: A graphical method of displaying multivariate data\n- **Axes**: The lines radiating from the center representing different variables\n- **Series**: A set of data points forming a polygon on the chart\n- **Levels**: Concentric circles showing value ranges\n\n## Features (With Code Examples)\n\nA radar chart displays data as a polygon on a circular grid with multiple axes.\n\n```html\n<ids-radar-chart>\n</ids-radar-chart>\n```\n\n### Basic Example\n\n```html\n<ids-radar-chart id=\"radar-chart-example\"></ids-radar-chart>\n\n<script>\n  const radarChart = document.querySelector('#radar-chart-example');\n  radarChart.data = [{\n    name: 'Series 1',\n    data: [\n      { name: 'Speed', value: 80 },\n      { name: 'Reliability', value: 90 },\n      { name: 'Comfort', value: 70 },\n      { name: 'Safety', value: 85 },\n      { name: 'Efficiency', value: 75 }\n    ]\n  }, {\n    name: 'Series 2',\n    data: [\n      { name: 'Speed', value: 70 },\n      { name: 'Reliability', value: 85 },\n      { name: 'Comfort', value: 90 },\n      { name: 'Safety', value: 80 },\n      { name: 'Efficiency', value: 85 }\n    ]\n  }];\n</script>\n```\n\n### Setting Chart Dimensions\n\n```html\n<ids-radar-chart width=\"500\" height=\"400\"></ids-radar-chart>\n```\n\n### Customizing Levels and Maximum Value\n\n```html\n<ids-radar-chart levels=\"5\" max-value=\"100\"></ids-radar-chart>\n```\n\n### Customizing Appearance\n\n```html\n<ids-radar-chart \n  opacity-area=\"0.3\" \n  dot-radius=\"4\" \n  stroke-width=\"2\"\n  show-crosslines=\"true\"\n  show-axis-labels=\"true\">\n</ids-radar-chart>\n```\n\n### Interactive Legend (Built-in)\n\nThe legend is automatically interactive when `selectable=\"true\"` is set. No additional code is required:\n\n```html\n<ids-radar-chart \n  selectable=\"true\" \n  show-legend=\"true\" \n  legend-placement=\"right\">\n</ids-radar-chart>\n\n<script>\n  const chart = document.querySelector('ids-radar-chart');\n  chart.data = [\n    {\n      name: 'Product A',\n      data: [\n        { name: 'Speed', value: 80 },\n        { name: 'Quality', value: 90 }\n      ]\n    },\n    {\n      name: 'Product B',\n      data: [\n        { name: 'Speed', value: 70 },\n        { name: 'Quality', value: 85 }\n      ]\n    }\n  ];\n\n  // Listen for selection events\n  chart.addEventListener('selected', (e) => {\n    console.log('Selected:', e.detail.data.name);\n  });\n\n  chart.addEventListener('deselected', (e) => {\n    console.log('Deselected:', e.detail.data.name);\n  });\n</script>\n```\n\n**Features:**\n- Click legend items to select/deselect series\n- Click chart areas to select/deselect series  \n- Visual feedback with highlighting and dimming\n- Automatic legend state updates\n- Event firing for `selected` and `deselected`\n\n## Settings and Attributes\n\n### Attributes\n\n- `data` {Array} - The chart data array\n- `width` {string|number} - Chart width\n- `height` {string|number} - Chart height\n- `levels` {number} - Number of concentric circles (default: 4)\n- `max-value` {number} - Maximum value for the chart (auto-calculated if not set)\n- `label-factor` {number} - Distance multiplier for axis labels (default: 1.27)\n- `wrap-width` {number} - Width for text wrapping (default: 60)\n- `opacity-area` {number} - Opacity of filled areas (default: 0.2)\n- `dot-radius` {number} - Radius of data point dots (default: 3)\n- `opacity-circles` {number} - Opacity of background circles (default: 0)\n- `stroke-width` {number} - Width of stroke lines (default: 1)\n- `round-strokes` {boolean} - Use rounded stroke paths (default: true)\n- `show-crosslines` {boolean} - Show axis lines (default: true)\n- `show-axis-labels` {boolean} - Show percentage labels (default: true)\n- `axis-formatter` {string} - Format string for axis labels (default: '.0%')\n- `suppress-tooltips` {boolean} - Disable tooltips (default: false)\n- `selectable` {boolean} - Enable selection (default: true)\n- `legend-placement` {string} - Legend position: 'right' or 'bottom' (default: 'right')\n- `show-legend` {boolean} - Show/hide legend (default: true)\n- `title` {string} - Chart title for accessibility\n\n## Data Format\n\nThe data should be an array of series objects:\n\n```javascript\n[\n  {\n    name: 'Series Name',\n    color: '#1f77b4', // Optional custom color\n    selected: false, // Optional pre-selection\n    data: [\n      {\n        name: 'Axis Name',\n        shortName: 'Short', // Optional short name for small screens\n        abbrName: 'Abbr', // Optional abbreviated name\n        value: 75,\n        tooltip: 'Custom tooltip text' // Optional custom tooltip\n      }\n      // ... more data points\n    ]\n  }\n  // ... more series\n]\n```\n\n## Events\n\n- `rendered` - Fires when the chart is rendered\n- `selected` - Fires when a series is selected\n- `deselected` - Fires when a series is deselected\n\n```javascript\nradarChart.addEventListener('selected', (e) => {\n  console.log('Selected:', e.detail);\n});\n```\n\n## Methods\n\n### `setSelected(options)`\n\nProgrammatically select a series.\n\n```javascript\nradarChart.setSelected({ index: 0 });\n```\n\n### `getSelected()`\n\nGet currently selected series information.\n\n```javascript\nconst selected = radarChart.getSelected();\n```\n\n## Accessibility\n\nThe radar chart component follows WAI-ARIA guidelines:\n\n- Supports keyboard navigation for interactive elements\n- Provides accessible tooltips and labels\n- Uses appropriate color contrast ratios\n- Supports screen readers with proper ARIA labels\n\n## Responsive Design\n\nThe chart automatically adjusts to container size and provides:\n\n- Responsive legend placement\n- Adaptive label sizing based on available space\n- Mobile-friendly touch interactions\n- Flexible dimensions\n\n## Browser Support\n\n- All modern browsers supporting Web Components\n- Mobile browsers (iOS Safari, Chrome Mobile)\n\n## Theming\n\nThe component uses CSS custom properties for theming:\n\n```css\nids-radar-chart {\n  --ids-chart-color-1: #1f77b4;\n  --ids-chart-color-2: #ff7f0e;\n  /* ... more color variables */\n}\n```\n\n## Converting from Previous Versions (4.x)\n\nThe new radar chart component provides similar functionality with improved performance and accessibility. Key differences:\n\n- Uses Web Components instead of jQuery\n- Simplified data format\n- TypeScript support\n- Improved accessibility\n- CSS custom properties for theming\n"}},{"name":"ids-radio-group","attributes":[{"name":"is-form-component","values":[]},{"name":"checked","values":[]},{"name":"#in-flex-observer","values":[]},{"name":"radios","description":"Get child ids-radio buttons in this group","values":[]},{"name":"radios-selected","description":"Get the selected child ids-radio button in this group","values":[]},{"name":"input","values":[]},{"name":"label-el","values":[]},{"name":"disabled","description":"Sets checkbox to disabled","values":[]},{"name":"horizontal","description":"Flips the checkbox orientation to horizontal","values":[]},{"name":"label","description":"Set the `label` text","values":[]},{"name":"label-required","description":"Sets the checkbox to required","values":[]},{"name":"value","description":"Sets the checkbox `value` attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-radio\n\n## Description\n\nThe ids-radio is a Web Component wrapper around a standard `<input type=\"radio\">`, while the ids-radio-group is a wrapper around a list of radio buttons. They each include API for setting states, groups, labels, and more. See more [usage details](https://design.infor.com/components/components/radios).\n\n## Terminology\n\n- **Radio Button:** A standard basic radio button element. It can be set to checked, unchecked and disabled.\n- **Label:** An `HTMLLabelElement` to keep matching with `HTMLInputElement`. The IDS Radio Group will add a pseudo UI `*` for required elements.\n\n## Features (With Code Samples)\n\n### Radios\n\nA standard unchecked radio button:\n\n```html\n<ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n```\n\nSet a `checked` radio:\n\n```html\n<ids-radio value=\"opt1\" label=\"Option one\" checked=\"true\"></ids-radio>\n```\n\nAdd an unchecked, `disabled` radio:\n\n```html\n<ids-radio value=\"opt1\" label=\"Option one\" disabled=\"true\"></ids-radio>\n```\n\nAdd a `checked`, `disabled` radio:\n\n```html\n<ids-radio value=\"opt1\" label=\"Option one\" checked=\"true\" disabled=\"true\"></ids-radio>\n```\n### Radio Groups\n\nA standard unchecked radio group element:\n\n```html\n<ids-radio-group label=\"Select delivery method\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a `checked` radio within a radio group.\n\n```html\n<ids-radio-group label=\"Select delivery method\">\n  <ids-radio value=\"opt1\" label=\"Option one\" checked=\"true\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a radio group without a label.\n\n```html\n<ids-radio-group>\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\" checked=\"true\"></ids-radio>\n</ids-radio-group>\n```\n\nSet the value and the radio group to `checked`:\n\n```html\n<ids-radio-group label=\"Select delivery method\" value=\"opt1\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a radio group as `disabled`, which disables all radios within:\n\n```html\n<ids-radio-group label=\"Select delivery method\" disabled=\"true\">\n  <ids-radio value=\"opt1\" label=\"Option one\" checked=\"true\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a `disabled` item within the radio group:\n\n```html\n<ids-radio-group label=\"Select delivery method\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\" checked=\"true\"></ids-radio>\n  <ids-radio value=\"opt3\" label=\"Option three\" disabled=\"true\"></ids-radio>\n</ids-radio-group>\n```\n\nSet validation `required` to radio group:\n\n```html\n<ids-radio-group label=\"Select delivery method\" validate=\"required\" id=\"ids-radio-validation\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n  <ids-radio value=\"opt3\" label=\"Option three\" disabled=\"true\"></ids-radio>\n</ids-radio-group>\n<button id=\"btn-radio-validate\">Validate</button>\n```\n\nYou can also check validation with the JS API.\n\n```javascript\ndocument.querySelector('#btn-radio-validate').addEventListener('click', () => {\n  const radio = document.querySelector('#ids-radio-validation');\n  radio.checkValidation();\n});\n```\n\nSet validation `required` to radio group without label required indicator:\n\n```html\n<ids-radio-group label=\"Select delivery method\" label-required=\"false\" validate=\"required\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet the radio group as `horizontal`:\n\n```html\n<ids-radio-group label=\"Select delivery method\" horizontal=\"true\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\" checked=\"true\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a radio with inline label positioning and label-break behavior:\n\n```html\n<!-- Default: label and radio stay on same line -->\n<ids-radio value=\"opt1\" label=\"Option one\" label-position=\"inline-start\" label-width=\"200px\"></ids-radio>\n\n<!-- Same as above (shrink-value is default) -->\n<ids-radio value=\"opt2\" label=\"Option two\" label-position=\"inline-start\" label-width=\"200px\" label-break=\"shrink-value\"></ids-radio>\n\n<!-- Label text stacks above radio indicator -->\n<ids-radio value=\"opt3\" label=\"Option three\" label-position=\"inline-start\" label-width=\"200px\" label-break=\"break\"></ids-radio>\n```\n\nAlign the radio group label text to the end of its fixed-width area:\n\n```html\n<ids-radio-group label=\"Payment methods\" label-position=\"inline-start\" label-width=\"250px\" label-alignment=\"end\">\n  <ids-radio value=\"cash\" label=\"Cash\" checked></ids-radio>\n  <ids-radio value=\"credit\" label=\"Credit card\"></ids-radio>\n  <ids-radio value=\"bank\" label=\"Bank transfer\"></ids-radio>\n</ids-radio-group>\n```\n\n## Settings (Attributes) - Radios\n\n- `checked` {boolean} Sets the checked state.\n- `disabled` {boolean} Sets the disabled state.\n- `group-disabled` {boolean} Sets disabled state, if group disabled.\n- `horizontal` {boolean} Sets the radio layout inline as horizontal.\n- `label` {string} Sets the label text.\n- `validation-has-error` {boolean} Sets the validation error state.\n- `value` {string} Sets the radio value.\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-break` {string} Controls how the label behaves when used with `label-position=\"inline-start\"`. Options are:\n  - `shrink-value` (default): Label and radio stay on the same line, label does not shrink\n  - `break`: Label text appears above the radio indicator, stacked vertically\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n\n## Settings (Attributes) - Radio Groups\n\n- `disabled` {boolean} Sets the disabled state.\n- `hidden` {boolean} Hides the element from display.\n- `horizontal` {boolean} Set radio group layout inline as horizontal.\n- `label` {string} Sets the label text.\n- `label-alignment` {string} Controls the horizontal text alignment of the group label within its fixed-width area when using inline positioning. Options are:\n  - `start` (default): Label text aligns to the start of the label area\n  - `end`: Label text aligns to the end of the label area (right in LTR, left in RTL)\n- `label-required` {boolean} Set validation `required` indicator, default is set to `true`.\n- `validate` {string} Set the validation rule `required`.\n- `validation-events` {string} Sets the validation events. Use `space` to add multiple. Defaults to `change`.\n- `value` {string} Sets the radio group value, will set as checked the matching radio value in list.\n\n## Themeable Parts\n\n- `radio` allows you to further style the actual radio input element\n- `circle` allows you to further style the visible circle element\n- `label` allows you to further style the label text element\n\n## States and Variations\n\n- Unchecked\n- Checked/Selected\n- Hover\n- Disabled\n- Focus\n- Error\n- Dirty (Not supported on this component)\n- Active\n\n## Responsive Guidelines\n\n- The default display is set to vertical, but you can use the `horizontal` attribute set to `true` for horizontal layout.\n- The default display is set as `block`, but you can change it to `inline-block` by setting the `horizontal` attribute to `true`.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Radio button styles were implemented in 4.0.0\n- Radio buttons were CSS-only components\n\n**4.x to 5.x**\n\n- Radio component has changed to a custom element `<ids-radio-group></ids-radio-group>`\n- Individual radio buttons are standalone custom elements `<ids-radio></ids-radio>` and are slotted into groups\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n### Converting from 4.x\n\nRadio Buttons are now standalone web components instead of being defined only with CSS styles:\n\n```html\n<!-- 4.x radio example -->\n<div class=\"field\">\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt1\" id=\"option1\" />\n  <label for=\"option1\" class=\"radio-label\">Option one</label>\n</div>\n\n<!-- This is the same radio using a WebComponent -->\n<ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n```\n\nThe same rules apply to Radio Groups, which are also now standalone web components:\n\n```html\n<!-- 4.x radio group example -->\n<fieldset class=\"radio-group\">\n  <legend>Select delivery method</legend>\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt1\" id=\"option1\" />\n  <label for=\"option1\" class=\"radio-label\">Option one</label>\n  <br/>\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt2\" checked=\"true\" id=\"option2\" />\n  <label for=\"option2\"  class=\"radio-label\">Option two</label>\n  <br/>\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt3\" id=\"option3\" />\n  <label for=\"option3\" class=\"radio-label\">Option three</label>\n  <br/>\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt4\" disabled=\"true\" id=\"option4\" />\n  <label for=\"option4\" class=\"radio-label\">Option four</label>\n</fieldset>\n\n<!-- this is the same radio group using the WebComponent -->\n<ids-radio-group label=\"Select delivery method\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\" checked=\"true\"></ids-radio>\n  <ids-radio value=\"opt3\" label=\"Option three\"></ids-radio>\n  <ids-radio value=\"opt4\" label=\"Option four\" disabled=\"true\"></ids-radio>\n</ids-radio-group>\n```\n"}},{"name":"ids-radio","attributes":[{"name":"input","values":[]},{"name":"label-el","values":[]},{"name":"root-el","values":[]},{"name":"checked","description":"Set `checked` attribute","values":[]},{"name":"disabled","description":"Set `disabled` attribute","values":[]},{"name":"group-disabled","description":"Set `group-disabled` attribute","values":[]},{"name":"horizontal","description":"Set `horizontal` attribute `inline|block`, default as `block`","values":[]},{"name":"label","description":"Set the `label` text","values":[]},{"name":"validation-has-error","description":"Set `validation-has-error` attribute","values":[]},{"name":"value","description":"Set the `value` attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-radio\n\n## Description\n\nThe ids-radio is a Web Component wrapper around a standard `<input type=\"radio\">`, while the ids-radio-group is a wrapper around a list of radio buttons. They each include API for setting states, groups, labels, and more. See more [usage details](https://design.infor.com/components/components/radios).\n\n## Terminology\n\n- **Radio Button:** A standard basic radio button element. It can be set to checked, unchecked and disabled.\n- **Label:** An `HTMLLabelElement` to keep matching with `HTMLInputElement`. The IDS Radio Group will add a pseudo UI `*` for required elements.\n\n## Features (With Code Samples)\n\n### Radios\n\nA standard unchecked radio button:\n\n```html\n<ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n```\n\nSet a `checked` radio:\n\n```html\n<ids-radio value=\"opt1\" label=\"Option one\" checked=\"true\"></ids-radio>\n```\n\nAdd an unchecked, `disabled` radio:\n\n```html\n<ids-radio value=\"opt1\" label=\"Option one\" disabled=\"true\"></ids-radio>\n```\n\nAdd a `checked`, `disabled` radio:\n\n```html\n<ids-radio value=\"opt1\" label=\"Option one\" checked=\"true\" disabled=\"true\"></ids-radio>\n```\n### Radio Groups\n\nA standard unchecked radio group element:\n\n```html\n<ids-radio-group label=\"Select delivery method\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a `checked` radio within a radio group.\n\n```html\n<ids-radio-group label=\"Select delivery method\">\n  <ids-radio value=\"opt1\" label=\"Option one\" checked=\"true\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a radio group without a label.\n\n```html\n<ids-radio-group>\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\" checked=\"true\"></ids-radio>\n</ids-radio-group>\n```\n\nSet the value and the radio group to `checked`:\n\n```html\n<ids-radio-group label=\"Select delivery method\" value=\"opt1\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a radio group as `disabled`, which disables all radios within:\n\n```html\n<ids-radio-group label=\"Select delivery method\" disabled=\"true\">\n  <ids-radio value=\"opt1\" label=\"Option one\" checked=\"true\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a `disabled` item within the radio group:\n\n```html\n<ids-radio-group label=\"Select delivery method\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\" checked=\"true\"></ids-radio>\n  <ids-radio value=\"opt3\" label=\"Option three\" disabled=\"true\"></ids-radio>\n</ids-radio-group>\n```\n\nSet validation `required` to radio group:\n\n```html\n<ids-radio-group label=\"Select delivery method\" validate=\"required\" id=\"ids-radio-validation\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n  <ids-radio value=\"opt3\" label=\"Option three\" disabled=\"true\"></ids-radio>\n</ids-radio-group>\n<button id=\"btn-radio-validate\">Validate</button>\n```\n\nYou can also check validation with the JS API.\n\n```javascript\ndocument.querySelector('#btn-radio-validate').addEventListener('click', () => {\n  const radio = document.querySelector('#ids-radio-validation');\n  radio.checkValidation();\n});\n```\n\nSet validation `required` to radio group without label required indicator:\n\n```html\n<ids-radio-group label=\"Select delivery method\" label-required=\"false\" validate=\"required\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\"></ids-radio>\n</ids-radio-group>\n```\n\nSet the radio group as `horizontal`:\n\n```html\n<ids-radio-group label=\"Select delivery method\" horizontal=\"true\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\" checked=\"true\"></ids-radio>\n</ids-radio-group>\n```\n\nSet a radio with inline label positioning and label-break behavior:\n\n```html\n<!-- Default: label and radio stay on same line -->\n<ids-radio value=\"opt1\" label=\"Option one\" label-position=\"inline-start\" label-width=\"200px\"></ids-radio>\n\n<!-- Same as above (shrink-value is default) -->\n<ids-radio value=\"opt2\" label=\"Option two\" label-position=\"inline-start\" label-width=\"200px\" label-break=\"shrink-value\"></ids-radio>\n\n<!-- Label text stacks above radio indicator -->\n<ids-radio value=\"opt3\" label=\"Option three\" label-position=\"inline-start\" label-width=\"200px\" label-break=\"break\"></ids-radio>\n```\n\nAlign the radio group label text to the end of its fixed-width area:\n\n```html\n<ids-radio-group label=\"Payment methods\" label-position=\"inline-start\" label-width=\"250px\" label-alignment=\"end\">\n  <ids-radio value=\"cash\" label=\"Cash\" checked></ids-radio>\n  <ids-radio value=\"credit\" label=\"Credit card\"></ids-radio>\n  <ids-radio value=\"bank\" label=\"Bank transfer\"></ids-radio>\n</ids-radio-group>\n```\n\n## Settings (Attributes) - Radios\n\n- `checked` {boolean} Sets the checked state.\n- `disabled` {boolean} Sets the disabled state.\n- `group-disabled` {boolean} Sets disabled state, if group disabled.\n- `horizontal` {boolean} Sets the radio layout inline as horizontal.\n- `label` {string} Sets the label text.\n- `validation-has-error` {boolean} Sets the validation error state.\n- `value` {string} Sets the radio value.\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-break` {string} Controls how the label behaves when used with `label-position=\"inline-start\"`. Options are:\n  - `shrink-value` (default): Label and radio stay on the same line, label does not shrink\n  - `break`: Label text appears above the radio indicator, stacked vertically\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n\n## Settings (Attributes) - Radio Groups\n\n- `disabled` {boolean} Sets the disabled state.\n- `hidden` {boolean} Hides the element from display.\n- `horizontal` {boolean} Set radio group layout inline as horizontal.\n- `label` {string} Sets the label text.\n- `label-alignment` {string} Controls the horizontal text alignment of the group label within its fixed-width area when using inline positioning. Options are:\n  - `start` (default): Label text aligns to the start of the label area\n  - `end`: Label text aligns to the end of the label area (right in LTR, left in RTL)\n- `label-required` {boolean} Set validation `required` indicator, default is set to `true`.\n- `validate` {string} Set the validation rule `required`.\n- `validation-events` {string} Sets the validation events. Use `space` to add multiple. Defaults to `change`.\n- `value` {string} Sets the radio group value, will set as checked the matching radio value in list.\n\n## Themeable Parts\n\n- `radio` allows you to further style the actual radio input element\n- `circle` allows you to further style the visible circle element\n- `label` allows you to further style the label text element\n\n## States and Variations\n\n- Unchecked\n- Checked/Selected\n- Hover\n- Disabled\n- Focus\n- Error\n- Dirty (Not supported on this component)\n- Active\n\n## Responsive Guidelines\n\n- The default display is set to vertical, but you can use the `horizontal` attribute set to `true` for horizontal layout.\n- The default display is set as `block`, but you can change it to `inline-block` by setting the `horizontal` attribute to `true`.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Radio button styles were implemented in 4.0.0\n- Radio buttons were CSS-only components\n\n**4.x to 5.x**\n\n- Radio component has changed to a custom element `<ids-radio-group></ids-radio-group>`\n- Individual radio buttons are standalone custom elements `<ids-radio></ids-radio>` and are slotted into groups\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n### Converting from 4.x\n\nRadio Buttons are now standalone web components instead of being defined only with CSS styles:\n\n```html\n<!-- 4.x radio example -->\n<div class=\"field\">\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt1\" id=\"option1\" />\n  <label for=\"option1\" class=\"radio-label\">Option one</label>\n</div>\n\n<!-- This is the same radio using a WebComponent -->\n<ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n```\n\nThe same rules apply to Radio Groups, which are also now standalone web components:\n\n```html\n<!-- 4.x radio group example -->\n<fieldset class=\"radio-group\">\n  <legend>Select delivery method</legend>\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt1\" id=\"option1\" />\n  <label for=\"option1\" class=\"radio-label\">Option one</label>\n  <br/>\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt2\" checked=\"true\" id=\"option2\" />\n  <label for=\"option2\"  class=\"radio-label\">Option two</label>\n  <br/>\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt3\" id=\"option3\" />\n  <label for=\"option3\" class=\"radio-label\">Option three</label>\n  <br/>\n  <input type=\"radio\" class=\"radio\" name=\"options\" value=\"opt4\" disabled=\"true\" id=\"option4\" />\n  <label for=\"option4\" class=\"radio-label\">Option four</label>\n</fieldset>\n\n<!-- this is the same radio group using the WebComponent -->\n<ids-radio-group label=\"Select delivery method\">\n  <ids-radio value=\"opt1\" label=\"Option one\"></ids-radio>\n  <ids-radio value=\"opt2\" label=\"Option two\" checked=\"true\"></ids-radio>\n  <ids-radio value=\"opt3\" label=\"Option three\"></ids-radio>\n  <ids-radio value=\"opt4\" label=\"Option four\" disabled=\"true\"></ids-radio>\n</ids-radio-group>\n```\n"}},{"name":"ids-rating","attributes":[{"name":"rating-arr","values":[]},{"name":"value","description":"Sets the value attribute","values":[]},{"name":"stars","description":"Sets the stars attribute","values":[]},{"name":"disabled","description":"Sets the disabled state","values":[]},{"name":"readonly","description":"Sets the readonly attribute","values":[]},{"name":"size","description":"Sets the size attribute","values":[]}],"description":{"kind":"markdown","value":"# Ids Rating\n\n## Description\n\nAllows for the display or selection of an objects rating.\n\n## Usage\n\nThe rating component displays a scale of selectable values in ascending order. A user can select a rating by clicking the star with the position that corresponds to the users rating out of the total. Best for showing a user's current selection relative to the lower and upper limits of a scale.\n\n## Code Examples\n\nThe rating component can be used as an interactive or read only element. Users may select any whole value out of the total as a rating. When functioning as a read-only element, ratings may use .5 decimals to more accurately display the average rating of an object.\n\nA basic rating with 5 stars by default and none checked.\n\n```html\n<ids-rating></ids-rating>\n```\n\nA rating rating with 4.5/5 which is also readonly. If using half stars the rating component should be readonly as you cannot click half stars in any way with the UI.\n\n```html\n<ids-rating stars=\"5\" readonly=\"true\" value=\"4.5\" size=\"large\"></ids-rating>\n```\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the rating item is enabled this will focus or unfocus the star.\n- <kbd>Enter</kbd>: If this will follow the link url or action.\n\n## Accessibility Guidelines\n\n- `aubible` span are added for screen readers to hear the star information.\n\n## Settings and Attributes\n\n- `stars` {number} Sets the stars attribute to displayed the amount of items`stars=\"5\"`\n- `value` {number} Sets the rating value attribute. `value=\"0\"`\n- `readyonly` {boolean} Sets the readonly attribute. Valid values are 'true' | 'false'\n- `size` {number} Sets the rating size attribute. `size=\"large\"` Valid values are 'small' | 'medium' | 'large'\n- `disabled` {boolean} Sets the disabled state\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Rating component was added in v4.0.0\n- Can be invoked on an element with `$('#my-element').rating();`\n\n**4.x to 5.x**\n\n- Rating is now a custom element `<ids-rating></ids-rating>`\n\n### Version - 4.x\n\n```html\n  <div class=\"rating\">\n  <input type=\"radio\" class=\"is-filled\" name=\"rating-name\" id=\"one-star-id1\"/>\n  <label for=\"one-star-id1\">\n    <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\">\n      <use href=\"#icon-star-filled\"/>\n    </svg>\n    <span class=\"audible\">1 out of 5 Stars</span>\n  </label>\n\n  <input type=\"radio\" class=\"is-filled\" name=\"rating-name\" id=\"two-star-id1\"/>\n  <label for=\"two-star-id1\">\n    <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\">\n      <use href=\"#icon-star-filled\"/>\n    </svg>\n    <span class=\"audible\">2 out of 5 Stars</span>\n  </label>\n\n  <input type=\"radio\" class=\"is-filled\" name=\"rating-name\" id=\"three-star-id1\"/>\n  <label for=\"three-star-id1\">\n    <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\">\n      <use href=\"#icon-star-filled\"/>\n    </svg>\n    <span class=\"audible\">3 out of 5 Stars</span>\n  </label>\n\n  <input type=\"radio\" class=\"is-half\" checked name=\"rating-name\" id=\"four-star-id1\"/>\n  <label for=\"four-star-id1\">\n    <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\">\n      <use href=\"#icon-star-half\"/>\n    </svg>\n    <span class=\"audible\">4 out of 5 Stars</span>\n  </label>\n\n  <input type=\"radio\" name=\"rating-name\" id=\"five-star-id1\"/>\n  <label for=\"five-star-id1\">\n    <svg class=\"icon\" focusable=\"false\" aria-hidden=\"true\">\n      <use href=\"#icon-star-filled\"/>\n    </svg>\n    <span class=\"audible\">5 out of 5 Stars</span>\n  </label>\n  </div>\n```\n\n### Version - 5.x\n\n```html\n  <ids-rating></ids-rating>\n```\n"}},{"name":"ids-scroll-view","attributes":[{"name":"vetoable-event-types","values":[]},{"name":"#active-number","description":"Current active slide index","values":[]},{"name":"#is-click-or-key","description":"State of action by click or keyboard","values":[]},{"name":"as-nav","description":"Get whether the scroll view is in navigation mode","values":[]},{"name":"circle-buttons","description":"Get the list of circle buttons","values":[]},{"name":"controls","description":"Get the controls container","values":[]},{"name":"hide-on-one","description":"Get whether to hide controls when only one page is present","values":[]},{"name":"loop","description":"Get whether looping is enabled","values":[]},{"name":"show-tooltip","description":"Get whether tooltips are shown for circle buttons","values":[]},{"name":"suppress-controls","description":"Get whether controls are suppressed","values":[]},{"name":"object-fit-values","description":"Valid object-fit values","values":[]},{"name":"object-fit","description":"Set the object-fit style for slotted images","values":[]}],"description":{"kind":"markdown","value":"# ids-scroll-view\n\n## Description\n\nThe scroll view component allows swipe and scroll in between a number of slides/tabs or pages. The user can click the circle buttons or swipe left or right to activate adjacent page/slide/tabs. This component is roughly similar to the previous \"Circle Pager\". Its also similar to a \"Carousel\".\n\n## Use Cases\n\n- Use when a user is primarily a mobile user and they need to flip through a set of related objects or pages.\n- Do Not Use as a dumping ground for content or for primary / main interaction\n\n## Terminology\n\n- **Circle Pager**: The older 4.x name for his component\n- **Carousel**: Another name for this sort of component with slides and buttons\n\n## Settings and Attributes\n\n- `hide-on-one` {boolean} configures the circle buttons to hide if only one page is present\n- `loop` {boolean} sets the loop, true will loop back after next/previous reached to end\n- `object-fit` {string} controls how slotted images are resized within their container. Valid values: `contain`, `cover`, `fill`, `none`, `scale-down`. Default is `cover` when used with `as-nav`.\n- `show-tooltip` {boolean} sets the tooltip for circle buttons\n- `suppress-controls` {boolean} sets suppress controls for circle buttons\n\n## Themeable Parts\n\n- `container` allows you to further style the parent container element\n- `scroll-view` allows you to further style the scrolling container\n- `controls` allows you to further style the control button area\n- `scroll-view-button` allows you to further style the individual circle buttons in the carousel\n\n## Events\n\n- `beforefirst` Fires before move to first slide, you can return false in the response to veto\n- `beforeprevious` Fires before move to previous slide, you can return false in the response to veto\n- `beforenext` Fires before move to next slide, you can return false in the response to veto\n- `beforelast` Fires before move to last slide, you can return false in the response to veto\n- `beforeslideto` Fires before move to given slide, you can return false in the response to veto\n- `scrolled` Fires after each slide move\n\n## Methods\n\n- `first(): void` Move to first slide\n- `previous(): void` Move to previous slide\n- `next(): void` Move to next slide\n- `last(): void` Move to last slide\n- `slideTo(slideNumber: number): void` Slide to given slide number\n- `currentSlideNumber(): number | undefined` Get the current slide number\n\n## Features (With Code Examples)\n\nA scrollview with images. You just need to add each element to the scroll view. Each of the immediate children should get `slot=\"scroll-view-item\"`. If using images the `alt` tag is very important for accessibility. As a tip you can add \"Slide N\" or similar text to the alt tag as it helps screen reader users for context.\n\n```html\n<ids-scroll-view>\n  <img slot=\"scroll-view-item\" src=\"../assets/images/camera-1.png\" alt=\"Slide 1, Sony Camera, Front\"/>\n  <img slot=\"scroll-view-item\" src=\"../assets/images/camera-2.png\" alt=\"Slide 3, Sony Camera, Back Display\"/>\n  <img slot=\"scroll-view-item\" src=\"../assets/images/camera-3.png\" alt=\"Slide 3, Sony Camera, From Top\"/>\n  <img slot=\"scroll-view-item\" src=\"../assets/images/camera-4.png\" alt=\"Slide 4, Olympus Camera, Front\"/>\n  <img slot=\"scroll-view-item\" src=\"../assets/images/camera-5.png\" alt=\"Slide 5, Olympus Camera, Exposed to water\"/>\n  <img slot=\"scroll-view-item\" src=\"../assets/images/camera-6.png\" alt=\"Slide 6, Sony E-mount Camera, Front\"/>\n</ids-scroll-view>\n```\n\n## States and Variations\n\n- Focus\n- Active Slide\n- Scrolling\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: Tabs you into the sider control area\n- <kbd>ArrowLeft / ArrowRight</kbd>: Moves to the next or previous slide\n\n## Responsive\n\n- The container will respect the width and size of its parent flowing if necessary. If using images they may stretch so you may need to constrain the contain.\n\n## Mobile Guidelines\n\n- Swipe left or swipe right will do the same as clicking the next button in the list of buttons\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Circle Pager component replaced `.inforCarousel()` and `.circlePage()` from 3.x in a more limited fashion\n\n**4.x to 5.x**\n\n- IdsScrollView component replaces Circle Pager from the previous version and adds swiping\n- Markup has changed to a custom element `<ids-scroll-view></ids-scroll-view>`\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n\n## Accessibility Guidelines\n\n- The first tab activated the list of tabs (the circle buttons)\n- Left and up key expose the previous or next slide\n- Only interactive elements on the visible slide can get focus\n- The tab container gets focus with the keyboard\n- The complementary landmark role is used to identify all the content and interactive controls associated with the carousel widget.\n- The landmark provides a means to navigate to and identify the carousel features.\n- `tablist` and `tab` roles are defined for the dots used to indicate the number of slides and which slide is selected.\n- `tabpanel` roles are defined for the slide content\n- `button` role is used to override semantics of the a element used to define the previous and next slide\n\n## Regional Considerations\n\nInternal Labels will be localized in the current language. The scroll direction and active button will be enabled. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-search-field","attributes":[{"name":"state","values":[]},{"name":"is-form-component","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"truncated-wrapper","description":"Get the truncated wrapper","values":[]},{"name":"expand-button","description":"Get the expand button","values":[]},{"name":"search-icon","description":"Get the search icon","values":[]},{"name":"#categories-popup","values":[]},{"name":"#categories-menu-button","values":[]},{"name":"#categories-action-button","values":[]},{"name":"categories","values":[]},{"name":"category","values":[]},{"name":"collapsible","description":"Get the collapsible state","values":[]},{"name":"collapsible-responsive","values":[]},{"name":"collapsed","values":[]},{"name":"truncated","values":[]},{"name":"keep-open-with-value","values":[]},{"name":"selected-categories","values":[]},{"name":"action","values":[]},{"name":"multiple","values":[]},{"name":"value","description":"Get the input value","values":[]},{"name":"#previous-search-value","values":[]},{"name":"elements","description":"Get a list of element dependencies for this component","values":[]},{"name":"#buttons","values":[]},{"name":"buttons","values":[]},{"name":"tabbable","values":[]},{"name":"disabled","description":"Sets the disabled attribute","values":[]},{"name":"readonly","description":"Sets the readonly attribute","values":[]},{"name":"id","description":"Sets the id internally and externally","values":[]},{"name":"format","description":"Return format","values":[]},{"name":"#input-focus-handler","values":[]},{"name":"#input-blur-handler","values":[]},{"name":"#input-keydown-handler","values":[]},{"name":"#button-focus-handlers","values":[]},{"name":"#button-blur-handlers","values":[]},{"name":"triggered-by-change","values":[]},{"name":"is-password-visible","description":"Check if this is a password field and the password should be shown as plain text","values":[]},{"name":"input","description":"Get the inner input element","values":[]},{"name":"form-input","description":"Get the inner input element (for form input mixin)","values":[]},{"name":"caps-lock-icon","description":"Get the caps lock indicator icon","values":[]},{"name":"field-container","description":"Get the field container element","values":[]},{"name":"label-text-el","description":"Get the inner ids-text element which contains the label text","values":[]},{"name":"label-el","description":"Get the inner label element","values":[]},{"name":"reveal-on-edit","description":"Sets whether reveal on edit is enabled (shows button only when editing)","values":[]},{"name":"revealable-password","description":"sets whether password reveal functionality is available","values":[]},{"name":"caps-lock","description":"sets whether capslock indicatoris enabled or disabled","values":[]},{"name":"password-visible","description":"sets whether the password is currently visible","values":[]},{"name":"square","description":"Get whether the input has square corners","values":[]},{"name":"disable-tooltip","description":"Get whether tooltip is disabled","values":[]},{"name":"#native-event-handler","values":[]},{"name":"#input-event-handler","values":[]},{"name":"active","description":"Get the active state","values":[]},{"name":"bg-transparent","description":"Get the background transparent state","values":[]},{"name":"browser-autocomplete","description":"Get the browser autocomplete setting","values":[]},{"name":"text-ellipsis","description":"Get the text ellipsis state","values":[]},{"name":"#label-el","description":"internal reference to a label element a user provides","values":[]},{"name":"placeholder","description":"Get the placeholder text","values":[]},{"name":"readonly-background","description":"Get whether readonly background is enabled","values":[]},{"name":"label-wrap","description":"Get the label wrap setting","values":[]},{"name":"size","description":"Get the size","values":[]},{"name":"text-align","description":"Get the text alignment","values":[]},{"name":"type","description":"Get the input type","values":[]},{"name":"cursor","description":"Get the cursor style","values":[]},{"name":"maxlength","description":"Get the max length","values":[]},{"name":"uppercase","description":"Get the uppercase state","values":[]},{"name":"lowercase","description":"Get the lowercase state","values":[]},{"name":"margin-block-end","description":"Gets the margin-block-end token key","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"padding","description":"Get the inner padding","values":[]},{"name":"overflow","description":"Get how content overflows","values":[]}],"description":{"kind":"markdown","value":"# Ids Search Field\n\n## Description\n\nA specific composition of existing components [Trigger Field](../ids-trigger-field/README.md) and [Input](../ids-input/README.md) meant for searching purposes. This is ideally placed in a header or at the top of a page so that users can search by typing on an input field.\n\n## Use Cases\n\n- Searching for a product on a market place\n\n## Settings\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `label` { string } title to describe the type of input\n- `value` { string } text value of the input\n- `placeholder` { string } text hint to show when input is empty\n- `disabled` { boolean } disallow editing input and tabbing interaction\n- `readonly` { boolean } disallow editing input\n- `categories` { string[] } an array of text that dictates what appears in the categories dropdown\n- `category` { string } sets the initial text that appears in the categories dropdown menu\n- `collapsible` { boolean } determines if the search field should be collapsible.\n- `collapsible-responsive` { string } enables collapsible behavior for the search field based on viewport size.\n- `selectedCategories` { string[] } returns an array of currently selected categories\n- `action` { string } if set, an action button will appear on the search field, and this button fires the \"search\" event\n- `multiple` { boolean } if true, this will allow multiple categories to be selected in the category menu\n- `aria-label` { string } sets the aria label value of the search field with the string appended to the setting\n\n## Events\n- `search` - Fires when the category action-button is clicked or when the `Enter` key is pressed.\n- `selected` - Fires after a Category is selected.\n- `deselected` - Fires after a Category is deselected.\n- `change` - Fires when the search field's input field is changed\n- `input` - Fires when typing in the search field's input field\n\n## Features (With Code Samples)\n\nUsing a custom label and initial value\n```html\n<ids-search-field label=\"Pokemon\" value=\"Pikachu\"></ids-search-field>\n```\n\nUsing a custom Placeholder\n```html\n<ids-search-field label=\"Pokemon\" placeholder=\"Type any Pokemon name\"></ids-search-field>\n```\n\nDisabled state\n```html\n<ids-search-field disabled label=\"Pokemon\" placeholder=\"Snorlax\" value=\"\"></ids-search-field>\n```\n\nRead-only state\n```html\n    <ids-search-field readonly label=\"Pokemon\" value=\"Lapras\"></ids-search-field>\n```\n\nCollapsible\n```html\n    <ids-search-field collapsible label=\"Collapsible\" value=\"Search...\"></ids-search-field>\n```\n\nCollapsible - Responsive\n```html\n    <ids-search-field collapsible-responsive=\"md\" label=\"Collapsible below md breakpoint\" value=\"Search...\"></ids-search-field>\n```\n\nSearch field with Categories\n```html\n  <ids-search-field label=\"Categories\" category=\"Files\" clearable></ids-search-field>\n```\n```js\ndocument.querySelector('ids-search-field[category]')?.categories = ['Images', 'Documents', 'Audio', 'Video'];\n```\n\nSearch field with Categories that specifies that multiple can be selected\n```html\n  <ids-search-field label=\"Categories - Multiple\" category=\"Files\" multiple></ids-search-field>\n```\n```js\ndocument.querySelector('ids-search-field[multiple]')?.categories = ['Images', 'Documents', 'Audio', 'Video'];\n```\n\nSearch field with short version Categories dropdown menu (category attribute not set)\n```html\n  <ids-search-field label=\"Categories - Short\"  id=\"categories-short\"></ids-search-field>\n```\n```js\ndocument.querySelector('#categories-short')?.categories = ['Images', 'Documents', 'Audio', 'Video'];\n```\nSearch field with a customized aria-label string value\n```html\n<ids-search-field label=\"Pokemon\" value=\"Pikachu\" aria-label=\"Search\"></ids-search-field>\n```\n\n## Responsive Guidelines\n\n- Because this component is simply an `ids-input` wrapped inside an `ids-trigger-field`, it will depend on the styling of those two components\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Searchfield is a new component added in v4.0.0\n- Searchfield is invoked with `$('#my-element').searchfield();`\n\n**4.x to 5.x**\n\n- Search Field is now a custom element `<ids-search-field></ids-search-field>`\n- Search Field extends IdsTriggerField and IdsInput, holding all functionality of those components\n\n### Converting from 4.x\n\n```html\n<!-- 4.x search field example -->\n<div class=\"field\">\n  <label for=\"searchfield\">Search</label>\n  <input id=\"searchfield\" name=\"searchfield\" class=\"searchfield\" data-options= \"{'clearable': 'true'}\" placeholder=\"Type a search term\"/>\n</div>\n\n<!-- this is the equivalent web component -->\n<ids-search-field label=\"Search\" placeholder=\"Type a seardch term\"></ids-search-field>\n"}},{"name":"ids-segmented-control","attributes":[{"name":"compact","values":[]},{"name":"toggle-buttons","description":"Get the toggle buttons","values":[]}],"description":{"kind":"markdown","value":"# Ids Segmented Control\n\n## Description\n\nThe IDS Segmented Control component is a UI element designed to group a series of toggle buttons, allowing users to select one option from a set. It acts as a container for ids-toggle-button elements, managing their state so that only one button can be active at any given time. When a button is selected, it is highlighted, and all other buttons in the group are reset to their default state. This component is ideal for creating segmented controls in user interfaces, where users need to choose between mutually exclusive options.\n\n## Use Cases\n\n- **Option Selection**: Use the IdsSegmentedControl to create a set of mutually exclusive options, such as selecting a view (e.g., list view vs. grid view), choosing a filter (e.g., most recent vs. most popular), or switching between different modes (e.g., edit vs. preview).\n- **Navigation**: Implement segmented controls for navigation within different sections of a UI, such as tabbed interfaces where each toggle button represents a different tab or view.\n- **Toolbars**: Integrate the segmented control into toolbars for applications, allowing users to toggle between different tools or settings with a single click.\n- **Forms**: Use in forms where a user needs to select one option out of several (e.g., selecting a payment method, choosing a subscription plan).\n\n## Terminology\n\n- **Segmented Control**: A UI component that groups multiple toggle buttons together, allowing users to select one option from a set. It ensures that only one button can be active at any time, with the others reverting to their default state.\n- **Toggle Button**: A button that can be switched between two states: active (pressed) and inactive (unpressed). In the context of a segmented control, a toggle button is used to represent an option within the control.\n- **Active State**: The state of a toggle button when it is selected or pressed. In a segmented control, the active state is visually distinguished (e.g., highlighted) and indicates the current selection.\n- **Default State**: The state of a toggle button when it is not selected. In a segmented control, buttons in the default state are not highlighted, indicating that they are not the current selection.\n- **Slot**: A placeholder within the segmented control's DOM structure where ids-toggle-button elements are placed. This allows for the flexible arrangement of toggle buttons within the segmented control component.\n- **CSS**: The `.ids-toggle-button-segmented` class is added to each toggle button within the segmented control to apply specific styling associated with the segmented control layout.\n\n## Features (With Code Examples)\n\n### Single Selection\n\nThe IdsSegmentedControl ensures that only one ids-toggle-button can be selected at a time. When a user clicks on a toggle button, it becomes active, and all other buttons are set to their default state.\n\n```html\n<ids-segmented-control>\n  <ids-toggle-button text-on=\"Option 1\" text-off=\"Option 1\"></ids-toggle-button>\n  <ids-toggle-button text-on=\"Option 2\" text-off=\"Option 2\"></ids-toggle-button>\n  <ids-toggle-button text-on=\"Option 3\" text-off=\"Option 3\"></ids-toggle-button>\n</ids-segmented-control>\n```\n\nIn this example, when one of the toggle buttons is clicked, it will become active, and the others will automatically deactivate.\n\n### Toggle Buttons Without Icons\n\nToggle buttons can be used without icons, relying solely on text to convey the option to the user.\n\n```html\n<ids-segmented-control>\n  <ids-toggle-button disable-icon text-on=\"Text Only 1\" text-off=\"Text Only 1\"></ids-toggle-button>\n  <ids-toggle-button disable-icon text-on=\"Text Only 2\" text-off=\"Text Only 2\"></ids-toggle-button>\n  <ids-toggle-button disable-icon text-on=\"Text Only 3\" text-off=\"Text Only 3\"></ids-toggle-button>\n</ids-segmented-control>\n```\n\nThis example demonstrates toggle buttons that display only text, with no icons.\n\n### Toggle Buttons With Icons Only\n\nToggle buttons can also be used with icons only, without any text. This is useful when you want a compact control or when the icon is universally understood.\n\n```html\n<ids-segmented-control>\n  <ids-toggle-button icon-on=\"star-filled\" icon-off=\"star-outlined\"></ids-toggle-button>\n  <ids-toggle-button icon-on=\"heart-filled\" icon-off=\"heart-outlined\"></ids-toggle-button>\n  <ids-toggle-button icon-on=\"bell-filled\" icon-off=\"bell-outlined\"></ids-toggle-button>\n</ids-segmented-control>\n```\n\nIn this example, the toggle buttons use only icons to represent different states, making the control more compact and icon-focused.\n\n### Toggle Buttons With Both Icons and Text\n\nToggle buttons can include both icons and text to provide clear, descriptive options to the user.\n\n```html\n<ids-segmented-control>\n  <ids-toggle-button icon-on=\"star-filled\" icon-off=\"star-outlined\" text-on=\"Starred\" text-off=\"Star\"></ids-toggle-button>\n  <ids-toggle-button icon-on=\"heart-filled\" icon-off=\"heart-outlined\" text-on=\"Liked\" text-off=\"Like\"></ids-toggle-button>\n  <ids-toggle-button icon-on=\"bell-filled\" icon-off=\"bell-outlined\" text-on=\"Notified\" text-off=\"Notify\"></ids-toggle-button>\n</ids-segmented-control>\n```\n\nThis example shows toggle buttons that use both icons and text, giving a more descriptive and visually informative control.\n\n## States and Variations\n\n### \"Default\" Appearance\n\nIn the default state, all toggle buttons within the segmented control are unpressed and styled according to their default appearance.\n\n```html\n<ids-segmented-control>\n  <ids-toggle-button icon-off=\"star-outlined\" text-off=\"Star\"></ids-toggle-button>\n  <ids-toggle-button icon-off=\"heart-outlined\" text-off=\"Like\"></ids-toggle-button>\n  <ids-toggle-button icon-off=\"bell-outlined\" text-off=\"Notify\"></ids-toggle-button>\n</ids-segmented-control>\n```\n\n### Active State\n\nWhen a toggle button is clicked, it transitions to the active state. The button is highlighted, and any associated text and icon are updated to reflect the active state.\n\n```html\n<ids-segmented-control>\n  <ids-toggle-button icon-on=\"star-filled\" text-on=\"Starred\" pressed=\"true\"></ids-toggle-button>\n  <ids-toggle-button icon-off=\"heart-outlined\" text-off=\"Like\"></ids-toggle-button>\n  <ids-toggle-button icon-off=\"bell-outlined\" text-off=\"Notify\"></ids-toggle-button>\n</ids-segmented-control>\n```\n\n### Selected by default\n\nYou can set one of the toggle buttons to be selected by default when the segmented control is first rendered.\n\n```html\n<ids-segmented-control>\n  <ids-toggle-button icon-on=\"star-filled\" text-on=\"Starred\" pressed=\"true\"></ids-toggle-button>\n  <ids-toggle-button icon-off=\"heart-outlined\" text-off=\"Like\"></ids-toggle-button>\n  <ids-toggle-button icon-off=\"bell-outlined\" text-off=\"Notify\"></ids-toggle-button>\n</ids-segmented-control>\n```\n\n### Disabled State\n\nThe disabled state prevents user interaction with the toggle buttons. When a button is disabled, it is visually indicated and does not respond to clicks or keyboard events.\n\n```html\n<ids-segmented-control>\n  <ids-toggle-button icon-off=\"star-outlined\" text-off=\"Star\" disabled=\"true\"></ids-toggle-button>\n  <ids-toggle-button icon-off=\"heart-outlined\" text-off=\"Like\"></ids-toggle-button>\n  <ids-toggle-button icon-off=\"bell-outlined\" text-off=\"Notify\"></ids-toggle-button>\n</ids-segmented-control>\n```\n\n## API\n\n### Methods\n\n#### get toggleButtons()\n\nReturns all ids-toggle-button elements within the segmented control.\n\n**Returns:** `NodeList` - Collection of toggle button elements\n\n#### handleToggleClick(event)\n\nHandles click events on toggle buttons within the segmented control.\n\n**Parameters:**\n\n- `event` (Event) - The click event\n\n#### updateToggleState(pressedButton)\n\nUpdates the state of toggle buttons, activating the pressed one and resetting others.\n\n**Parameters:**\n\n- `pressedButton` (HTMLElement) - The button that was pressed\n\n### Events\n\n#### pressed-changed\n\nFired when a toggle button's pressed state changes within the segmented control.\n**Event Detail:**\n\n- `pressed` (Boolean) - Whether the button is pressed\n- `element` (HTMLElement) - The toggle button element\n\n```javascript\nsegmentedControl.addEventListener('pressed-changed', (event) => {\n  console.log('Button pressed:', event.detail.pressed);\n  console.log('Button element:', event.detail.element);\n});\n```\n\n## Keyboard Guidelines\n\nThe IDS Segmented Control supports full keyboard navigation for accessibility and ease of use:\n\n### Arrow Key Navigation\n\n- **ArrowRight / ArrowDown**: Move focus to and select the next toggle button in the sequence\n- **ArrowLeft / ArrowUp**: Move focus to and select the previous toggle button in the sequence\n\n### Edge Behavior\n\n- Navigation stops at the first and last buttons — it does not wrap around\n- When the last button is focused, ArrowRight/ArrowDown does nothing\n- When the first button is focused, ArrowLeft/ArrowUp does nothing\n\n### Automatic Activation\n\n- Navigation automatically activates the focused button\n- The previously active button is deactivated when a new button receives focus\n- Only one button can be active at any time\n\n### Usage Example\n\n```html\n<ids-segmented-control>\n  <ids-toggle-button text-on=\"Option 1\" text-off=\"Option 1\"></ids-toggle-button>\n  <ids-toggle-button text-on=\"Option 2\" text-off=\"Option 2\"></ids-toggle-button>\n  <ids-toggle-button text-on=\"Option 3\" text-off=\"Option 3\"></ids-toggle-button>\n</ids-segmented-control>\n```\n\nUsers can navigate through all three options using arrow keys, with focus wrapping from the last option back to the first, and vice versa.\n\n## Regional Considerations\n\nBe conscious of the layout of content within your buttons when they are present in RTL situations.\n"}},{"name":"ids-separator","attributes":[{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"appearance","description":"Set the appearance style of the separator","values":[]},{"name":"vertical","description":"Set the separator to be vertical","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"margin-block-start","description":"Set margin-block-start (top margin for horizontal separator)","values":[]},{"name":"margin-block-end","description":"Set margin-block-end (bottom margin for horizontal separator)","values":[]},{"name":"margin-inline-start","description":"Set margin-inline-start (left margin for vertical separator)","values":[]},{"name":"margin-inline-end","description":"Set margin-inline-end (right margin for vertical separator)","values":[]},{"name":"hidden","description":"Set the hidden state of the separator","values":[]}],"description":{"kind":"markdown","value":"# ids-separator\n\nThe Separator Component provides a visual separator between two items. It's commonly used in `ids-toolbar`, `ids-menu`, `ids-popupmenu`, and forms. It can add a vertical or horizontal line to divide sections or items.\n\nFor IDS Menu Component examples see [Ids Popup Menu](../ids-menu/README.md) and for IDS Toolbar Component examples see [Ids Toolbar](../ids-toolbar/README.md). See also the [toolbar separator demo](../ids-toolbar/demos/separator.html) and [form separator demo](./demos/form.html).\n\n## Use Cases\n\n- Display a visual split between two tabs that are not directly related\n- Display or split sections or menu items that are not directly related\n- Divide form sections\n\n## Settings (Attributes)\n\n- `appearance` Sets the visual style. Use `form` for darker separators in form layouts\n- `hidden` {boolean} Hides the element from display, keeping the space\n- `margin-block-end` Sets bottom margin for horizontal separators\n- `margin-block-start` Sets top margin for horizontal separators. Accepts tokens (`2xs`, `xs`, `sm`, `md`, `lg`, `xl`, `2xl`) or CSS values (`16px`)\n- `margin-inline-end` Sets right margin for vertical separators\n- `margin-inline-start` Sets left margin for vertical separators\n- `no-margins` Removes the default margins from the separator\n- `vertical` Can be used to set the separator between horizontal and vertical. The vertical one is used on tabs and the horizontal (default) is used on menus\n\n## Themeable Parts\n\n- `separator` allows you to further style the separator element\n\n## Features (With Code Examples)\n\nTo show separators between items in a menu:\n\n```html\n<ids-menu-group>\n  <ids-menu-item>Option One</ids-menu-item>\n</ids-menu-group>\n<ids-separator></ids-separator>\n<ids-menu-group>\n  <ids-menu-item>Option Two</ids-menu-item>\n</ids-menu-group>\n```\n\nTo show vertical separators between toolbar buttons:\n\n```html\n<ids-toolbar-section type=\"buttonset\" align=\"end\">\n  <ids-button>Cut</ids-button>\n  <ids-button>Copy</ids-button>\n  <ids-separator vertical></ids-separator>\n  <ids-button>Undo</ids-button>\n  <ids-button>Redo</ids-button>\n</ids-toolbar-section>\n```\n\nTo divide form sections with custom margins:\n\n```html\n<ids-fieldset>\n  <legend>Section One</legend>\n  <ids-input label=\"Field\"></ids-input>\n</ids-fieldset>\n<ids-separator appearance=\"form\" margin-block-end=\"sm\"></ids-separator>\n<ids-fieldset>\n  <legend>Section Two</legend>\n  <ids-input label=\"Field\"></ids-input>\n</ids-fieldset>\n```\n"}},{"name":"ids-skip-link","attributes":[{"name":"href","description":"Set the link href","values":[]}],"description":{"kind":"markdown","value":"# ids-skip-link\n\n## Description\n\nA skip link is a single element added first thing in your page. When the skip link is focused from the browser URL using <kbd>Tab</kbd>, it will activate allowing you to jump to a main section. The main content is not usually the first thing on a web page. Keyboard and screen reader users generally must navigate a long list of navigation links, sub-lists of links, corporate icons, site searches, and other elements before ever arriving at the main content. This is particularly difficult for users with some forms of motor disabilities.\n\nFor more details info on skip links see <a href=\"https://webaim.org/techniques/skipnav/\" target=\"_blank\">this article</a>.\n\n## Use Cases\n\n- When you want to add accessibility features to your application\n- When you have a lot of content at the top of every page such as links/navigation/headers that may need to be jumped over when familiar with the page\n\n## Terminology\n\n- **Link/Hyperlink**: An interactive link to another page within Infor software to external destinations.\n- **Skip Link**: An interactive link to jump past some page content\n\n## Features (With Code Examples)\n\nA normal skip link element as a custom element. That will link to a section with `id=\"main-content\"` somewhere else in the page\n\n```html\n<ids-skip-link href=\"#main-content\">Skip to Main Content</ids-skip-link>\n```\n\n## Settings and Attributes\n\n- `href` {string} Set the links href to a url or file\n\n## Themeable Parts\n\n- `skiplink` allows you to further style the skip link element\n\n## States and Variations (With Code Examples)\n\n- Focused / Active\n\n## Keyboard Guidelines\n\n- When you <kbd>Tab</kbd> from the browser bar into the page the skip link will appear on and be focused\n- <kbd>Enter</kbd> will follow the link to the `id` of the content area you specify\n\n## Responsive Guidelines\n\n- Skip links are fixed position\n\n## Converting from Previous Versions (Breaking Changes)\n\n### 3.x to 4.x\n\nSkip link is a CSS-only component applied to `<a>` tags.\n\n### 4.x to 5.x\n\n- Skip Link is now a standalone custom element `<ids-skip-link><ids-skip-link>`\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nLink text should be localized in the current language. And should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-slider","attributes":[{"name":"default-min","values":[]},{"name":"default-max","values":[]},{"name":"default-type","values":[]},{"name":"#track-bounds","values":[]},{"name":"#is-setting-attribute","values":[]},{"name":"#label","values":[]},{"name":"#label-secondary","values":[]},{"name":"#labels","values":[]},{"name":"#is-rtl","values":[]},{"name":"#mouse-hover","values":[]},{"name":"#percent","values":[]},{"name":"#percent-secondary","values":[]},{"name":"slider","values":[]},{"name":"track-area","values":[]},{"name":"progress-track","values":[]},{"name":"track","values":[]},{"name":"tick-container","values":[]},{"name":"thumb","values":[]},{"name":"thumb-draggable","values":[]},{"name":"thumb-shadow","values":[]},{"name":"tooltip","values":[]},{"name":"tooltip-text","values":[]},{"name":"tooltip-pin","values":[]},{"name":"first-tick","values":[]},{"name":"last-tick","values":[]},{"name":"thumb-secondary","values":[]},{"name":"thumb-draggable-secondary","values":[]},{"name":"thumb-shadow-secondary","values":[]},{"name":"thumb-secondary-draggable","values":[]},{"name":"tooltip-secondary","values":[]},{"name":"tooltip-text-secondary","values":[]},{"name":"tooltip-pin-secondary","values":[]},{"name":"disabled","description":"Get whether the slider is disabled","values":[]},{"name":"readonly","description":"Get whether the slider is readonly","values":[]},{"name":"label","description":"Modifies the primary Slider thumb's label contents","values":[]},{"name":"aria-label","description":"Aria label for slider","values":[]},{"name":"aria-label-secondary","description":"Aria label for the secondary `","values":[]},{"name":"label-secondary","description":"Modifies the primary Slider thumb's label contents","values":[]},{"name":"vertical","description":"Get whether the slider is vertical","values":[]},{"name":"is-rtl","description":"Get whether the slider is displayed in RTL mode","values":[]},{"name":"on-language-change","description":"Handle Languages Changes","values":[]},{"name":"ticks","description":"Get the tick elements and their values","values":[]},{"name":"labels","description":"Get the labels for step/tick marks","values":[]},{"name":"step-number","description":"Sets the number of steps between start and end slider tick (only applicable to step sliders)","values":[]},{"name":"step-interval","description":"Get the interval between start and end slider tick","values":[]},{"name":"#steps","values":[]},{"name":"#color-stops","values":[]},{"name":"#threshold-segments","values":[]},{"name":"#is-initial-render","values":[]},{"name":"steps","description":"Setter for steps attribute","values":[]},{"name":"color-stops","description":"Setter for colorStops attribute - enables color-based theming","values":[]},{"name":"is-dragging","values":[]},{"name":"percent-secondary","description":"Sets the secondary slider thumb value based on percentage (range slider only)","values":[]},{"name":"percent","description":"Sets the primary slider thumb value based on percentage","values":[]},{"name":"value-secondary","description":"Set the secondary value of the slider (range slider only)","values":[]},{"name":"value","description":"Set the primary value of the slider","values":[]},{"name":"localize-value","description":"Gets the formatted value according to current locale settings,\npreserving the original number of decimal places.","values":[]},{"name":"min","description":"Sets the minimum-possible value of the slider","values":[]},{"name":"max","description":"Sets the maximum-possible value of the slider","values":[]},{"name":"type","description":"Sets the slider type","values":[]},{"name":"show-tooltip","description":"Get whether tooltips are shown","values":[]},{"name":"color","description":"Get the color of the bar","values":[]}],"description":{"kind":"markdown","value":"# ids-slider\n\n## Description\n\nDisplays a range of selectable values(s) between a minimum and maximum, which can be controlled by the thumb(s) along the track of the slider. Configurations include the default (1 thumb), a range slider (2 thumbs), and a step slider (1 thumb and x amount of ticks). They can also be converted from horizontal (default) to vertical orientation. The value(s) can be modified by either clicking the area around the track, by dragging the thumb back and forth, or by focusing and pressing the arrow keys.  A user can select a single value or range of values.\n\n## Use Cases\n\n- Control an input with limited options through clicking/dragging/keyboard interaction.\n- Best for showing a user's current selection relative to the lower and upper limits of a scale.\n\n## Terminology\n\n- **Minimum**: The smallest value possible, on one end of the slider\n- **Maximum**: The largest value possible, on the other end of the slider\n- **Thumb**: The circular button that can be dragged back and forth on the slider to control input\n- **Tick**: The dots along the step slider that indicate the amount of choices for input\n- **Track**: The bar which the thumb moves along\n- **Track area**: The area around the track which can be clicked to modify the input value\n\n## Settings (Attributes)\n\n- `color` {string} set the color of the slider\n- `disabled` {boolean} disables the slider, preventing user interaction\n- `label` {string} sets the primary label text for the slider\n- `label-secondary` {string} sets the secondary label text for range sliders\n- `max` {number} set the maximum value of the slider\n- `min` {number} set the minimum value of the slider\n- `readonly` {boolean} makes the slider read-only, preventing value changes but allowing focus\n- `show-tooltip` {boolean} if true, allows the display of a Tooltip on each slider handle during interactions\n- `step-interval` {number >= 0} the amount between each step when using the step slider\n- `step-number` {number >= 0} number of steps between the start and end steps (applicable only for the step slider) for example if set to 4 6 steps are shown (the end and start steps are included)\n- `type` {'single' | 'range' | 'step'} set the type of the slider\n- `value` {number} set the primary value of the slider\n- `value-secondary` {number} set the secondary value of the slider (applicable only for range slider)\n- `vertical` {boolean} set the orientation of the slider to vertical (default is horizontal)\n\n## Settings (Non-attributes)\n\n- `labels` {array} set the list of labels you want (applicable only for step slider)\n- `colorStops` {array} set color stops for threshold-based coloring. Each stop should have `value` and `color` properties\n- `steps` {array} sets custom steps with values, colors, and text labels. Each step should include a value, with optional color and text properties.\n- `percent` {number} gets or sets the primary thumb position as a percentage (0–100).\n- `percentSecondary` {number} gets or sets the secondary thumb position as a percentage (0–100) for range sliders.\n- `ticks` {array} returns an array of tick objects, each containing element and value properties.\n- `localizeValue` {number | string} returns the formatted value based on the current locale settings. The number of decimal places in the original value is preserved in the formatted output. If no value is set, an empty formatted string is returned.\n\n## Events\n\n- `change` - fires when the slider value changes. Event detail contains `elem` (the thumb element), `percent` (thumb position as percentage), and `value` (the new value)\n- `drag` - passed up from Slider's thumbs in ShadowRoot, which are controlled by [IdsDraggable](../ids-draggable/README.md).  Listening to this event can enable special changes on the dragging of slider handles\n- `ids-slider-drag` - fires during dragging of slider thumbs. Event detail contains `elem` (the thumb element), `mouseX`, `mouseY` (mouse coordinates), `percent` (thumb position as percentage), and `value` (current value)\n\n## Accessibility\n\nUsers can tab to focus on the thumb with <kbd>Tab<kbd> and modify values with <kbd>Arrow Up/Down/Left/Right</kbd>.\n\n## Features (With Code Samples)\n\nA simple single slider from 0 to 100\n\n```html\n<ids-slider value=\"50\" min=\"0\" max=\"100\"></ids-slider>\n```\n\nA range slider that can handle negative and positive values\n\n```html\n<ids-slider type=\"range\" min=\"-50\" max=\"50\"></ids-slider>\n```\n\nA step slider with custom color and 5 intervals\n\n```html\n<ids-slider type=\"step\" step-number=\"5\" color=\"green\"></ids-slider>\n```\n\nA vertical step slider with 12 intervals\n\n```html\n<ids-slider vertical type=\"step\" step-number=\"12\"></ids-slider>\n```\n\n### Disabled and Readonly States\n\nA disabled slider that cannot be interacted with:\n\n```html\n<ids-slider disabled value=\"25\" min=\"0\" max=\"100\"></ids-slider>\n```\n\nA readonly slider that can be focused but not changed:\n\n```html\n<ids-slider readonly value=\"75\" min=\"0\" max=\"100\"></ids-slider>\n```\n\n### Labels\n\nSliders with primary and secondary labels:\n\n```html\n<ids-slider label=\"Volume\" value=\"50\" min=\"0\" max=\"100\"></ids-slider>\n<ids-slider type=\"range\" label=\"Min Volume\" label-secondary=\"Max Volume\" value=\"25\" value-secondary=\"75\"></ids-slider>\n```\n\n### Tooltips\n\nEnable tooltips to show values during interaction:\n\n```html\n<ids-slider show-tooltip value=\"50\" min=\"0\" max=\"100\"></ids-slider>\n```\n\n### Percentage Control\n\nControl slider position using percentages:\n\n```js\nconst slider = document.querySelector('ids-slider');\nslider.percent = 75; // Sets primary thumb to 75% position\nslider.percentSecondary = 25; // Sets secondary thumb to 25% position (range sliders)\n```\n\n### Custom Steps\n\nDefine custom steps with values, colors, and labels:\n\n```js\nconst slider = document.querySelector('ids-slider');\nslider.steps = [\n  { value: 0, text: 'Poor', color: '#ff0000' },\n  { value: 25, text: 'Fair', color: '#ff8800' },\n  { value: 50, text: 'Good', color: '#ffcc00' },\n  { value: 75, text: 'Very Good', color: '#88cc00' },\n  { value: 100, text: 'Excellent', color: '#00cc44' }\n];\n```\n\n### Event Handling\n\nListen to slider events:\n\n```js\nconst slider = document.querySelector('ids-slider');\n\n// Listen for value changes\nslider.addEventListener('change', (e) => {\n  console.log('New value:', e.detail.value);\n  console.log('Percentage:', e.detail.percent);\n});\n\n// Listen for drag events\nslider.addEventListener('ids-slider-drag', (e) => {\n  console.log('Dragging to:', e.detail.value);\n});\n\n// Listen for drag start/end\nslider.addEventListener('dragstart', () => console.log('Drag started'));\nslider.addEventListener('dragend', () => console.log('Drag ended'));\n```\n\n### Color stops\n\nColor stops allow you to create threshold-based coloring on sliders. Each color stop defines a value and color:\n\n```js\nconst slider = document.querySelector('ids-slider');\nslider.colorStops = [\n  { value: 0, color: '#ff0000' },\n  { value: 100, color: '#0066ff' },\n  { value: 200, color: '#ff8800' },\n  { value: 300, color: '#00cc44' }\n];\n```\n\n### Custom labels\n\nCustom label strings can be applied to a Slider with `type=\"step\"` set.\n\n```html\n<ids-slider type=\"step\"></ids-slider>\n```\n\nTo add custom labels, the `step-number` attribute must match the size of the array of labels to be applied.  Absent this match, the labels will be hidden:\n\n```js\nconst labels = ['very bad, poor, average, good, excellent'];\nconst slider = document.querySelector('ids-slider');\n\nslider.labels = labels;\nslider.stepNumber = labels.length;\n```\n\n## Responsive Guidelines\n\n- The slider stretches to 100% width of its container (horizontal orientation)\n- The slider has a minimum height of 300px (vertical orientation)\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Slider was a new component in v4.0.0\n- Slider can be invoked with `$('#my-element').slider();`\n\n**4.x to 5.x**\n\n- Slider is now a custom element `<ids-slider></ids-slider>`\n- Slider options are available as attributes (such as `vertical`, `type`, etc)\n\n### Converting from 4.x\n\n```html\n<div class=\"field\">\n  <label for=\"slider-regular-example\">Regular</label>\n  <input id=\"slider-regular-example\" name=\"slider-regular\" class=\"slider\" type=\"range\"/>\n</div>\n```\nis the 4.x equivalent of the web component example below\n\n```html\n<ids-slider type=\"single\"></ids-slider>\n```\n"}},{"name":"ids-spinbox","attributes":[{"name":"#is-touch-event","values":[]},{"name":"is-form-component","values":[]},{"name":"trigger-field","values":[]},{"name":"decrement-button","values":[]},{"name":"increment-button","values":[]},{"name":"max","values":[]},{"name":"min","values":[]},{"name":"step","values":[]},{"name":"value","description":"Get the input value","values":[]},{"name":"disabled","description":"Sets the disabled attribute","values":[]},{"name":"readonly","description":"Sets the readonly attribute","values":[]},{"name":"tabbable","description":"Tabbable is not currently supported on spinbox trigger buttons","values":[]},{"name":"#step-direction","description":"represents the direction a user is holding for\nthe spinbox; works to enable long press intervals","values":[]},{"name":"#step-cycle-timeout","description":"stores a timeout related to value cycling","values":[]},{"name":"elements","description":"Get a list of element dependencies for this component","values":[]},{"name":"#buttons","values":[]},{"name":"buttons","values":[]},{"name":"id","description":"Sets the id internally and externally","values":[]},{"name":"format","description":"Return format","values":[]},{"name":"#input-focus-handler","values":[]},{"name":"#input-blur-handler","values":[]},{"name":"#input-keydown-handler","values":[]},{"name":"#button-focus-handlers","values":[]},{"name":"#button-blur-handlers","values":[]},{"name":"triggered-by-change","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"is-password-visible","description":"Check if this is a password field and the password should be shown as plain text","values":[]},{"name":"collapsible","description":"Get the collapsible state","values":[]},{"name":"input","description":"Get the inner input element","values":[]},{"name":"form-input","description":"Get the inner input element (for form input mixin)","values":[]},{"name":"caps-lock-icon","description":"Get the caps lock indicator icon","values":[]},{"name":"field-container","description":"Get the field container element","values":[]},{"name":"label-text-el","description":"Get the inner ids-text element which contains the label text","values":[]},{"name":"label-el","description":"Get the inner label element","values":[]},{"name":"reveal-on-edit","description":"Sets whether reveal on edit is enabled (shows button only when editing)","values":[]},{"name":"revealable-password","description":"sets whether password reveal functionality is available","values":[]},{"name":"caps-lock","description":"sets whether capslock indicatoris enabled or disabled","values":[]},{"name":"password-visible","description":"sets whether the password is currently visible","values":[]},{"name":"square","description":"Get whether the input has square corners","values":[]},{"name":"disable-tooltip","description":"Get whether tooltip is disabled","values":[]},{"name":"#native-event-handler","values":[]},{"name":"#input-event-handler","values":[]},{"name":"active","description":"Get the active state","values":[]},{"name":"bg-transparent","description":"Get the background transparent state","values":[]},{"name":"browser-autocomplete","description":"Get the browser autocomplete setting","values":[]},{"name":"text-ellipsis","description":"Get the text ellipsis state","values":[]},{"name":"#label-el","description":"internal reference to a label element a user provides","values":[]},{"name":"placeholder","description":"Get the placeholder text","values":[]},{"name":"readonly-background","description":"Get whether readonly background is enabled","values":[]},{"name":"label-wrap","description":"Get the label wrap setting","values":[]},{"name":"size","description":"Get the size","values":[]},{"name":"text-align","description":"Get the text alignment","values":[]},{"name":"type","description":"Get the input type","values":[]},{"name":"cursor","description":"Get the cursor style","values":[]},{"name":"maxlength","description":"Get the max length","values":[]},{"name":"uppercase","description":"Get the uppercase state","values":[]},{"name":"lowercase","description":"Get the lowercase state","values":[]},{"name":"margin-block-end","description":"Gets the margin-block-end token key","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"padding","description":"Get the inner padding","values":[]},{"name":"overflow","description":"Get how content overflows","values":[]}],"description":{"kind":"markdown","value":"# ids-spinbox\n\n## Description\n\nAllows a user to input a value that goes up/down in specific intervals, and also optionally within a range of integers.\n\n## Use Cases\n\n- a normal input that goes up or down specific increments by it's nature.\n\n## Themeable Parts\n\n- `container` the overall spinbox container\n- `input` the spinbox center input\n- `button` increment/decrement buttons\n- `label` the label above the input\n- `validation` the validation message that pops up if any errors exist\n\n## Features (With Code Examples)\n\nSpinbox with a minimum and maximum\n\n```html\n<ids-spinbox\n  value=\"0\"\n  min=\"0\"\n  max=\"5\"\n  label=\"Enter an int from 0 to 5\"\n  placeholder=\"0=>5\"\n></ids-spinbox>\n```\n\nSpinbox which increments in intervals of 5\n\n```html\n <ids-spinbox\n  value=\"0\"\n  min=\"-25\"\n  max=\"25\"\n  step=\"5\"\n  label=\"Jumps 5 from -25 to 25\"\n></ids-spinbox>\n ```\n\nSpinbox which shows a marker with changes, and no range limits\n\n```html\n<ids-spinbox\n  value=\"0\"\n  label=\"Unbounded Spinbox\"\n  dirty-tracker=\"true\"\n></ids-spinbox>\n```\n\nSpinbox which is required to have a value set when tabbed off.\n\n```html\n<ids-spinbox\n  value=\"\"\n  label=\"Value Is Required\"\n  validation=\"required\"\n></ids-spinbox>\n```\n\n## Settings and Attributes\n\n-`autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n-`value` {number} The current number assigned to the spinbox\n-`max` {number} Maximum/ceiling value possible to assign to `value`\n-`min` {number} Minimum/floor value possible to assign to `value`\n-`label` {string} Label text shown above the spinbox\n-`labelState` {string} Whether a label's text has been flagged as hidden (a label is still required for accessibility and will be applied on the input element)\n-`placeholder` {string} Text shown as a hint when user clears text on the input\n-`validate` {string} Validation rule; set to `required` to require validation\n-`size` {string} Set the spinbox size, defaults to `sm`\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd>: Moves focus off of the component to the next focusable element on page\n- <kbd>Shift+Tab</kbd>: Moves focus to previous focusable element on the page\n- <kbd>Up/Down Arrow</kbd>: Increment and decrement the ids-spinbox value\n\n## Responsive Guidelines\n\nN/A\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Spinbox was a new component added in v4.0.0\n- Spinbox can be invoked against an input field with `$('#my-element').spinbox();`\n\n**4.x to 5.x**\n\n- Spinbox is now a custom element `<ids-spinbox></ids-spinbox>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Accessibility Guidelines\n\n- 1.4.3 Contrast (Minimum) - there should be enough contrast on the background which the wizard resides on in the page.\n- Be sure to provide labels that provide clear intent as to the representation of the value which the spinbox controls.\n\n## Regional Considerations\n\nLabel text should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n"}},{"name":"ids-splitter-local-storage","attributes":[{"name":"root","values":[]}],"description":{"kind":"markdown","value":"# ids-splitter\r\n\r\nThe Ids Splitter is used to divide the user interface of a page. It is composed of resizable \"panes\" which divide content. It can layout either horizontally or vertically along an axis where a user can resize the panes, these are represented as `<ids-splitter-pane>` components.\r\n\r\n![Different variations of IdsSplitterLayout](https://infor-design-wp.s3.amazonaws.com/wp-content/uploads/2024/04/08183956/ids-splitter-markup-legend.png)\r\n\r\nThe pane can move to the left or the right of the screen. This allows the user to have control of the customized layout. Elements inside and outside the pane will be resized to fit depending on if their css is fluid.\r\n\r\n## Use Cases\r\n\r\n- Divides the user interface of a screen.\r\n\r\n## Terminology\r\n\r\n- **Splitter**: The splitter container element\r\n- **SplitterPane**: One zone/section inside the splitter\r\n- **SplitBar**: The generated bar element to drag panes to resize\r\n\r\n## Features (With Code Examples)\r\n\r\nA default splitter behavior, axis will set to \"x\" (horizontally) and align will set to \"start\".\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter align set to end.\r\n\r\n```html\r\n<ids-splitter align=\"end\">\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to initial size 30%.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane size=\"30%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to initial size using pixel values. Pixel-based sizes are preserved as `px` in the `size` attribute and CSS, keeping the pane at a fixed position regardless of container resize. The remaining panes adjust proportionally to fill the available space. Bare numeric values (without a unit) are also treated as pixels.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane size=\"200px\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with mixed pixel and percentage sizes. Pixel panes stay fixed while percentage panes scale with the container.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane size=\"150px\"></ids-splitter-pane>\r\n  <ids-splitter-pane size=\"40%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to minimum size of 10% to be resize.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane min-size=\"10%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to maximum size of 80% to be resize, limited to single split only.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane max-size=\"80%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to initial collapsed pane. Collapsed can only apply to start pane.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane collapsed></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with `min-size=\"0\"` to allow panes to fully collapse to 0% width. By default, collapsed panes retain a 40px minimum width. Setting `min-size=\"0\"` bypasses this threshold, useful for pane-switching scenarios where one pane should completely disappear.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane min-size=\"0\" size=\"50%\"></ids-splitter-pane>\r\n  <ids-splitter-pane min-size=\"0\" size=\"50%\"></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with multiple splits.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set as vertically.\r\n\r\n```html\r\n<ids-splitter axis=\"y\">\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to nested (horizontally and vertically).\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane>\r\n    <ids-splitter axis=\"y\">\r\n      <ids-splitter-pane></ids-splitter-pane>\r\n      <ids-splitter-pane></ids-splitter-pane>\r\n    </ids-splitter>\r\n  </ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with custom (aria-label) for draggable bar/s.\r\n\r\n```html\r\n<ids-splitter label=\"Custom Resize Text\">\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter to do the resize after drag-end.\r\n\r\n```html\r\n<ids-splitter resize-on-drag-end>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set as disabled.\r\n\r\n```html\r\n<ids-splitter disabled>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSave splitter position to local storage.\r\n\r\n```html\r\n<ids-splitter unique-id=\"some-uniqueid\" save-position>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter pane with padding.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane padding=\"md\">Content with medium padding on all sides</ids-splitter-pane>\r\n  <ids-splitter-pane padding-x=\"lg\" padding-y=\"sm\">Content with large horizontal and small vertical padding</ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\n## Settings and Attributes (Splitter)\r\n\r\n- `align` {string} Set the split bar align direction to start or end\r\n- `always-show-expand-button` {boolean} Always show the expand button, even when not collapsed\r\n- `axis` {string} Set the splitter axis direction x: horizontal or y: vertical\r\n- `disabled` {boolean} Sets the splitter to disabled state\r\n- `expanded-width` {number} Set the expanded width in pixels (default: 250)\r\n- `height` {string} Override the splitter's height (default: 100%)\r\n- `label` {string} Set the aria-label text for each split bar\r\n- `min-distance` {number} Set the minimum distance for split bars in pixels (default: 16)\r\n- `min-width` {number} Set the minimum width for dragging constraint in pixels (default: 0)\r\n- `resizeOnDragEnd` {boolean} Sets the splitter to resize on drag end\r\n- `savePosition` {boolean} Set splitter to save position to local storage\r\n- `show-expand-button` {boolean} Show the expand/collapse button on split bars (default: true)\r\n- `text-wrap` {boolean} Set text items to wrap within the splitter. Other alternates are to use `ids-text` `white-space` setting and the `label-wrap` settings on inputs\r\n- `uniqueId` {string} Set uniqueId to save to local storage, so same saved position can be use for whole app\r\n\r\n## Settings and Attributes (Splitter Pane)\r\n\r\n- `size` {string|number} Sets the pane size. Supports percentage values (`30%`), pixel values (`200px`), or bare numbers (`200`, treated as pixels). Pixel-based sizes remain fixed on container resize; percentage-based sizes scale proportionally.\r\n- `minSize` {string|number} Sets the pane minimum size\r\n- `maxSize` {string|number} Sets the pane maximum size\r\n- `collapsed` {boolean} Set the pane(s) to collapsed state or can use `collapse` on the `ids-splitter`\r\n- `padding` {string} Sets the padding for all sides [xs, sm, md, lg, xl]\r\n- `paddingX` {string} Sets the horizontal padding [xs, sm, md, lg, xl]\r\n- `paddingY` {string} Sets the vertical padding [xs, sm, md, lg, xl]\r\n\r\n## Theme-able Parts (Splitter)\r\n\r\n- `splitter` allows you to further style the splitter element\r\n- `split-bar` allows you to further style the split bar element\r\n- `split-bar-icon` allows you to further style the split bar icon element\r\n\r\n## Theme-able Parts (Splitter Pane)\r\n\r\n- `pane` allows you to further style the splitter pane element\r\n\r\n## Events (Splitter)\r\n\r\n- `beforecollapsed` Fires before the splitter pane get collapsed, you can return false in the response to veto\r\n- `collapsed` Fires after the splitter pane get collapsed\r\n- `beforeexpanded` Fires before the splitter pane get expanded, you can return false in the response to veto\r\n- `expanded` Fires after the splitter pane get expanded\r\n- `beforesizechanged` Fires before the splitter pane size changed, you can return false in the response to veto\r\n- `sizechanged` Fires after the splitter pane size changed\r\n- `save-position` Fires after the local storage settings changed in some way\r\n- `clear-position` Fires after clear the saved position from local storage\r\n\r\n## Methods (Splitter)\r\n\r\n- `clearPosition(uniqueId: string|undefined)` Clear the saved position from local storage, If uniqueId is undefined will use Internal attached\r\n- `clearPositionAll()` Clear all splitter related saved position from local storage\r\n- `collapse(options: { startPane: HTMLElement|string, endPane: HTMLElement|string }): void` Collapse start pane size for given start/end panes or panes CSS selector\r\n- `expand(options: { startPane: HTMLElement|string, endPane: HTMLElement|string }): void` Expand start pane size for given start/end panes or panes CSS selector\r\n- `getAllPairs(): Array<object>` Get list of splitter pairs\r\n- `getPair(options: { startPane: HTMLElement|string, endPane: HTMLElement|string }): object` Get a splitter pair by given start/end panes or panes CSS selector\r\n- `isHorizontal(): boolean` Get true if current orientation is horizontal\r\n- `resize(): void` Resize the component by recalculating container dimensions and repositioning split bars\r\n- `sizes(): Array<number>` Get list of current sizes\r\n- `minSizes(): Array<number>` Get list of current minimum sizes\r\n- `maxSizes(): Array<number>` Get list of current maximum sizes, limited to single split\r\n- `splitterPanes: Array<IdsSplitterPane>` Get array of direct child splitter pane elements\r\n- `template(): string` Returns the template for the component contents\r\n\r\n## States and Variations (With Code Examples)\r\n\r\n- Horizontal: Ability to display horizontal split content\r\n- Vertical: Ability to display vertical split content\r\n- Multiple: Splitter with multiple splits\r\n- Nested: Splitter nested with another splitter (horizontally and/or vertically)\r\n- Disabled: split-bar/s cannot be clicked, hovered, focused or dragged and not visible\r\n\r\n## Keyboard Guidelines\r\n\r\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the split-bar/s.\r\n- <kbd>Down/Left Arrow</kbd>: Resize and moves the focused split-bar to left on horizontal, or bottom on vertical splitter.\r\n- <kbd>Up/Right Arrow</kbd>: Resize and moves the focused split-bar to right on horizontal, or top on vertical splitter.\r\n\r\n## Responsive Guidelines\r\n\r\n- Flows with padding and margin within the width and height of the parent container.\r\n\r\n## Converting from Previous Versions (Breaking Changes)\r\n\r\n**3.x to 4.x**\r\n\r\n- Splitter was a new component added in v4.1.1\r\n- Splitter can be invoked on a container element with `$('#my-element').splitter();`\r\n\r\n**4.x to 5.x**\r\n\r\n- Splitter's base component is now a custom element `<ids-splitter></ids-splitter>`\r\n- Content that should live in \"split\" areas should be slotted into `<ids-splitter-pane></ids-splitter-pane>` components.\r\n- Splitter orientation can be set by use of `axis` settings.\r\n- If using events, events are now plain JS events.\r\n- Can now be imported as a single JS file and used with encapsulated styles\r\n\r\n## Designs\r\n\r\n[Design Specs](https://www.figma.com/file/ri2Knf3KchdfdzRAeds0Ab/IDS-Mobility-v4.6?node-id=1%3A5740)\r\n\r\n## Accessibility Guidelines\r\n\r\n- Splitter component contained in the element has a `role=\"group\"`.\r\n- Each pane element if `id` attribute not provided will add component generated default id to use with split-bar for reference.\r\n- Each split-bar element contains `role=\"separator\"`.\r\n- Each split-bar element contains `aria-label\"`, if `label` not provided will use component generated default text.\r\n- Each split-bar element contains its current state with a `horizontal` or `vertical` value as `aria-orientation`.\r\n- Each split-bar element contains `aria-controls` with value `{start-pane-id}` and `{end-pane-id}`.\r\n- Each split-bar element contains its current state with a `boolean` value as `aria-disabled`.\r\n\r\n## Regional Considerations\r\n\r\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\r\n"}},{"name":"ids-splitter-pane","attributes":[{"name":"state","description":"Internal state for the pane","values":[]},{"name":"size","description":"Get the current panes size","values":[]},{"name":"collapsed","description":"Get collapsed state of the pane","values":[]},{"name":"min-size","description":"Get the current panes minSize","values":[]},{"name":"max-size","description":"Get the current panes maxSize","values":[]},{"name":"no-scroll","description":"Set the noScroll property to disable scrollbars","values":[]},{"name":"padding","description":"Get the padding attribute","values":[]},{"name":"padding-x","description":"Get the paddingX attribute","values":[]},{"name":"padding-y","description":"Get the paddingY attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-splitter\r\n\r\nThe Ids Splitter is used to divide the user interface of a page. It is composed of resizable \"panes\" which divide content. It can layout either horizontally or vertically along an axis where a user can resize the panes, these are represented as `<ids-splitter-pane>` components.\r\n\r\n![Different variations of IdsSplitterLayout](https://infor-design-wp.s3.amazonaws.com/wp-content/uploads/2024/04/08183956/ids-splitter-markup-legend.png)\r\n\r\nThe pane can move to the left or the right of the screen. This allows the user to have control of the customized layout. Elements inside and outside the pane will be resized to fit depending on if their css is fluid.\r\n\r\n## Use Cases\r\n\r\n- Divides the user interface of a screen.\r\n\r\n## Terminology\r\n\r\n- **Splitter**: The splitter container element\r\n- **SplitterPane**: One zone/section inside the splitter\r\n- **SplitBar**: The generated bar element to drag panes to resize\r\n\r\n## Features (With Code Examples)\r\n\r\nA default splitter behavior, axis will set to \"x\" (horizontally) and align will set to \"start\".\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter align set to end.\r\n\r\n```html\r\n<ids-splitter align=\"end\">\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to initial size 30%.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane size=\"30%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to initial size using pixel values. Pixel-based sizes are preserved as `px` in the `size` attribute and CSS, keeping the pane at a fixed position regardless of container resize. The remaining panes adjust proportionally to fill the available space. Bare numeric values (without a unit) are also treated as pixels.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane size=\"200px\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with mixed pixel and percentage sizes. Pixel panes stay fixed while percentage panes scale with the container.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane size=\"150px\"></ids-splitter-pane>\r\n  <ids-splitter-pane size=\"40%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to minimum size of 10% to be resize.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane min-size=\"10%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to maximum size of 80% to be resize, limited to single split only.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane max-size=\"80%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to initial collapsed pane. Collapsed can only apply to start pane.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane collapsed></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with `min-size=\"0\"` to allow panes to fully collapse to 0% width. By default, collapsed panes retain a 40px minimum width. Setting `min-size=\"0\"` bypasses this threshold, useful for pane-switching scenarios where one pane should completely disappear.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane min-size=\"0\" size=\"50%\"></ids-splitter-pane>\r\n  <ids-splitter-pane min-size=\"0\" size=\"50%\"></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with multiple splits.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set as vertically.\r\n\r\n```html\r\n<ids-splitter axis=\"y\">\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to nested (horizontally and vertically).\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane>\r\n    <ids-splitter axis=\"y\">\r\n      <ids-splitter-pane></ids-splitter-pane>\r\n      <ids-splitter-pane></ids-splitter-pane>\r\n    </ids-splitter>\r\n  </ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with custom (aria-label) for draggable bar/s.\r\n\r\n```html\r\n<ids-splitter label=\"Custom Resize Text\">\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter to do the resize after drag-end.\r\n\r\n```html\r\n<ids-splitter resize-on-drag-end>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set as disabled.\r\n\r\n```html\r\n<ids-splitter disabled>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSave splitter position to local storage.\r\n\r\n```html\r\n<ids-splitter unique-id=\"some-uniqueid\" save-position>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter pane with padding.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane padding=\"md\">Content with medium padding on all sides</ids-splitter-pane>\r\n  <ids-splitter-pane padding-x=\"lg\" padding-y=\"sm\">Content with large horizontal and small vertical padding</ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\n## Settings and Attributes (Splitter)\r\n\r\n- `align` {string} Set the split bar align direction to start or end\r\n- `always-show-expand-button` {boolean} Always show the expand button, even when not collapsed\r\n- `axis` {string} Set the splitter axis direction x: horizontal or y: vertical\r\n- `disabled` {boolean} Sets the splitter to disabled state\r\n- `expanded-width` {number} Set the expanded width in pixels (default: 250)\r\n- `height` {string} Override the splitter's height (default: 100%)\r\n- `label` {string} Set the aria-label text for each split bar\r\n- `min-distance` {number} Set the minimum distance for split bars in pixels (default: 16)\r\n- `min-width` {number} Set the minimum width for dragging constraint in pixels (default: 0)\r\n- `resizeOnDragEnd` {boolean} Sets the splitter to resize on drag end\r\n- `savePosition` {boolean} Set splitter to save position to local storage\r\n- `show-expand-button` {boolean} Show the expand/collapse button on split bars (default: true)\r\n- `text-wrap` {boolean} Set text items to wrap within the splitter. Other alternates are to use `ids-text` `white-space` setting and the `label-wrap` settings on inputs\r\n- `uniqueId` {string} Set uniqueId to save to local storage, so same saved position can be use for whole app\r\n\r\n## Settings and Attributes (Splitter Pane)\r\n\r\n- `size` {string|number} Sets the pane size. Supports percentage values (`30%`), pixel values (`200px`), or bare numbers (`200`, treated as pixels). Pixel-based sizes remain fixed on container resize; percentage-based sizes scale proportionally.\r\n- `minSize` {string|number} Sets the pane minimum size\r\n- `maxSize` {string|number} Sets the pane maximum size\r\n- `collapsed` {boolean} Set the pane(s) to collapsed state or can use `collapse` on the `ids-splitter`\r\n- `padding` {string} Sets the padding for all sides [xs, sm, md, lg, xl]\r\n- `paddingX` {string} Sets the horizontal padding [xs, sm, md, lg, xl]\r\n- `paddingY` {string} Sets the vertical padding [xs, sm, md, lg, xl]\r\n\r\n## Theme-able Parts (Splitter)\r\n\r\n- `splitter` allows you to further style the splitter element\r\n- `split-bar` allows you to further style the split bar element\r\n- `split-bar-icon` allows you to further style the split bar icon element\r\n\r\n## Theme-able Parts (Splitter Pane)\r\n\r\n- `pane` allows you to further style the splitter pane element\r\n\r\n## Events (Splitter)\r\n\r\n- `beforecollapsed` Fires before the splitter pane get collapsed, you can return false in the response to veto\r\n- `collapsed` Fires after the splitter pane get collapsed\r\n- `beforeexpanded` Fires before the splitter pane get expanded, you can return false in the response to veto\r\n- `expanded` Fires after the splitter pane get expanded\r\n- `beforesizechanged` Fires before the splitter pane size changed, you can return false in the response to veto\r\n- `sizechanged` Fires after the splitter pane size changed\r\n- `save-position` Fires after the local storage settings changed in some way\r\n- `clear-position` Fires after clear the saved position from local storage\r\n\r\n## Methods (Splitter)\r\n\r\n- `clearPosition(uniqueId: string|undefined)` Clear the saved position from local storage, If uniqueId is undefined will use Internal attached\r\n- `clearPositionAll()` Clear all splitter related saved position from local storage\r\n- `collapse(options: { startPane: HTMLElement|string, endPane: HTMLElement|string }): void` Collapse start pane size for given start/end panes or panes CSS selector\r\n- `expand(options: { startPane: HTMLElement|string, endPane: HTMLElement|string }): void` Expand start pane size for given start/end panes or panes CSS selector\r\n- `getAllPairs(): Array<object>` Get list of splitter pairs\r\n- `getPair(options: { startPane: HTMLElement|string, endPane: HTMLElement|string }): object` Get a splitter pair by given start/end panes or panes CSS selector\r\n- `isHorizontal(): boolean` Get true if current orientation is horizontal\r\n- `resize(): void` Resize the component by recalculating container dimensions and repositioning split bars\r\n- `sizes(): Array<number>` Get list of current sizes\r\n- `minSizes(): Array<number>` Get list of current minimum sizes\r\n- `maxSizes(): Array<number>` Get list of current maximum sizes, limited to single split\r\n- `splitterPanes: Array<IdsSplitterPane>` Get array of direct child splitter pane elements\r\n- `template(): string` Returns the template for the component contents\r\n\r\n## States and Variations (With Code Examples)\r\n\r\n- Horizontal: Ability to display horizontal split content\r\n- Vertical: Ability to display vertical split content\r\n- Multiple: Splitter with multiple splits\r\n- Nested: Splitter nested with another splitter (horizontally and/or vertically)\r\n- Disabled: split-bar/s cannot be clicked, hovered, focused or dragged and not visible\r\n\r\n## Keyboard Guidelines\r\n\r\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the split-bar/s.\r\n- <kbd>Down/Left Arrow</kbd>: Resize and moves the focused split-bar to left on horizontal, or bottom on vertical splitter.\r\n- <kbd>Up/Right Arrow</kbd>: Resize and moves the focused split-bar to right on horizontal, or top on vertical splitter.\r\n\r\n## Responsive Guidelines\r\n\r\n- Flows with padding and margin within the width and height of the parent container.\r\n\r\n## Converting from Previous Versions (Breaking Changes)\r\n\r\n**3.x to 4.x**\r\n\r\n- Splitter was a new component added in v4.1.1\r\n- Splitter can be invoked on a container element with `$('#my-element').splitter();`\r\n\r\n**4.x to 5.x**\r\n\r\n- Splitter's base component is now a custom element `<ids-splitter></ids-splitter>`\r\n- Content that should live in \"split\" areas should be slotted into `<ids-splitter-pane></ids-splitter-pane>` components.\r\n- Splitter orientation can be set by use of `axis` settings.\r\n- If using events, events are now plain JS events.\r\n- Can now be imported as a single JS file and used with encapsulated styles\r\n\r\n## Designs\r\n\r\n[Design Specs](https://www.figma.com/file/ri2Knf3KchdfdzRAeds0Ab/IDS-Mobility-v4.6?node-id=1%3A5740)\r\n\r\n## Accessibility Guidelines\r\n\r\n- Splitter component contained in the element has a `role=\"group\"`.\r\n- Each pane element if `id` attribute not provided will add component generated default id to use with split-bar for reference.\r\n- Each split-bar element contains `role=\"separator\"`.\r\n- Each split-bar element contains `aria-label\"`, if `label` not provided will use component generated default text.\r\n- Each split-bar element contains its current state with a `horizontal` or `vertical` value as `aria-orientation`.\r\n- Each split-bar element contains `aria-controls` with value `{start-pane-id}` and `{end-pane-id}`.\r\n- Each split-bar element contains its current state with a `boolean` value as `aria-disabled`.\r\n\r\n## Regional Considerations\r\n\r\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\r\n"}},{"name":"ids-splitter","attributes":[{"name":"#is-refreshing","values":[]},{"name":"is-refreshing","description":"Check if currently refreshing sizes (prevents infinite recursion)","values":[]},{"name":"height","description":"Override the splitter's height","values":[]},{"name":"#container","description":"Container width.","values":[]},{"name":"#prop","description":"Store some properties based on current axis.","values":[]},{"name":"#pairs","description":"List of pair elements attached.","values":[]},{"name":"#drag-contexts","description":"Active drag contexts by split bar","values":[]},{"name":"#defaults-size","description":"Defaults pane size.","values":[]},{"name":"#resize-observer","description":"Attach the resize observer.","values":[]},{"name":"#is-toggling-expand","values":[]},{"name":"initialized","values":[]},{"name":"#init-observer","description":"Attach the initialize observer.","values":[]},{"name":"#ls","description":"Local storage instance attached to component.","values":[]},{"name":"clear-position","description":"Clear the saved position from local storage","values":[]},{"name":"clear-position-all","description":"Clear all related saved position from local storage","values":[]},{"name":"id-tobe-used","description":"Get the id to be use.","values":[]},{"name":"splitter-panes","values":[]},{"name":"collapsed-threshold-px","description":"Minimum size threshold in pixels to consider a pane as collapsed","values":[]},{"name":"on-language-change","description":"Handle Languages Changes - for switching between RTL to LTR","values":[]},{"name":"is-horizontal","description":"Check if current orientation is horizontal","values":[]},{"name":"axis","description":"Set the splitter axis direction x: horizontal or y: vertical","values":[]},{"name":"disabled","description":"Sets the splitter to disabled","values":[]},{"name":"disable-auto-collapse","description":"Sets the splitter to disable auto collapse on panes","values":[]},{"name":"label","description":"Set the aria-label text for each split bar.","values":[]},{"name":"min-distance","description":"Set the minimum distance for split bars.","values":[]},{"name":"resize-on-drag-end","description":"Sets the splitter to resize on drag end","values":[]},{"name":"save-position","description":"Set splitter save position to local storage.","values":[]},{"name":"unique-id","description":"Set uniqueId to save to local storage.","values":[]},{"name":"show-expand-button","description":"Set whether to show expand button","values":[]},{"name":"text-wrap","description":"Set to true to wrap text","values":[]},{"name":"expanded-width","description":"Set expanded width for expand behavior","values":[]},{"name":"min-width","description":"Set minimum width for dragging constraint","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-splitter\r\n\r\nThe Ids Splitter is used to divide the user interface of a page. It is composed of resizable \"panes\" which divide content. It can layout either horizontally or vertically along an axis where a user can resize the panes, these are represented as `<ids-splitter-pane>` components.\r\n\r\n![Different variations of IdsSplitterLayout](https://infor-design-wp.s3.amazonaws.com/wp-content/uploads/2024/04/08183956/ids-splitter-markup-legend.png)\r\n\r\nThe pane can move to the left or the right of the screen. This allows the user to have control of the customized layout. Elements inside and outside the pane will be resized to fit depending on if their css is fluid.\r\n\r\n## Use Cases\r\n\r\n- Divides the user interface of a screen.\r\n\r\n## Terminology\r\n\r\n- **Splitter**: The splitter container element\r\n- **SplitterPane**: One zone/section inside the splitter\r\n- **SplitBar**: The generated bar element to drag panes to resize\r\n\r\n## Features (With Code Examples)\r\n\r\nA default splitter behavior, axis will set to \"x\" (horizontally) and align will set to \"start\".\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter align set to end.\r\n\r\n```html\r\n<ids-splitter align=\"end\">\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to initial size 30%.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane size=\"30%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to initial size using pixel values. Pixel-based sizes are preserved as `px` in the `size` attribute and CSS, keeping the pane at a fixed position regardless of container resize. The remaining panes adjust proportionally to fill the available space. Bare numeric values (without a unit) are also treated as pixels.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane size=\"200px\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with mixed pixel and percentage sizes. Pixel panes stay fixed while percentage panes scale with the container.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane size=\"150px\"></ids-splitter-pane>\r\n  <ids-splitter-pane size=\"40%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to minimum size of 10% to be resize.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane min-size=\"10%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to maximum size of 80% to be resize, limited to single split only.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane max-size=\"80%\"></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to initial collapsed pane. Collapsed can only apply to start pane.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane collapsed></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with `min-size=\"0\"` to allow panes to fully collapse to 0% width. By default, collapsed panes retain a 40px minimum width. Setting `min-size=\"0\"` bypasses this threshold, useful for pane-switching scenarios where one pane should completely disappear.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane min-size=\"0\" size=\"50%\"></ids-splitter-pane>\r\n  <ids-splitter-pane min-size=\"0\" size=\"50%\"></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with multiple splits.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set as vertically.\r\n\r\n```html\r\n<ids-splitter axis=\"y\">\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set to nested (horizontally and vertically).\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane>\r\n    <ids-splitter axis=\"y\">\r\n      <ids-splitter-pane></ids-splitter-pane>\r\n      <ids-splitter-pane></ids-splitter-pane>\r\n    </ids-splitter>\r\n  </ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter with custom (aria-label) for draggable bar/s.\r\n\r\n```html\r\n<ids-splitter label=\"Custom Resize Text\">\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter to do the resize after drag-end.\r\n\r\n```html\r\n<ids-splitter resize-on-drag-end>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter set as disabled.\r\n\r\n```html\r\n<ids-splitter disabled>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSave splitter position to local storage.\r\n\r\n```html\r\n<ids-splitter unique-id=\"some-uniqueid\" save-position>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n  <ids-splitter-pane></ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\nSplitter pane with padding.\r\n\r\n```html\r\n<ids-splitter>\r\n  <ids-splitter-pane padding=\"md\">Content with medium padding on all sides</ids-splitter-pane>\r\n  <ids-splitter-pane padding-x=\"lg\" padding-y=\"sm\">Content with large horizontal and small vertical padding</ids-splitter-pane>\r\n</ids-splitter>\r\n```\r\n\r\n## Settings and Attributes (Splitter)\r\n\r\n- `align` {string} Set the split bar align direction to start or end\r\n- `always-show-expand-button` {boolean} Always show the expand button, even when not collapsed\r\n- `axis` {string} Set the splitter axis direction x: horizontal or y: vertical\r\n- `disabled` {boolean} Sets the splitter to disabled state\r\n- `expanded-width` {number} Set the expanded width in pixels (default: 250)\r\n- `height` {string} Override the splitter's height (default: 100%)\r\n- `label` {string} Set the aria-label text for each split bar\r\n- `min-distance` {number} Set the minimum distance for split bars in pixels (default: 16)\r\n- `min-width` {number} Set the minimum width for dragging constraint in pixels (default: 0)\r\n- `resizeOnDragEnd` {boolean} Sets the splitter to resize on drag end\r\n- `savePosition` {boolean} Set splitter to save position to local storage\r\n- `show-expand-button` {boolean} Show the expand/collapse button on split bars (default: true)\r\n- `text-wrap` {boolean} Set text items to wrap within the splitter. Other alternates are to use `ids-text` `white-space` setting and the `label-wrap` settings on inputs\r\n- `uniqueId` {string} Set uniqueId to save to local storage, so same saved position can be use for whole app\r\n\r\n## Settings and Attributes (Splitter Pane)\r\n\r\n- `size` {string|number} Sets the pane size. Supports percentage values (`30%`), pixel values (`200px`), or bare numbers (`200`, treated as pixels). Pixel-based sizes remain fixed on container resize; percentage-based sizes scale proportionally.\r\n- `minSize` {string|number} Sets the pane minimum size\r\n- `maxSize` {string|number} Sets the pane maximum size\r\n- `collapsed` {boolean} Set the pane(s) to collapsed state or can use `collapse` on the `ids-splitter`\r\n- `padding` {string} Sets the padding for all sides [xs, sm, md, lg, xl]\r\n- `paddingX` {string} Sets the horizontal padding [xs, sm, md, lg, xl]\r\n- `paddingY` {string} Sets the vertical padding [xs, sm, md, lg, xl]\r\n\r\n## Theme-able Parts (Splitter)\r\n\r\n- `splitter` allows you to further style the splitter element\r\n- `split-bar` allows you to further style the split bar element\r\n- `split-bar-icon` allows you to further style the split bar icon element\r\n\r\n## Theme-able Parts (Splitter Pane)\r\n\r\n- `pane` allows you to further style the splitter pane element\r\n\r\n## Events (Splitter)\r\n\r\n- `beforecollapsed` Fires before the splitter pane get collapsed, you can return false in the response to veto\r\n- `collapsed` Fires after the splitter pane get collapsed\r\n- `beforeexpanded` Fires before the splitter pane get expanded, you can return false in the response to veto\r\n- `expanded` Fires after the splitter pane get expanded\r\n- `beforesizechanged` Fires before the splitter pane size changed, you can return false in the response to veto\r\n- `sizechanged` Fires after the splitter pane size changed\r\n- `save-position` Fires after the local storage settings changed in some way\r\n- `clear-position` Fires after clear the saved position from local storage\r\n\r\n## Methods (Splitter)\r\n\r\n- `clearPosition(uniqueId: string|undefined)` Clear the saved position from local storage, If uniqueId is undefined will use Internal attached\r\n- `clearPositionAll()` Clear all splitter related saved position from local storage\r\n- `collapse(options: { startPane: HTMLElement|string, endPane: HTMLElement|string }): void` Collapse start pane size for given start/end panes or panes CSS selector\r\n- `expand(options: { startPane: HTMLElement|string, endPane: HTMLElement|string }): void` Expand start pane size for given start/end panes or panes CSS selector\r\n- `getAllPairs(): Array<object>` Get list of splitter pairs\r\n- `getPair(options: { startPane: HTMLElement|string, endPane: HTMLElement|string }): object` Get a splitter pair by given start/end panes or panes CSS selector\r\n- `isHorizontal(): boolean` Get true if current orientation is horizontal\r\n- `resize(): void` Resize the component by recalculating container dimensions and repositioning split bars\r\n- `sizes(): Array<number>` Get list of current sizes\r\n- `minSizes(): Array<number>` Get list of current minimum sizes\r\n- `maxSizes(): Array<number>` Get list of current maximum sizes, limited to single split\r\n- `splitterPanes: Array<IdsSplitterPane>` Get array of direct child splitter pane elements\r\n- `template(): string` Returns the template for the component contents\r\n\r\n## States and Variations (With Code Examples)\r\n\r\n- Horizontal: Ability to display horizontal split content\r\n- Vertical: Ability to display vertical split content\r\n- Multiple: Splitter with multiple splits\r\n- Nested: Splitter nested with another splitter (horizontally and/or vertically)\r\n- Disabled: split-bar/s cannot be clicked, hovered, focused or dragged and not visible\r\n\r\n## Keyboard Guidelines\r\n\r\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the split-bar/s.\r\n- <kbd>Down/Left Arrow</kbd>: Resize and moves the focused split-bar to left on horizontal, or bottom on vertical splitter.\r\n- <kbd>Up/Right Arrow</kbd>: Resize and moves the focused split-bar to right on horizontal, or top on vertical splitter.\r\n\r\n## Responsive Guidelines\r\n\r\n- Flows with padding and margin within the width and height of the parent container.\r\n\r\n## Converting from Previous Versions (Breaking Changes)\r\n\r\n**3.x to 4.x**\r\n\r\n- Splitter was a new component added in v4.1.1\r\n- Splitter can be invoked on a container element with `$('#my-element').splitter();`\r\n\r\n**4.x to 5.x**\r\n\r\n- Splitter's base component is now a custom element `<ids-splitter></ids-splitter>`\r\n- Content that should live in \"split\" areas should be slotted into `<ids-splitter-pane></ids-splitter-pane>` components.\r\n- Splitter orientation can be set by use of `axis` settings.\r\n- If using events, events are now plain JS events.\r\n- Can now be imported as a single JS file and used with encapsulated styles\r\n\r\n## Designs\r\n\r\n[Design Specs](https://www.figma.com/file/ri2Knf3KchdfdzRAeds0Ab/IDS-Mobility-v4.6?node-id=1%3A5740)\r\n\r\n## Accessibility Guidelines\r\n\r\n- Splitter component contained in the element has a `role=\"group\"`.\r\n- Each pane element if `id` attribute not provided will add component generated default id to use with split-bar for reference.\r\n- Each split-bar element contains `role=\"separator\"`.\r\n- Each split-bar element contains `aria-label\"`, if `label` not provided will use component generated default text.\r\n- Each split-bar element contains its current state with a `horizontal` or `vertical` value as `aria-orientation`.\r\n- Each split-bar element contains `aria-controls` with value `{start-pane-id}` and `{end-pane-id}`.\r\n- Each split-bar element contains its current state with a `boolean` value as `aria-disabled`.\r\n\r\n## Regional Considerations\r\n\r\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\r\n"}},{"name":"ids-stats","attributes":[{"name":"borderless","description":"Set the borderless attribute","values":[]},{"name":"selected","description":"Set the selected state on the stat, any other states will be toggled","values":[]},{"name":"actionable","description":"If actionable one stat can be toggled trigging an event","values":[]},{"name":"trend-label","description":"Used to showcase price or amount trending up or down (Optional).","values":[]},{"name":"trend-label-color","description":"Set the trend label color","values":[]},{"name":"icon","description":"Use to call attention to status of the KPI.\nCan be colored to bring attention (via statusColor)\n(Optional in larger KPI format).","values":[]},{"name":"status-color","description":"Color that can be used for embellishment or to indicate status or bring attention","values":[]},{"name":"kpi","description":"Large center label. Show up to 6 characters in small size in the KPI area","values":[]},{"name":"main-label","description":"Main KPI Label. Will truncate if too big","values":[]},{"name":"subtitle","description":"Extra details on the KPI. Single line. Auto truncates.","values":[]},{"name":"col-span","description":"Get col-span attribute","values":[]},{"name":"formats","values":[]},{"name":"kpi-format","description":"Get col-span attribute","values":[]},{"name":"trend-format","description":"Get col-span attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-stats\n\n## Description\n\nThis component is deprecated and will be removed in a future release as it was done in a non-flexible manner. Please use the [ids-kpi](../ids-kpi) component and/or [ids-widget](../ids-widget) component instead.\n\nStats are UI embellishments that are used in widgets to display statistical information on widgets primarily. The consist of several elements in a layout with a trend value, a KPI, a main label and a sub label. The stats can also be selectable/clickable.\n\n## Use Cases\n\n- A newer version of the \"counts\" component. But can primarily only be used in widgets.\n- Use when you want users to contribute data to your website and let them organize their content themselves.\n\n## Dos and Don'ts\n\n- Overcrowd your content with Stats, so people can see the data clearly.\n- Don't use too many stats in order to use them clearly to capture the page meaning.\n\n## Terminology\n\n- **KPI**: Abbreviation for key performance indicator\n\n## Features (With Code Examples)\n\nA simple state component with all options.\n\n```html\n<ids-stats\n  trend-label=\"+100.21\"\n  trend-label-color=\"green-50\"\n  icon=\"rocket\"\n  status-color=\"error\"\n  kpi=\"$893\"\n  main-label=\"Revenue Calculation\"\n  subtitle=\"qa 2024\">\n</ids-stats>\n```\n\n## Class Hierarchy\n\n- IdsStats\n  - IdsBox\n  - IdsElement\n- Mixins\n  - IdsEventsMixin\n  - IdsKeyboardMixin\n- Uses\n  - IdsIcon\n  - IdsText\n  - IdsLayoutFlex\n\n## Settings (Attributes)\n\n- `trendLabel` {string} Used to showcase price or amount trending up or down (Optional). If the data contains a + it is shown in success color with a trend icon. If the data is - it is shown in error color.\n- `trendLabelColor` {string} Sets the color of the trend label and its associated icon. Accepts:\n  - IDS design token variables (e.g., 'var(--ids-color-green-50)')\n  - IDS color tokens (e.g., 'green-50', 'blue-100')\n  - Hex color values (e.g., '#FF0000')\n  If invalid or not set, defaults to 'success' (green) for positive trends and 'error' (red) for negative trends.\n- `trendFormat` {object} Allows you to format the trend label using `Intl.NumberFormat` settings or can be set to empty string to have no formatting\n- `icon` {string} Use to call attention to status of the KPI. Can be colored to bring attention (via statusColor. (Optional in larger KPI format).\n- `statusColor` {string} Sets the color of the icon. Can be error, info, success, warning or any palette color like blue, green, orange ect.\n- `kpi` {string} Large center label. Show up to 6 characters in small size in the KPI area.\n- `kpiFormat` {object} Allows you to format the KPI label using `Intl.NumberFormat` settings or can be set to empty string to have no formatting\n- `mainLabel` {string} Main KPI Label. Will truncate if too big.\n- `subtitle` {string} Extra details on the KPI. Single line. Auto truncates.\n\n## Events\n\n- `selected` Fires when selecting a stat\n- `deselected` Fires when unselecting a stat\n\n## Themeable Parts\n\n- `stat` allows you to further style the main container\n\n## States and Variations\n\n- Color\n- Status Color\n- Selected\n- Trend Label Color\n\n## Keyboard Guidelines\n\n- <kbd>Enter/Space</kbd>: If the stat is selectable then this will select the stat\n\n## Responsive Guidelines\n\n- Flows within a widget so home page guidelines apply\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- Stats are now custom elements `<ids-stats></ids-stats>`\n- If using events events are now plain JS events. `selected`, `deselected`\n- If using properties/settings these are now attributes: `kpi`, `main-label`\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The contents will flip to the alternate side in Right To Left mode. Consider that things like dollar signs, plus and minus need to be localized. (We may add this as a future feature if requested)\n"}},{"name":"ids-step-chart","attributes":[{"name":"internal-steps-in-progress","values":[]},{"name":"color","values":[]},{"name":"completed-label","values":[]},{"name":"disabled","description":"Sets the disabled state","values":[]},{"name":"label","values":[]},{"name":"progress-color","values":[]},{"name":"step-number","values":[]},{"name":"steps-in-progress","values":[]},{"name":"value","values":[]}],"description":{"kind":"markdown","value":"# IDS Step Chart\n\n## Description\n\nStep chart provides a custom element <ids-step-chart></ids-step-chart> that, when provided provides a stepped indication that demonstrates progress toward a single goal with an individual bar, they are great for showing action steps or distance from a target number.\n\n## Use Cases\n\n- The step chart is designed to indicate progress through a series of steps, this can be a simple binary, step complete incomplete or optionally allows for a \"in progress\" state that indicates a step is partially completed. this also provides the option for labeling the chart with primary and secondary text indicators. see the features section for more details.\n\n## Terminology\n\n**Step**: Individual block in the component represented by a colored `<div>` can be completed, in progress or not done.\n\n**Completed**: A possible status of a step that will be displayed in a user selected color.\n\n**In Progress**: An optional status of a step that has not been completed but started, will be displayed in a user provided secondary color.\n\n**Not Started**: Default step status for step not in the other two categories, is set by the component to a default graphite.\n\n## Features (With Code Examples)\n\nIds step chart is created by using the <ids-step-chart> element.\nFor an implementation with only a primary label and completed uncompleted steps see the below example.\n\n```html\n<ids-step-chart label=\"2 of 7 steps completed\" color=\"blue-60\" step-number=\"7\" value=\"2\">\n</ids-step-chart>\n```\n\nTo set in progress steps you must pass an array of strings or numbers where each item in the array is the number of the step you want to update and set the `progress-color` attribute.\n```html\n  <ids-step-chart label=\"2 of 7 steps completed\" color=\"blue-60\" step-number=\"7\" value=\"3\" completed-label=\"5 days overdue\" progress-color=\"red-20\">\n```\n\n```js\ninProgressTwo.stepsInProgress = ['3'];\n```\n\nto add a secondary label make use of the completed-label attribute\n\n```html\n  <ids-step-chart label=\"2 of 7 steps completed\" color=\"blue06\" step-number=\"7\" value=\"2\" completed-label=\"5 days remaining\">\n  </ids-step-chart>\n```\nIDS step chart also has an available slot `icon` that can be used to append content after the secondary label like so\n\n```html\n  <ids-step-chart label=\"2 of 7 steps completed\" color=\"blue-60\" step-number=\"7\" value=\"3\" completed-label=\"5 days overdue\" progress-color=\"red-20\">\n    <ids-icon id=\"alert\" slot=\"icon\" icon=\"warning\"></ids-icon>\n  </ids-step-chart>\n```\n\n## Settings and Attributes\n\n  - `color` {string} Sets the color used for completed steps (must use ids provided colors).\n  - `disabled` {boolean} Sets the disabled state.\n  - completed-label: secondary label for the component\n  - label: primary label for the component usually formatted as \"x of y steps completed\n  - progress-color: color used for flagged steps in progress (must use ids provided colors)\n  - stepsInProgress: an array of steps that should be flagged as in progress\n  - step-number: total number of steps in the chart\n  - value: total number of steps completed or in progress\n\n## Keyboard Guidelines\n\nThis component does not add any new keyboard functionality, steps are not tabbable but text is readable by screen readers.\n\n## Designs\n\n[design doc](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Step Chart was added in v4.3.3\n- Step Chart is invoked with `$('#my-element').stepchart();`\n\n**4.x to 5.x**\n\n- Step Chart is now a custom element `<ids-step-chart></ids-step-chart>`\n- Settings are now attributes on the custom element\n\n### Converting from 4.x\n\nIf you are converting this from the enterprise version you will no longer be using the `data-options` attribute. Properties of the `data-options` objects are implemented as attributes of the `ids-step-chart` component as follows:\n\n- `steps: 7` => `step-number=\"7\"`\n- `completed: 2` => `value=\"2\"`\n- `extraText: '2 Days Overdue'` => `completed-label=\"2 Days Overdue\"`\n\nThe `iconType` option has been replaced with a slot called `icon` that can be injected with the desired markup like so:\n\n```html\n<ids-alert slot=\"icon\" icon=\"warning\"></ids-icon>\n```\n\nThe `inProgress` option has been replaced with a property on the component called `stepsInProgress`. This can be set to an array of numbers corresponding to the number of the steps you want to display as in progress. see this example below\n\n```js\neconst element = document.querySelectorAll('ids-step-chart')[3];\nelement.stepsInProgress = ['3'];\n```\n\nColor for `inProgress` steps is not set automatically and a color must be set using the `progress-color` attribute. to duplicate\nexisting red in progress steps use `red-20`.\n\nlabeling for the step chart is handled through the `label` component attribute and there are no special format requirements\n\n## Accessibility Guidelines\n\nKeep in mind that individual steps are not focusable elements as they are purely visual. It is important to keep both primary and secondary labels up to date for screen reader users.\n\n## Regional Considerations\n\nAdd info on what behaviors or considerations the developer needs to know regarding when running in different languages.\n"}},{"name":"ids-swaplist","attributes":[{"name":"datasource","values":[]},{"name":"state","values":[]},{"name":"data","description":"Set the data array of the swaplist","values":[]},{"name":"default-template","description":"Set the internal template via JS","values":[]},{"name":"selected-items","description":"Get all selected ids-swappable-item","values":[]},{"name":"searchable","description":"Set searchable which allows list view to be filtered","values":[]}],"description":{"kind":"markdown","value":"# Ids SwapList\n\n## Description\n\nA swaplist allows for easy movement of objects between two or more lists. The swaplist makes use of IdsSwappable for sorting and swapping functionality and IdsCard for layout.\n\n## Use Cases\n\nA common usecase for swaplists is to select items from a list of available objects. On one list, the user can view all available items. The user can then move an item from the available list to the selected list, and vice versa. This allows the user to view and track all items in the dataset. Users can drag and drop objects from list to list or select items and click an icon to move them to the desired list. Setting new data will update list UI. Interacting with with swaplist UI also updates datasource.\n\n## Features (With Code Samples)\n\nExample using js to populate the lists:\n\n```html\n<ids-swaplist id=\"swaplist-1\">\n    <template>\n        <ids-text>${text}</ids-text>\n    </template>\n</ids-swaplist>\n```\n\n```js\nconst swaplist = document.querySelector('ids-swaplist');\nconst swaplistData = [\n  {\n    \"id\": 1,\n    \"name\": \"Available\",\n    \"items\": [\n      {\n        \"id\": 1,\n        \"text\": \"Option A\",\n        \"value\": \"option_a\"\n      }\n    ]\n  },\n  {\n    \"id\": 2,\n    \"name\": \"Selected\",\n    \"items\": [\n      {\n        \"id\": 2,\n        \"text\": \"Option C\",\n        \"value\": \"option_c\"\n      }\n    ]\n  }\n]\n\nswaplist.data = swaplistData;\n```\n## Settings (Attributes)\n**count** Sets the amount of lists on the page. By default `count` is set to 2.\n\n## Events\n\n- `updated` Fires when datasource is updated after UI list changes\n\n## Methods\n\n- `renderLists` Can be called to re-render lists from datasource.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Swaplist was a new component created in v4.0.6\n\n**4.x to 5.x**\n\n- Swaplist is now a custom element `<ids-swaplist></ids-swaplist>`\n"}},{"name":"ids-swappable-item","attributes":[{"name":"to-swap-item","description":"Reference to the swappable item that is currently being hovered over during touch interactions","values":[]},{"name":"#cloned-card","description":"Stores a reference to the cloned placeholder element created during drag operations","values":[]},{"name":"#drag-start-mouse-point","description":"The point where we start dragging on the mouse\nto delta from for current tracking.","values":[]},{"name":"#drag-start-offset","description":"The transform translation point applied at\nthe time of a dragstart in order to calculate\ndelta during drag","values":[]},{"name":"is-dragging","description":"The flag indicates when an element is being dragged in touch mode.","values":[]},{"name":"#drag-event-class","description":"CSS class names used to identify the drag interaction type","values":[]},{"name":"#cloned-card-class","values":[]},{"name":"row-index","values":[]},{"name":"list-view-item","values":[]},{"name":"drag-mode","values":[]},{"name":"selected","description":"Get the selected attribute","values":[]},{"name":"selected-items","description":"Get all selected swappable items","values":[]},{"name":"all-items","description":"Get all swappable items","values":[]},{"name":"original-text","description":"Get the originalText attribute","values":[]},{"name":"selection","description":"Get the selection attribute","values":[]},{"name":"tabbable","description":"Get whether the item currently allows tabbing.","values":[]}],"description":{"kind":"markdown","value":"# Ids Swappable\n\n## Description\nIdsSwappable is an abstract component that provides functionality for drag and drop between items or lists. It consists of two components `ids-swappable` which is a container for any number of `ids-swappable-item`. The `ids-swappable-item` makes use of s single `slot` where the user can use virtually any component they would like, most commonly `ids-text` or `ids-card`. Touch interaction is currently limited to the `selection=\"single\"` mode only.\n\n## Use Cases\n\nIdsSwappable is used to create the [IdsSwaplist](../ids-swaplist/README.md), which is used to move objects between 2 or more lists, but is not limited to this use case. It can also be used to create standalone sortable/swappable element collections.\n\n## Features (With Code Samples)\n\nBasic Usage:\n\n```html\n<ids-swappable>\n    <ids-swappable-item>\n        <ids-text font-size=\"20\" type=\"h2\" overflow=\"ellipsis\" tooltip=\"true\">Item One</ids-text>\n    </ids-swappable-item>\n    <ids-swappable-item>\n        <ids-text font-size=\"20\" type=\"h2\" overflow=\"ellipsis\" tooltip=\"true\">Item Two</ids-text>\n    </ids-swappable-item>\n    <ids-swappable-item>\n        <ids-text font-size=\"20\" type=\"h2\" overflow=\"ellipsis\" tooltip=\"true\">Item Three</ids-text>\n    </ids-swappable-item>\n</ids-swappable>\n```\n\nIdsSwaplist example:\n\n```html\n<ids-swaplist id=\"swaplist-1\" count=\"2\"></ids-swaplist>\n```\n\n```js\nconst swappable = document.querySelector('#swaplist-1').container.querySelectorAll('ids-swappable');\n\ndata.forEach((d) => {\n    swappable.innerHTML += `\n    <ids-swappable-item>\n        <ids-text>${d.city}</ids-text>\n    </ids-swappable-item>\n    `;\n});\n```\n\n### Mix with other components\n\nSome components support composition with IdsSwappable, such as [IdsTabs](../ids-tabs/README.md).  Since Tabs have their own process for handling selection, using `dragMode=\"always\"` ensures tabs can be moved around regardless of selection:\n\n```html\n<ids-tabs>\n    <ids-swappable dropzone=\"move\">\n        <ids-swappable-item drag-mode=\"always\">\n            <ids-tab value=\"contracts\">Contracts</ids-tab>\n        </ids-swappable-item>\n        <ids-swappable-item drag-mode=\"always\">\n            <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n        </ids-swappable-item>\n        <ids-swappable-item drag-mode=\"always\">\n            <ids-tab value=\"attachments\" disabled>Attachments</ids-tab>\n        </ids-swappable-item>\n        <ids-swappable-item drag-mode=\"always\">\n            <ids-tab value=\"notes\">Notes</ids-tab>\n        </ids-swappable-item>\n    </ids-swappable>\n</ids-tabs>\n```\n\n## Settings (Attributes)\n\n### ids-swappable\n\n**selectedItems** Sets the multi-select attribute. Defaults to false.\n\n### ids-swappable-item\n\n**drag-mode** Defines how/when dragging can occur.  By default (`select`), swappable items must first be selected in order to be dragged.  Setting to `always` makes dragging possible at all times.\n**selected** Sets the selected attribute. Items need to be selected before that can be dragged.\n**originalText** Sets the originalText attribute. This happens when the component is connected and is used to revert the text after item is dropped.\n**tabbable** Sets if the item is tabbable. Defaults to false.\n**disable-drag** Disable the dragging on one item\n\n## Mobile Support\n\nThe component's `selection=\"single\"` mode now supports touch events for mobile devices with the following features:\n\n- Touch events (`touchstart`, `touchmove`, `touchend`) are handled alongside mouse events.\n- Dragging functionality works on both desktop and mobile devices.\n- The `swapped` event is triggered when items are repositioned.\n\n## Events\n\n- `swapped` Fires when an item is dragged up and down. Gives you the DOM element and new position information.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Sortable behavior is part of the Arrange component\n- Arrange was added in v4.2.1\n- Invoke the Arrange component on an element with `$('#my-element').arrange();`\n\n**4.x to 5.x**\n\n- Sortable behavior is now enabled by wrapping elements on a page with `<ids-swappable></ids-swappable>` and `<ids-swappable-item></ids-swappable-item>`\n"}},{"name":"ids-swappable","attributes":[{"name":"is-dragging","values":[]},{"name":"dragging-elements","values":[]},{"name":"root-node","values":[]},{"name":"swap-list","description":"Get the parent swap list component","values":[]},{"name":"over-element","description":"Get the item that is dragged over","values":[]},{"name":"selected-items","description":"Get all the selected ids-swappable-items in the current list","values":[]},{"name":"items-slotted","description":"Get all the ids-swappable-items in the current list","values":[]},{"name":"#start-y","description":"Holds the current start `y` position for drag element","values":[]},{"name":"get-drag-after-element","description":"Calculate the position of the dragging element relative to the container","values":[]}],"description":{"kind":"markdown","value":"# Ids Swappable\n\n## Description\nIdsSwappable is an abstract component that provides functionality for drag and drop between items or lists. It consists of two components `ids-swappable` which is a container for any number of `ids-swappable-item`. The `ids-swappable-item` makes use of s single `slot` where the user can use virtually any component they would like, most commonly `ids-text` or `ids-card`. Touch interaction is currently limited to the `selection=\"single\"` mode only.\n\n## Use Cases\n\nIdsSwappable is used to create the [IdsSwaplist](../ids-swaplist/README.md), which is used to move objects between 2 or more lists, but is not limited to this use case. It can also be used to create standalone sortable/swappable element collections.\n\n## Features (With Code Samples)\n\nBasic Usage:\n\n```html\n<ids-swappable>\n    <ids-swappable-item>\n        <ids-text font-size=\"20\" type=\"h2\" overflow=\"ellipsis\" tooltip=\"true\">Item One</ids-text>\n    </ids-swappable-item>\n    <ids-swappable-item>\n        <ids-text font-size=\"20\" type=\"h2\" overflow=\"ellipsis\" tooltip=\"true\">Item Two</ids-text>\n    </ids-swappable-item>\n    <ids-swappable-item>\n        <ids-text font-size=\"20\" type=\"h2\" overflow=\"ellipsis\" tooltip=\"true\">Item Three</ids-text>\n    </ids-swappable-item>\n</ids-swappable>\n```\n\nIdsSwaplist example:\n\n```html\n<ids-swaplist id=\"swaplist-1\" count=\"2\"></ids-swaplist>\n```\n\n```js\nconst swappable = document.querySelector('#swaplist-1').container.querySelectorAll('ids-swappable');\n\ndata.forEach((d) => {\n    swappable.innerHTML += `\n    <ids-swappable-item>\n        <ids-text>${d.city}</ids-text>\n    </ids-swappable-item>\n    `;\n});\n```\n\n### Mix with other components\n\nSome components support composition with IdsSwappable, such as [IdsTabs](../ids-tabs/README.md).  Since Tabs have their own process for handling selection, using `dragMode=\"always\"` ensures tabs can be moved around regardless of selection:\n\n```html\n<ids-tabs>\n    <ids-swappable dropzone=\"move\">\n        <ids-swappable-item drag-mode=\"always\">\n            <ids-tab value=\"contracts\">Contracts</ids-tab>\n        </ids-swappable-item>\n        <ids-swappable-item drag-mode=\"always\">\n            <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n        </ids-swappable-item>\n        <ids-swappable-item drag-mode=\"always\">\n            <ids-tab value=\"attachments\" disabled>Attachments</ids-tab>\n        </ids-swappable-item>\n        <ids-swappable-item drag-mode=\"always\">\n            <ids-tab value=\"notes\">Notes</ids-tab>\n        </ids-swappable-item>\n    </ids-swappable>\n</ids-tabs>\n```\n\n## Settings (Attributes)\n\n### ids-swappable\n\n**selectedItems** Sets the multi-select attribute. Defaults to false.\n\n### ids-swappable-item\n\n**drag-mode** Defines how/when dragging can occur.  By default (`select`), swappable items must first be selected in order to be dragged.  Setting to `always` makes dragging possible at all times.\n**selected** Sets the selected attribute. Items need to be selected before that can be dragged.\n**originalText** Sets the originalText attribute. This happens when the component is connected and is used to revert the text after item is dropped.\n**tabbable** Sets if the item is tabbable. Defaults to false.\n**disable-drag** Disable the dragging on one item\n\n## Mobile Support\n\nThe component's `selection=\"single\"` mode now supports touch events for mobile devices with the following features:\n\n- Touch events (`touchstart`, `touchmove`, `touchend`) are handled alongside mouse events.\n- Dragging functionality works on both desktop and mobile devices.\n- The `swapped` event is triggered when items are repositioned.\n\n## Events\n\n- `swapped` Fires when an item is dragged up and down. Gives you the DOM element and new position information.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Sortable behavior is part of the Arrange component\n- Arrange was added in v4.2.1\n- Invoke the Arrange component on an element with `$('#my-element').arrange();`\n\n**4.x to 5.x**\n\n- Sortable behavior is now enabled by wrapping elements on a page with `<ids-swappable></ids-swappable>` and `<ids-swappable-item></ids-swappable-item>`\n"}},{"name":"ids-swipe-action","attributes":[{"name":"left-button","values":[]},{"name":"right-button","values":[]},{"name":"swipe-type","description":"Set the swipe interaction method between continuous and reveal (default)","values":[]}],"description":{"kind":"markdown","value":"# ids-swipe-action\n\n## Description\n\nThe swipe action component is a simple component with one or two buttons on the left and right. The user can swipe left or right and activate the action or swipe left and right and click the button to activate the action. On desktop the user will use the actions button with a popup.\n\n## Use Cases\n\n- When you have a mobile heavy application and need to put swipe actions on a container\n\n## Terminology\n\n- **swipe**: An act or instance of moving one's finger across a touchscreen to activate a function.\n\n## Features (With Code Examples)\n\nA normal swipe action with two actions. In continuous mode the action will be executed as you swipe.\n\n```html\n<ids-card auto-height=\"true\">\n  <div slot=\"card-content\">\n    <ids-swipe-action swipe-type=\"continuous\">\n      <ids-button slot=\"action-left\" id=\"action-left-continuous\" type=\"swipe-action-left\">\n        <ids-icon icon=\"reply\" size=\"small\"></ids-icon>\n        <span>Left Action</span>\n      </ids-button>\n      <div slot=\"contents\">\n        <ids-layout-grid cols=\"2\" no-margins=\"true\">\n          <ids-layout-grid-cell>\n            <ids-text font-size=\"16\">Tuesday, 22nd September</ids-text>\n            <ids-text font-size=\"14\">8:40AM-2:00PM</ids-text>\n          </ids-layout-grid-cell>\n          <ids-layout-grid-cell justify=\"end\">\n            <ids-menu-button id=\"actions-continuous\" menu=\"actions-continuous-menu\">\n              <ids-icon icon=\"more\"></ids-icon>\n              <span class=\"audible\">Actions</span>\n            </ids-menu-button>\n            <ids-popup-menu id=\"actions-continuous-menu\" target=\"actions-continuous\" trigger-type=\"click\">\n              <ids-menu-group>\n                <ids-menu-item>Right Action</ids-menu-item>\n                <ids-menu-item>Left Action</ids-menu-item>\n                <ids-menu-item>Other Action</ids-menu-item>\n              </ids-menu-group>\n            </ids-popup-menu>\n          </ids-layout-grid-cell>\n        </ids-layout-grid>\n      </div>\n      <ids-button slot=\"action-right\" id=\"action-right-continuous\" type=\"swipe-action-right\">\n        <ids-icon icon=\"tack\" size=\"small\"></ids-icon>\n        <span>Right Action</span>\n      </ids-button>\n    </ids-swipe-action>\n  </div>\n</ids-card>\n```\n\n## Settings and Attributes\n\n- `swipeType` {string} Set the swipe interaction method between continuous and reveal (default)\n\n## Themeable Parts\n\n- `container` allows you to further style the container element\n- `action-left` allows you to further style the left action button\n- `action-right` allows you to further style the right action button\n\n## States and Variations\n\n- Open\n- Closed\n\n## Keyboard Guidelines\n\nThe swipe action is not keyboard friendly. For this we use the actions button for keyboard users.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n- The swipe does work to a limited degree on chrome via a scroll action. But it is not the most user friendly interaction. For this we use the actions button for keyboard users.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Swipe Action is a new component in v4.53.0\n- Invoke Swipe Action on an element with `$('#my-element').swipeaction();`\n\n**4.x to 5.x**\n\n- Swipe Action has been added as a custom element `<ids-swipe-action></ids-swipe-action>`\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n"}},{"name":"ids-switch","attributes":[{"name":"is-form-component","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"checked","description":"Get the checked state","values":[]},{"name":"form-input","values":[]},{"name":"input","values":[]},{"name":"label-el","description":"Get the label element","values":[]},{"name":"disabled","description":"Get the disabled state","values":[]},{"name":"label","description":"Get the label text","values":[]},{"name":"value","description":"Gets the checkbox `value` attribute","values":[]},{"name":"compact","description":"Get the compact mode state","values":[]},{"name":"size","description":"size attribute","values":[]}],"description":{"kind":"markdown","value":"# ids-switch\n\n## Description\n\nThe IDS Switch component is a simple wrapper around a standard HTMLInputElement that is styled with Infor branding. A switch component is essentially a specially-styled [checkbox component](../ids-checkbox/README.md). Consider using a checkbox for most form layouts; Switch is primarily for settings.\n\n## Use Cases\n\n- Create standalone switch\n- Create switch, each with different styling to provide context for actions that are checked, unchecked, value and disabled.\n\n## Terminology\n\n*Checkbox*: IDS Switch checkbox is a standard basic checkbox element. It can set to checked, unchecked and disabled.\n*Label*: HTMLLabelElement to keep matching with HTMLInputElement. Make sure the label has a meaningful relative.\n\n## Features (With Code Samples)\n\nA standard Switch unchecked element:\n\n```html\n<ids-switch label=\"Allow my profile to be searched\"></ids-switch>\n```\n\nSet as checked, the Switch.\n\n```html\n<ids-switch label=\"Allow notifications\" checked=\"true\"></ids-switch>\n```\n\nAdd an Disabled Switch as unchecked:\n\n```html\n<ids-switch label=\"Automatically approve requests\" disabled=\"true\"></ids-switch>\n```\n\nAdd an Disabled Switch as checked:\n\n```html\n<ids-switch label=\"Allow connections\" checked=\"true\" disabled=\"true\"></ids-switch>\n```\n\nSwitch with the label positioned at the start and sized to fit the full width of the container:\n\n```html\n<ids-switch label=\"Show component\" label-position=\"start\" size=\"full\"></ids-switch>\n```\n\nAlign the switch label text to the end of its fixed-width area with inline positioning:\n\n```html\n<ids-switch label=\"Allow notifications\" label-position=\"inline-start\" label-width=\"350px\" label-alignment=\"end\"></ids-switch>\n<ids-switch label=\"Allow my profile to be searched\" checked=\"true\" label-position=\"inline-start\" label-width=\"350px\" label-alignment=\"end\"></ids-switch>\n```\n\n## Settings (Attributes)\n\n- `checked` {boolean} set checked state.\n- `disabled` {boolean} set disabled state.\n- `label` {string} set the label text.\n- `value` {string} set the form submit value (not to be confused with checked, it only sets the form value)\n- `size` {'xs'|'sm'|'mm'|'md'|'lg'|'full'} set the size (width) of the field\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-alignment` {string} Controls the horizontal text alignment of the label within its fixed-width area when using inline positioning. Options are:\n  - `start` (default): Label text aligns to the start of the label area\n  - `end`: Label text aligns to the end of the label area (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n\n## Keyboard Guidelines\n\nThe IDS Switch doesn't contain any interactions beyond a standard Checkbox HTMLInputElement:\n\n- <kbd>Tab</kbd> and <kbd>Shift Tab</kbd> moves focus into the switch to/from the next focusable item in the tab order.\n- <kbd>Space</kbd> toggle the checked/unchecked state.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Switch was implemented in v4.0.0\n- Switch can be invoked with `$('#my-element').switch()`.\n\n**4.x to 5.x**\n\n- Markup has changed to a custom element `<ids-switch></ids-switch>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n"}},{"name":"ids-sub-tab-attributes","description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-sub-tab","attributes":[{"name":"label","description":"Sets the label attribute value","values":[]},{"name":"tab-contents","description":"Gets the elements assigned to the tab content slot","values":[]},{"name":"highlighted","values":[]},{"name":"dismissible-btn-el","description":"Provides a reference to a close button, if applicable","values":[]},{"name":"dismissible","values":[]},{"name":"selected","values":[]},{"name":"group","values":[]}],"description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-sub-tabs","attributes":[],"description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tab-content","attributes":[{"name":"loading-promise","values":[]},{"name":"load-timeout","values":[]},{"name":"disabled","values":[]},{"name":"value","values":[]},{"name":"active","values":[]},{"name":"hidden","values":[]},{"name":"lazy","values":[]},{"name":"loaded","values":[]},{"name":"loading","values":[]},{"name":"error","values":[]},{"name":"error-message","values":[]}],"description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tab-divider","attributes":[],"description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tab-group","attributes":[{"name":"#is-initializing","values":[]},{"name":"parent-tab","values":[]},{"name":"locale-api","values":[]},{"name":"on-locale-change","values":[]},{"name":"#ro","description":"Watches for changes to the Tab List size and recalculates overflowed tabs, if applicable","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"#value","values":[]},{"name":"value","values":[]},{"name":"overflow","description":"Gets the overflow state","values":[]},{"name":"color","description":"Sets the color attribute","values":[]},{"name":"hide-headers","description":"Sets whether to hide tab headers","values":[]},{"name":"auto-fit","description":"Set the tabs element to auto fit to its parent container's size","values":[]},{"name":"sub-tab-value","description":"Set the sub-tab value","values":[]},{"name":"tab-list-container","values":[]},{"name":"more-container","values":[]},{"name":"tab-list-elements","values":[]},{"name":"last-tab","values":[]},{"name":"tabs","values":[]},{"name":"currently-editing-tab","values":[]},{"name":"last-navigable-tab","values":[]},{"name":"has-app-menu","description":"Indicates whether the tab list contains an app-menu tab","values":[]},{"name":"tab-contents","values":[]},{"name":"tab-more-elem","description":"Gets the ids-tab-more element if it exists","values":[]}],"description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tab-more","attributes":[{"name":"menu","values":[]},{"name":"more-actions-group","values":[]},{"name":"predefined-menu-items","values":[]},{"name":"overflow-menu-items","values":[]},{"name":"available-overflow-tabs","values":[]},{"name":"dropdown-icon","values":[]},{"name":"overflow","values":[]}],"description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tab","attributes":[{"name":"on-action","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"tab-contents","description":"Gets the elements assigned to the tab content slot","values":[]},{"name":"tab-group","description":"Gets the parent tab group element","values":[]},{"name":"lazy","values":[]},{"name":"more-options-btn","values":[]},{"name":"menu","values":[]},{"name":"tab-text-element","values":[]},{"name":"editable","values":[]},{"name":"editing","values":[]},{"name":"actionable","values":[]},{"name":"dismissible","values":[]},{"name":"dismissible-btn-el","description":"Provides a reference to a close button, if applicable","values":[]},{"name":"update-name-btn","description":"Provides a reference to a close button, if applicable","values":[]},{"name":"cancel-name-btn","description":"Provides a reference to a close button, if applicable","values":[]},{"name":"separator","description":"Provides a reference to separator if applicable","values":[]},{"name":"badge","description":"Provides a reference to badge if applicable","values":[]},{"name":"disabled","values":[]},{"name":"previous-selected-state","values":[]},{"name":"selected","values":[]},{"name":"notification-count","values":[]},{"name":"value","values":[]},{"name":"disable-error","description":"Disable the error icon that will appear on a tab upon validation","values":[]},{"name":"has-error","values":[]},{"name":"label","description":"Set the label text for the tab","values":[]},{"name":"hidden","description":"Set the hidden state of the tab","values":[]},{"name":"count","values":[]},{"name":"max-width","values":[]},{"name":"min-width","values":[]},{"name":"#set-data-text-for-bold-fix","description":"Sets the data-text of nested ids-text to it's slot\ntext content. Fixes issue with bold moving around\nwhen we edit content.","values":[]}],"description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tabs-context","attributes":[{"name":"tabs-list-elem","description":"Reference to the internal tabs list element","values":[]},{"name":"tab-list","values":[]},{"name":"auto-fit","description":"Get the auto fit setting","values":[]},{"name":"value","description":"Get the value of the currently selected tab","values":[]},{"name":"hide-headers","description":"Sets whether to hide tab headers","values":[]}],"description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tabs","attributes":[{"name":"#is-initializing","values":[]},{"name":"locale-api","values":[]},{"name":"on-locale-change","values":[]},{"name":"#ro","description":"Watches for changes to the Tab List size and recalculates overflowed tabs, if applicable","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"#value","values":[]},{"name":"value","values":[]},{"name":"color","description":"Sets the color attribute","values":[]},{"name":"hide-headers","description":"Sets whether to hide tab headers","values":[]},{"name":"tab-list-container","values":[]},{"name":"more-container","values":[]},{"name":"tab-list-elements","values":[]},{"name":"last-tab","values":[]},{"name":"tabs","values":[]},{"name":"currently-editing-tab","values":[]},{"name":"last-navigable-tab","values":[]},{"name":"has-app-menu","description":"Indicates whether the tab list contains an app-menu tab","values":[]}],"description":{"kind":"markdown","value":"# ids-tabs\n\n## Description\n\nTabs are a navigation element used to allow users to easily access different areas of a site or different parts of an individual page. A user can navigate between page sections with a tab. Best for communicating different views of the data, or offering navigation between related data.\nway to highlight which section/content in a page you are currently\nfocused on.\n\n## Use Cases\n\n- Used when need information to be highly scannable and to simplify navigation.\n- Used when a page needs a more organized structure.\n\n## Events\n\nThe tabs component fires several events:\n\n- `change` - Fires when a different tab is selected. This event does not fire on initial load, as no change in tab selection has occurred.\n- `tabselect` - Fires when a tab is selected through user interaction. This event fires on initial load to indicate which tab is initially selected, and it will also fires whenever the user selects a tab.\n- `selected.tab-option` - Fires when a menu item is selected from a tab's more options menu.\n- `tab.startedit` - Fires when a tab enters edit mode (editable tabs only).\n- `tab.endedit` - Fires when a tab exits edit mode (editable tabs only).\n\n## Features (With Code Examples)\n\n### New Simplified Structure (Recommended)\n\nThe new simplified structure uses `ids-tab-group` and `ids-tab` components with automatic content management:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Content for contracts tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>Content for opportunities tab goes here</p>\n    </ids-tab>\n    <ids-tab value=\"notes\" label=\"Notes\">\n        <p>Content for notes tab goes here</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Key Features:**\n- Content is placed directly inside `ids-tab` elements with a `label` attribute\n- No need for separate `ids-tab-content` elements or `ids-tabs-context`\n- Automatic content management and switching\n- Cleaner, more intuitive structure\n\n**External Tab Content (Optional):**\n\nYou can also use external `ids-tab-content` elements that will be automatically matched by `value`:\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\">Contracts</ids-tab>\n    <ids-tab value=\"opportunities\">Opportunities</ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>External content for contracts</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>External content for opportunities</p>\n</ids-tab-content>\n```\n\n**Explicit Tab Content Pattern:**\n\nFor certain use cases, you may want to manually create `ids-tab-content` elements as siblings outside the `ids-tab-group`. This pattern is useful when:\n- Working with frameworks like ExtJS that dynamically append content\n- Avoiding extra re-renders in certain framework integrations\n- Separating tab navigation from content rendering for performance optimization\n\n```html\n<ids-tab-group value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\"></ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\"></ids-tab>\n    <ids-tab value=\"attachments\" label=\"Attachments\"></ids-tab>\n</ids-tab-group>\n\n<ids-tab-content value=\"contracts\">\n    <p>Content for contracts tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"opportunities\">\n    <p>Content for opportunities tab</p>\n</ids-tab-content>\n<ids-tab-content value=\"attachments\">\n    <p>Content for attachments tab</p>\n</ids-tab-content>\n```\n\nThis explicit pattern gives you more control over content lifecycle and can be beneficial in complex applications where content management needs to be decoupled from tab navigation.\n\n**Vertical Tabs:**\n```html\n<ids-tab-group orientation=\"vertical\" value=\"contracts\">\n    <ids-tab value=\"contracts\" label=\"Contracts\">\n        <p>Vertical tab content</p>\n    </ids-tab>\n    <ids-tab value=\"opportunities\" label=\"Opportunities\">\n        <p>More vertical content</p>\n    </ids-tab>\n</ids-tab-group>\n```\n\n**Header Tabs:**\nWhen placed inside an `ids-header`, tabs automatically get proper styling:\n\n```html\n<ids-header>\n    <ids-toolbar>\n        <ids-toolbar-section type=\"title\">\n            <ids-text font-size=\"20\">Header Tabs</ids-text>\n        </ids-toolbar-section>\n    </ids-toolbar>\n    <ids-tab-group value=\"contracts\" color-variant=\"header\">\n        <ids-tab value=\"contracts\" label=\"Contracts\">\n            <p>Header tab content</p>\n        </ids-tab>\n        <ids-tab value=\"opportunities\" label=\"Opportunities\">\n            <p>More header content</p>\n        </ids-tab>\n    </ids-tab-group>\n</ids-header>\n```\n\n### Legacy Structure (Still Supported)\n\nA normal default horizontal tab component.\n\n```html\n<ids-tabs value=\"one\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nA vertical tabs component.\n\n```html\n<ids-tabs value=\"one\" orientation=\"vertical\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\nUsing a tab context to show the active tab content in `ids-tab-content`.\n\n```html\n<ids-tabs-context>\n    <!-- tabs context has no outward styling or content, but width/height or display can be set -->\n    <ids-tabs value=\"one\">\n        <ids-tab value=\"one\">Section 1</ids-tab>\n        <ids-tab value=\"two\">Section 2</ids-tab>\n        <ids-tab value=\"three\">Section 3</ids-tab>\n    </ids-tabs>\n    <ids-tab-content value=\"one\">\n        This will be initially visible\n    </ids-tab-content>\n    <ids-tab-content value=\"two\">\n        If ids-tabs value=\"two\" is selected, or ids-tab with value \"two\"\n        is set as selected, then this will be visible and one will be hidden\n    </ids-tab-content>\n    <ids-tab-content value=\"three\">\n        And this will show if the ids-tabs value or selection becomes \"three\",\n        similar to the previous content entry. Only one will be shown at once.\n    </ids-tab-content>\n</ids-tabs-context>\n```\n\nIt's also possible to create Module Tabs for top-level navigation in your application\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n</ids-tabs>\n```\n\n### Overflowed Tabs\n\nWhen creating a tab list with many tabs, its possible there will not be enough screen real-estate to display them all.  In this situation you can also add a special \"More Tabs\" tab component:\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\">Example Five</ids-tab>\n    <ids-tab value=\"six\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\n### Fixed placement of Tabs and Actions\n\nSome items slotted in IdsTabs should not spill into the \"More Actions\" area and should always be present.  Using the `fixed` slot name on these elements causes them to sit inside a \"fixed\" on the right of the IdsTabs.  In cases where overflow is present, the actions will be adjacent to a visible More Actions tab.\n\n```html\n<ids-tabs value=\"one\" color-variant=\"module\">\n    <ids-tab value=\"one\">Example One</ids-tab>\n    <ids-tab value=\"two\">Example Two</ids-tab>\n    <ids-tab value=\"three\">Example Three</ids-tab>\n    <ids-tab value=\"four\">Example Four</ids-tab>\n    <ids-tab value=\"five\" slot=\"fixed\">Example Five</ids-tab>\n    <ids-tab value=\"six\" slot=\"fixed\">Example Six</ids-tab>\n    <ids-tab-more overflow></ids-tab-more>\n</ids-tabs>\n```\n\nWhen this component is present in a tab list, it will only be displayed when there is not enough space to display all other tabs present.  When clicking on this tab, it opens an [IdsPopupMenu](../ids-popup-menu/README.md) containing menu items that reflect all tabs currently \"overflowed\" (in practice, the tabs that are hidden).  Selecting an item from the menu causes the menu item's corresponding tab to be activated.\n\n### Dismissible Tabs\n\nTabs can be configured to display an optional [IdsTriggerButton](../ids-trigger-field/README.md) (marked with an \"X\") that will remove it from the tab list when clicked.  If a content pane with a matching `value` attribute exists, the IdsTabsContext element locates and removes it. When a tab is dismissed, it emits a `tabremove` event.\n\n```html\n<ids-tab value=\"one\" dismissible>Example One</dismissible>\n```\n\n### Editable Tabs\n\nTabs can be configured to allow inline editing of their names. When the `editable` attribute is set, users can double-click on the tab to enter edit mode, or use the more options menu to access the edit functionality.\n\n```html\n<ids-tab value=\"one\" editable>Editable Tab Name</ids-tab>\n```\n\n#### Editing Interactions\n\n- **Double-click**: Double-clicking on an editable tab enters edit mode\n- **More Options Menu**: Click the more options button and select \"Edit\" from the menu\n- **Save Changes**: Press Enter or click the update button to save changes\n- **Cancel Changes**: Press Escape or click the cancel button to discard changes\n\n#### Dirty Tracking\n\nEditable tabs automatically enable dirty tracking to indicate when the tab name has been modified from its original value.\n\n### More Options Menu\n\nTabs can display a more options menu by adding menu items to the `more-options` slot. This provides additional actions for individual tabs.\n\n```html\n<ids-tab value=\"one\" editable>\n  Tab with Options\n  <ids-menu-group slot=\"more-options\">\n    <ids-menu-item value=\"edit\">Edit</ids-menu-item>\n    <ids-menu-item value=\"duplicate\">Duplicate</ids-menu-item>\n    <ids-menu-item value=\"delete\">Delete</ids-menu-item>\n  </ids-menu-group>\n</ids-tab>\n```\n\n#### Handling Menu Actions\n\nListen for the `selected.tab-option` event to handle menu item selections:\n\n```javascript\ntabsElement.addEventListener('selected.tab-option', (e) => {\n  const { option, elem } = e.detail;\n\n  switch (option) {\n    case 'edit':\n      elem.editTabName();\n      break;\n    case 'duplicate':\n      // Custom duplication logic\n      break;\n    case 'delete':\n      elem.dismiss();\n      break;\n  }\n});\n```\n\n### Sub Tabs (Tabs with dropdown list of other tabs)\n\nTabs can be configured to display a list of sub tabs under a parent tab using attribute `sub-tabs`.\n\n```html\n<ids-tab value=\"paper\" sub-tabs=\"[Cash, Plates, Bags]\">Paper</ids-tab>\n<ids-tab value=\"payment\" sub-tabs=\"[Credit Card, Online]\">Payment</ids-tab>\n```\n\n### Min-Width, Max-Width and Tooltip for Tabs\n\nTabs can be configured to set up its minimum, maximum width and tooltip in case of overflow/ellipsis.\n\n```html\n<ids-tab min-width=\"120\" max-width=\"120\" tooltip=\"true\" dismissible value=\"example-one\">Example One</ids-tab>\n```\n\n### Lazy Loading\n\nTab content can be configured to load lazily, meaning the content is only rendered when the tab is first activated. This improves initial page load performance when you have many tabs with heavy content.\n\n#### Template-based Lazy Loading\n\nUse a `<template>` element inside a lazy tab to define content that will be rendered when needed:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"eager\" label=\"Eager Loading\">\n    This content loads immediately\n  </ids-tab>\n\n  <ids-tab value=\"lazy-template\" label=\"Lazy Template\" lazy>\n    <template>\n      <ids-layout-grid padding=\"md\">\n        <ids-text font-size=\"12\" type=\"p\">\n          This content was loaded lazily from a template when the tab was first activated!\n        </ids-text>\n      </ids-layout-grid>\n    </template>\n  </ids-tab>\n</ids-tab-group>\n```\n\n#### Programmatic Lazy Loading\n\nFor dynamic content, listen to the `tabload` event and populate content programmatically:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-programmatic\" label=\"Lazy Programmatic\" lazy>\n    <!-- Content will be added via JavaScript -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-programmatic') {\n    // Show loading indicator\n    content.innerHTML = `\n      <ids-layout-grid padding=\"md\">\n        <ids-loading-indicator label=\"Loading content...\"></ids-loading-indicator>\n      </ids-layout-grid>\n    `;\n\n    // Load content asynchronously\n    fetchData().then(data => {\n      content.innerHTML = `<p>${data}</p>`;\n      content.loaded = true;\n      content.loading = false;\n    }).catch(error => {\n      content.loading = false;\n      // Error will be handled automatically\n    });\n  }\n});\n```\n\n#### Lazy Loading Events\n\n- `tabload` - Fired when lazy content starts loading\n- `tabloaded` - Fired when lazy content finishes loading successfully\n- `tabloaderror` - Fired when lazy content loading fails\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  console.log(`Loading ${e.detail.value}...`);\n});\n\ntabGroup.addEventListener('tabloaded', (e) => {\n  console.log(`Loaded ${e.detail.value} successfully!`);\n});\n\ntabGroup.addEventListener('tabloaderror', (e) => {\n  console.error(`Failed to load ${e.detail.value}:`, e.detail.error);\n});\n```\n\n#### Error Handling\n\nWhen lazy loading fails, the `tabloaderror` event is fired with detailed error information. You can handle errors by setting a custom error message and using the `triggerError()` method:\n\n```html\n<ids-tab-group value=\"eager\">\n  <ids-tab value=\"lazy-error\" label=\"Lazy Error\" lazy>\n    <!-- Content will fail to load to demonstrate error handling -->\n  </ids-tab>\n</ids-tab-group>\n```\n\n```javascript\ntabGroup.addEventListener('tabload', (e) => {\n  const { value, content } = e.detail;\n\n  if (value === 'lazy-error') {\n    // Set custom error message\n    content.errorMessage = 'Network timeout: Unable to fetch content from server';\n\n    // Simulate loading failure\n    setTimeout(() => {\n      const error = new Error('Network timeout');\n      content.triggerError(error);\n    }, 3000);\n  }\n});\n```\n\n#### Lazy Loading Methods\n\n- `load()` - Manually trigger loading of lazy content\n- `reload()` - Force reload of content (even if already loaded)\n- `unload()` - Clear loaded content and reset to unloaded state\n- `triggerError(error)` - Manually trigger error state with specified error\n\n#### Framework Integration Notes\n\n**Angular Applications:**\n\n- All lazy loading operations are properly cleaned up to prevent memory leaks\n- Race conditions are prevented through internal loading guards\n- Custom events properly bubble for Angular change detection\n- Template content duplication is prevented on multiple loads\n\n**Best Practices:**\n\n- Always handle `tabloaderror` events for robust error handling\n- Use `unload()` method when dynamically removing tabs to free memory\n- Consider using `reload()` for refresh functionality in long-running applications\n\n### Validation Errors\n\nWhen a tab contains a field that has a validation error, an error icon will be displayed on the tab. This is useful in scenarios where all tabs must contain valid data before proceeding (e.g when inside a modal). The error icon can also be manually controlled by setting the `has-error` attribute on the tab. The error icon is slotted and can be replaced or styled as needed.\n\n```html\n<ids-tab value=\"manual-error\" has-error>\n    Manually show error icon\n</ids-tab>\n<ids-tab value=\"custom-error\">\n    Custom error icon\n    <ids-icon slot=\"error\" color=\"warning\" icon=\"alert\" size=\"small\"></ids-icon>\n</ids-tab>\n<ids-tab value=\"hidden-error\">\n    No error icon\n    <template slot=\"error\"></template>\n</ids-tab>\n```\n\n### Hide Headers\n\nTabs can be configured to hide their headers while maintaining all tab content functionality. This is useful for creating form pages, wizard-like interfaces, or any scenario where you want to use tabs as a content container system without visible navigation.\n\n```html\n<ids-tabs hide-headers value=\"step1\">\n  <ids-tab value=\"step1\">Step 1</ids-tab>\n  <ids-tab value=\"step2\">Step 2</ids-tab>\n  <ids-tab value=\"step3\">Step 3</ids-tab>\n</ids-tabs>\n\n<ids-tab-content tab=\"step1\">\n  <h3>Step 1 Content</h3>\n  <p>This content is managed by tabs but headers are hidden.</p>\n  <ids-button id=\"go-to-step2\">\n    Go to Step 2\n  </ids-button>\n</ids-tab-content>\n\n<ids-tab-content tab=\"step2\">\n  <h3>Step 2 Content</h3>\n  <p>Navigate programmatically between steps.</p>\n</ids-tab-content>\n```\n\n#### Programmatic Navigation\n\nWhen headers are hidden, navigation must be controlled programmatically:\n\n```javascript\nconst tabs = document.querySelector('ids-tabs');\nconst goToStep2Btn = document.querySelector('#go-to-step2');\n\n// Switch to a specific tab\ntabs.value = 'step2';\n\n// Add event listener for navigation\ngoToStep2Btn?.addEventListener('click', () => {\n  tabs.value = 'step2';\n});\n\n// Toggle headers visibility\ntabs.hideHeaders = false; // Show headers\ntabs.hideHeaders = true;  // Hide headers\n\n// Listen for tab changes\ntabs.addEventListener('change', (e) => {\n  console.log('Current step:', e.detail.value);\n});\n```\n\n## Settings and Attributes\n\n### Tab Group Settings (`ids-tab-group`) - New Structure\n\n- `value` {string} set which tab is currently selected by matching tab values\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on\n- `color-variant` {'alternate'|'module'|'header'} (optional) sets the Tabs color variant. Automatically set to 'header' when inside `ids-header`\n- `overflow` {boolean} enables overflow menu behavior. When enabled, tabs that don't fit in the available space are moved to an `ids-tab-more` dropdown menu\n- `color` {string} (optional) sets custom color for module variant tabs\n\n### Tab Container Settings (`ids-tabs`) - Legacy Structure\n\n- `disabled` {boolean} disables all tabs.\n- `hide-headers` {boolean} hides the tab headers while keeping tab content functionality. Useful for creating form pages or wizard-like interfaces where navigation is controlled programmatically.\n- `value` {string} set which tab is currently selected. If tab children do not have a value, will fall back to being a 0-based index. Otherwise, it can also be any string as long as there are relevant matches for the values.\n- `orientation` {'horizontal' | 'vertical'} defaults to horizontal; controls the direction/axis tabs are flowed on.\n- `color-variant` {'alternate'|'module'} (optional) sets the Tabs color variant.  The `alternate` variant is used on header components and set automatically when placed inside of an `ids-header` component.  The `module` variant displays Module Tabs, which are generally used as top-level navigation only.\n- `color` {'alternate'|'module'} (optional) sets the Tabs custom color (aka personalization). This is only valid for `color-variant=\"module\"`.\n\n### Individual Tabs Settings (`ids-tab`)\n\n- `label` {string} when set, creates a content area within the tab for direct content placement (new structure)\n- `actionable` {boolean} labels a tab as having a corresponding action, such as \"Add\", \"Reset\", \"Activate Application Menu\", etc.  Tabs that use this setting should also have an `onAction` callback applied, which will be triggered upon selecting the tab.  Tabs that are `actionable` will not cause content in tab panels to be displayed.\n- `disabled` {boolean} allows you to disable a tab among a set of tabs.\n- `editable` {boolean} enables inline editing of the tab name. Users can double-click to edit or use the more options menu.\n- `has-error` {boolean} display an error indicator on the tab.\n- `hidden` {boolean} when enabled hides the `ids-tab` and it's corresponding `ids-tab-content`.\n- `selected` {boolean} allows for a tab to display its selected state.  In some cases, tabs with this value set to true will also automatically display their corresponding Tab Panel's content.  Tabs that have an `actionable` attribute applied are not able to be \"selected\" -- selecting those tabs will focus them.\n- `value` {string | number} the value which when the parent `ids-tabs` or `ids-tab-group` also has an equivalent for, selects this tab.\n- `notification-count` {string | number} the value which will show in the badge beside the tab text.\n\n### Tab Content Settings (`ids-tab-content`)\n\n- `value` {string | number} the value that associates this content with its corresponding tab.\n- `active` {boolean} whether this tab content is currently visible.\n- `hidden` {boolean} when enabled hides the tab content.\n- `lazy` {boolean} enables lazy loading for this tab content.\n- `loaded` {boolean} readonly - indicates if lazy content has been loaded.\n- `loading` {boolean} readonly - indicates if lazy content is currently loading.\n- `error-message` {string} custom error message to display when loading fails.\n\n## Themeable Parts\n\n- `container` allows you to style the container of the tab\n\n## States and Variations (With Code Examples)\n\nWhen placed inside of an `IdsHeader` component, the `ids-tabs` component automatically gains the property `color-variant` which is set to `alternate` as it's default style.\n\n## Keyboard Guidelines\n\n- TAB should move off of the component to the next focusable element on page.\n- SHIFT + TAB should move to previous focusable element on the page.\n- Direction keys (UP/DOWN for vertical, LEFT/RIGHT for horizontal) should move between tabs\n- ENTER should select a tab.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tabs was implemented in v4.0.0\n- Tabs can be invoked with `$('#my-element').tabs()`.\n\n**4.x to 5.x**\n\n- Tabs are now custom elements `<ids-tabs value=${selection}></ids-tabs>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- Content within the tabs are specified as `<ids-tab value=${selection-value}>`Tab Label/Content`</ids-tab>`\n- Tabs and their panels are now wrapped with a context element `<ids-tabs-context></ids-tabs-context>` for controlling which tab is displayed\n- Tabs can optionally display overflow by inserting an `<ids-tab-more overflow></ids-tab-more>` component into the `<ids-tabs></ids-tabs>` component\n\n## Regional Considerations\n\nText within tabs should be localized in the current language. They should also should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tag-list","attributes":[],"description":{"kind":"markdown","value":"# ids-tag\n\n## Description\n\nTags are UI embellishments that are used to label, categorize and organize keywords surrounding\nsome contextual element such as a form.\n\n## Import\n\n```js\nimport IdsTag from 'mode_modules/ids-enterprise-wc/components/ids-tag/ids-tag';\n```\n\n## Use Cases\n\n Note that the tags and badges look the same but should not be used interchangeably. A badge is used mainly for alphanumeric values i.e. numbers currency ect. and should not cannot take an icon or text. For text information you can use use a tag. For icons use an icon or status icon or alert icon.\n\n- Use when the content on your page is mapped into multiple categories and does not only fit into one hierarchical category.\n- Use when you want users to contribute data to your website and let them organize their content themselves.\n\n## Dos and Don'ts\n\n- Overcrowd your content with tags, so people can see the items clearly.\n- Don't use too many tags in order to use them clearly to capture what its tagging.\n\n## Terminology\n\n- **Tag**: A UI embellishments for classification\n- **Clickable/Dismissible**: Tag can be closed and removed with an X button\n- **Classification**: How tags are labelled with colors and text\n- **Disabled**: Tag can be disabled so it cannot be followed or clicked.\n\n## Features (With Code Examples)\n\nA normal tag used as a web component.\n\n```html\n<ids-tag>Normal Tag</ids-tag>\n```\n\nA normal tag used using just the css. This is limited to normal tags only.\n\n```html\n<span class=\"ids-tag\">Normal Tag</span>\n```\n\nA colored tag is done by adding the `color` attribute and one of the following: secondary, error, success, caution or a hex color beginning with a # character.\n\n```html\n<ids-tag color=\"secondary\">Secondary Tag</ids-tag>\n<ids-tag color=\"error\">Error Tag</ids-tag>\n<ids-tag color=\"success\">Success Tag</ids-tag>\n<ids-tag color=\"caution\">Warning Tag</ids-tag>\n<ids-tag color=\"#EDE3FC\">Custom Tag Color</ids-tag>\n```\n\nA Custom colored tag is done by adding the `text-color` attribute that accepts design tokens like (foreground-dark-default) or hex values starting with # along with the `color` attribute on ids-tag web component.\n\n```html\n<ids-tag color=\"success\" text-color=\"foreground-dark-default\">Custom Success Tag</ids-tag>\n<ids-tag color=\"#C31014\" text-color=\"#FFFFFF\">Custom Red Tag</ids-tag>\n<ids-tag color=\"caution\" text-color=\"foreground-dark-default\">Custom Warning Tag</ids-tag>\n```\n\nThe Tag component also has a sibling component called Tag List, it can be used to layout tags in a list of tags for showing classifications. It adds a bit of margin before and after and on sides. And can listen to dismiss events.\n\n```html\n<ids-tag-list>\n  <ids-tag dismissible=\"true\">#Tag One</ids-tag>\n  <ids-tag dismissible=\"true\">#Tag Two</ids-tag>\n  <ids-tag dismissible=\"true\">#Tag Three</ids-tag>\n  <ids-tag dismissible=\"true\">#Tag Four</ids-tag>\n</ids-tag-list>\n```\n\n## Class Hierarchy\n\n- IdsTag\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsKeyboardMixin\n\n## Settings (Attributes)\n\n- `clickable` {boolean} Turns on the functionality to make the tag clickable like a link\n- `dismissible` {boolean} Turns on the functionality to add an (x) button to clear remove the tag\n- `color` {string} Sets the color to a internal color such as `blue` or may be a hex starting with a `#`\n- `text-color` {string} Sets Custom font-color or foreground color such as `foreground-dark-default` or a hex starting with a `#` on ids-tag web component\n- `width` {string} Sets the width of the tag (e.g., '100px', '50%')\n- `height` {string} Sets the height of the tag (e.g., '30px', '2rem')\n\n## Events\n\n- `beforetagremove` Fires before the tag is removed allowing to veto the action. Detail contains the element `elem` and the callback for vetoing\n- `tagremove` Fires at the time the tag is removed. Detail contains the element `elem`\n- `aftertagremove` Fires after the tag is removed from the DOM. Detail contains the element `elem`\n\n## Methods\n\n- `dismiss` Removes the tag from the page.\n\n## Themeable Parts\n\n- `checkbox` allows you to further style the checkbox input element\n- `slider` allows you to further style the sliding part of the switch\n- `label` allows you to further style the label text\n\n## States and Variations\n\n- Color\n- Linkable\n- Badge\n- Disabled\n- Closable\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the tab is focusable this will focus or unfocus the tag.\n- <kbd>Backspace / Alt+Del</kbd>: If the tag is dismissible then this will remove the tag.\n- <kbd>Enter</kbd>: If the tag is clickable then this will follow the tag link.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tag was implemented in v4.0.0\n- Tag can be invoked with `$('#my-element').tag()`.\n\n**4.x to 5.x**\n\n- Tags are now custom elements `<ids-tag color=\"error>Text</ids-tag>`\n- If using events events are now plain JS events. `beforetagremove`, `tagremove`, `aftertagremove`\n- If using properties/settings these are now attributes: `dismissible`, `color`\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n- [Design Specs 4.5](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n- [Design Specs 4.6](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The close and link icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tag","attributes":[{"name":"color","description":"Set the tag color","values":[]},{"name":"text-color","description":"Set the text color of the tag component","values":[]},{"name":"text-ellipsis","description":"Set the text ellipsis on for overflow","values":[]},{"name":"dismissible","description":"If set to true the tag has an x to dismiss","values":[]},{"name":"disabled","description":"Sets the tag to disabled state so it cannot be dismissed or clicked","values":[]},{"name":"clickable","description":"Gets clickable state","values":[]},{"name":"width","description":"Set the width of the tag","values":[]},{"name":"height","description":"Set the height of the tag","values":[]}],"description":{"kind":"markdown","value":"# ids-tag\n\n## Description\n\nTags are UI embellishments that are used to label, categorize and organize keywords surrounding\nsome contextual element such as a form.\n\n## Import\n\n```js\nimport IdsTag from 'mode_modules/ids-enterprise-wc/components/ids-tag/ids-tag';\n```\n\n## Use Cases\n\n Note that the tags and badges look the same but should not be used interchangeably. A badge is used mainly for alphanumeric values i.e. numbers currency ect. and should not cannot take an icon or text. For text information you can use use a tag. For icons use an icon or status icon or alert icon.\n\n- Use when the content on your page is mapped into multiple categories and does not only fit into one hierarchical category.\n- Use when you want users to contribute data to your website and let them organize their content themselves.\n\n## Dos and Don'ts\n\n- Overcrowd your content with tags, so people can see the items clearly.\n- Don't use too many tags in order to use them clearly to capture what its tagging.\n\n## Terminology\n\n- **Tag**: A UI embellishments for classification\n- **Clickable/Dismissible**: Tag can be closed and removed with an X button\n- **Classification**: How tags are labelled with colors and text\n- **Disabled**: Tag can be disabled so it cannot be followed or clicked.\n\n## Features (With Code Examples)\n\nA normal tag used as a web component.\n\n```html\n<ids-tag>Normal Tag</ids-tag>\n```\n\nA normal tag used using just the css. This is limited to normal tags only.\n\n```html\n<span class=\"ids-tag\">Normal Tag</span>\n```\n\nA colored tag is done by adding the `color` attribute and one of the following: secondary, error, success, caution or a hex color beginning with a # character.\n\n```html\n<ids-tag color=\"secondary\">Secondary Tag</ids-tag>\n<ids-tag color=\"error\">Error Tag</ids-tag>\n<ids-tag color=\"success\">Success Tag</ids-tag>\n<ids-tag color=\"caution\">Warning Tag</ids-tag>\n<ids-tag color=\"#EDE3FC\">Custom Tag Color</ids-tag>\n```\n\nA Custom colored tag is done by adding the `text-color` attribute that accepts design tokens like (foreground-dark-default) or hex values starting with # along with the `color` attribute on ids-tag web component.\n\n```html\n<ids-tag color=\"success\" text-color=\"foreground-dark-default\">Custom Success Tag</ids-tag>\n<ids-tag color=\"#C31014\" text-color=\"#FFFFFF\">Custom Red Tag</ids-tag>\n<ids-tag color=\"caution\" text-color=\"foreground-dark-default\">Custom Warning Tag</ids-tag>\n```\n\nThe Tag component also has a sibling component called Tag List, it can be used to layout tags in a list of tags for showing classifications. It adds a bit of margin before and after and on sides. And can listen to dismiss events.\n\n```html\n<ids-tag-list>\n  <ids-tag dismissible=\"true\">#Tag One</ids-tag>\n  <ids-tag dismissible=\"true\">#Tag Two</ids-tag>\n  <ids-tag dismissible=\"true\">#Tag Three</ids-tag>\n  <ids-tag dismissible=\"true\">#Tag Four</ids-tag>\n</ids-tag-list>\n```\n\n## Class Hierarchy\n\n- IdsTag\n  - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsKeyboardMixin\n\n## Settings (Attributes)\n\n- `clickable` {boolean} Turns on the functionality to make the tag clickable like a link\n- `dismissible` {boolean} Turns on the functionality to add an (x) button to clear remove the tag\n- `color` {string} Sets the color to a internal color such as `blue` or may be a hex starting with a `#`\n- `text-color` {string} Sets Custom font-color or foreground color such as `foreground-dark-default` or a hex starting with a `#` on ids-tag web component\n- `width` {string} Sets the width of the tag (e.g., '100px', '50%')\n- `height` {string} Sets the height of the tag (e.g., '30px', '2rem')\n\n## Events\n\n- `beforetagremove` Fires before the tag is removed allowing to veto the action. Detail contains the element `elem` and the callback for vetoing\n- `tagremove` Fires at the time the tag is removed. Detail contains the element `elem`\n- `aftertagremove` Fires after the tag is removed from the DOM. Detail contains the element `elem`\n\n## Methods\n\n- `dismiss` Removes the tag from the page.\n\n## Themeable Parts\n\n- `checkbox` allows you to further style the checkbox input element\n- `slider` allows you to further style the sliding part of the switch\n- `label` allows you to further style the label text\n\n## States and Variations\n\n- Color\n- Linkable\n- Badge\n- Disabled\n- Closable\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the tab is focusable this will focus or unfocus the tag.\n- <kbd>Backspace / Alt+Del</kbd>: If the tag is dismissible then this will remove the tag.\n- <kbd>Enter</kbd>: If the tag is clickable then this will follow the tag link.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tag was implemented in v4.0.0\n- Tag can be invoked with `$('#my-element').tag()`.\n\n**4.x to 5.x**\n\n- Tags are now custom elements `<ids-tag color=\"error>Text</ids-tag>`\n- If using events events are now plain JS events. `beforetagremove`, `tagremove`, `aftertagremove`\n- If using properties/settings these are now attributes: `dismissible`, `color`\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n- [Design Specs 4.5](https://www.figma.com/file/yaJ8mJrqRRej8oTsd6iT8P/IDS-(SoHo)-Component-Library-v4.5?node-id=760%3A771)\n- [Design Specs 4.6](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The close and link icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-text","attributes":[{"name":"root-node","values":[]},{"name":"#original-text","values":[]},{"name":"#parent-wrapper","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"font-size","description":"Set the font size of the text with a class.","values":[]},{"name":"text-mask-character","description":"Sets the number of characters to reveal in masked text","values":[]},{"name":"mask-type","description":"Gets the current mask type","values":[]},{"name":"masked","description":"Gets whether the text is currently masked","values":[]},{"name":"word-break","description":"Gets the current word-break value","values":[]},{"name":"mask-btn","values":[]},{"name":"font-weight","description":"Adjust font weight; can be either \"bold\" or \"lighter\"","values":[]},{"name":"type","description":"Set the type of HTML element is (h1-h6, p, span (default))","values":[]},{"name":"white-space","description":"Set the how to address the white-space in the element.","values":[]},{"name":"color","description":"If set to \"unset\", color can be controlled by parent container\nIf set to \"muted\" will apply as disabled color","values":[]},{"name":"audible","description":"Set audible as screen reader only text","values":[]},{"name":"visible-text-content","description":"Get the visible text content, excluding any child ids-text elements with audible=\"true\"","values":[]},{"name":"disabled","description":"Set the text to disabled color.","values":[]},{"name":"error","description":"Set the text to error color.","values":[]},{"name":"label","description":"Set the text to label color.","values":[]},{"name":"data","description":"Set the text to data color.","values":[]},{"name":"max-width","description":"Set the maxWidth of the text (used for ellipsis)","values":[]},{"name":"line-clamp","description":"Truncates text at a specific number of lines.","values":[]},{"name":"overflow","description":"Set how content overflows; can specify 'ellipsis', or undefined or 'none'","values":[]},{"name":"text-align","description":"Set the given text align","values":[]},{"name":"status","description":"Set the given status","values":[]},{"name":"translate-text","description":"If set to true the value in the text will be considered a key and\nsent to the translation function","values":[]},{"name":"word-wrap","description":"Get the current word wrap setting","values":[]},{"name":"translation-key","description":"Get the current translation key","values":[]},{"name":"translation-params","description":"Get the current translation parameters","values":[]},{"name":"label-wrap","description":"Get the current label wrap setting","values":[]}],"description":{"kind":"markdown","value":"# ids-text\n\n## Description\n\nThis component styles arbitrary text elements using the design guidelines.\n\n## Use Cases\n\n- When you need static text on a page\n- When you need disabled appearing text in a page\n- When you need text to display status state in a page\n\n## Typography\n\nTypography is used to present content in a variety of styles and size, and is essential for establishing information hierarchies, ensuring readability, and creating consistency within the content of Infor products. Typography works in tandem with icons, colors, and user patterns to create a clear landscape of what is possible in any given application.\n\n### Typography Usage\n\nTypography in our design system is presented as a series of variants which can be mixed and matched to create different font styles for different copy on your product. Text sizes range from 10 to 72, with thick and thin weights. Infor Design System uses the Source Sans Pro font, which is a friendly and approachable sans serif that brings a human touch to our enterprise software.\n\nEach typographical style contains two size values. The first denotes the size of the type, while the second denotes the corresponding line height, which is shown as 125% of the type size.\n\nSee “Variations” for more detail about our typography and use cases.\n\n### Display Text - Brand use only\n\nRanging from 40 to 72 in size, these are meant for display in presentations and marketing materials. They are not used in applications or apps.\n\n### Heading Text\n\nRanging from 20 to 32 in size, heading text can have a weight of 400 or 600. These are meant for title text in applications, and might be seen on a masthead, application header, or widget title. We recommend that these sizes only be used as titles, rather than as paragraph or body text.\n\n### Body text\n\nRanging from 14 to 16 in size, body text can have a weight of 400 or 600. These are meant for display in applications and apps. Our most used text size is 16, which works well for body text in cards, tabs, modals and many other components. Captions or small text are 14.\n\n### Body Text (All Caps)\n\nRanging from 10 to 12 in size, small text can have a weight of 300 or 600. Due to its small size, this body text contains all capital letters to improve readability and fit accessibility standards. While these sizes can be used for captions, we recommend using them sparingly due to their reduced visibility.\n\n### Quick Reference\n\n|Name|Size (px)|Weight|Line Height|Capitalization|\n|----|---------|------|-----------|--------------|\nDisplay 01|72|300|91|Normal\nDisplay 02|60|300|75|Normal\nDisplay 03|48|300|60|Normal\nDisplay 04|40|300|50|Normal\nHeading 32|32|400|40|Normal\nHeading 32 Bold|32|600|40|Normal\nHeading 28|28|400|35|Normal\nHeading 28 Bold|28|600|35|Normal\nHeading 24|24|400|30|Normal\nHeading 24 Bold|24|600|30|Normal\nHeading 20|20|400|25|Normal\nHeading 20 Bold|20|600|25|Normal\nBody Text|16|400|20|Normal\nBody Text Bold|16|600|20|Normal\nBody SM|14|400|18|Normal\nBody SM Bold|14|600|18|Normal\nSmall Text 01|12|400|15|Uppercase\nSmall Text 01 Bold|12|600|15|Uppercase\nSmall 02|10|400|13|Uppercase\nSmall 02 Bold|10|600|13|Uppercase\n\n### Colors\n\nWhen using color in type, make sure to follow the guidelines below:\n\n1. Text color should have adequate contrast to its background. You can test the contrast [here](https://www.tpgi.com/color-contrast-checker/).\n2. Do not use alert colors unless the text corresponds to an alert.\n3. Text colors should be mapped to a style token in IDS to ensure consistency.\n\n### Common variations\n\nWhile most text will appear in neutral-80 and fall within the type styles defined above, text color may also take the following variations in certain circumstances:\n\n1. Descriptive Text\n\nThis is the most frequently-used text color and serves as the default for short phrases and longer paragraphs. The color used for descriptive text is usually neutral-10.\n\n2. Linked Text\n\nThis is an interactive link to another page in Infor software or to external webpages. Please refer to the hyperlink documentation for further details. Text is underlined and is in blue-60.\n\n3. Muted Text\n\nThis shows disabled functions; this text cannot be edited when it shows in an input area. The color for muted or disabled text should appear in a Neutral tone lighter than the descriptive text (usually 06 or lighter).\n\n4. Alert Text\n\nThis serves as notification text that tells users of changes, errors, or updates. The color for this text is Status 01 (red-60).\n\n5. Strong Text\n\nThis is heavily weighted text, used to make terms or phrases stand out. This text will appear with a weight of 600. Because of its increased weight, strong text has more flexibility with its contrast to the background.\n\n5. Design Token Text\n\nThe design tokens can also be used to set the text color. These are some examples in `ids-foundation`.\n\n```css\n  --ids-color-foreground-default-default: var(--ids-color-black-100);\n  --ids-color-foreground-default-secondary: var(--ids-color-black-80);\n  --ids-color-foreground-default-tertiary: var(--ids-color-black-60);\n  --ids-color-foreground-default-disabled: var(--ids-color-black-40);\n  --ids-color-foreground-light-default: var(--ids-color-white-100);\n  --ids-color-foreground-light-secondary: var(--ids-color-white-80);\n  --ids-color-foreground-light-tertiary: var(--ids-color-white-60);\n  --ids-color-foreground-light-disabled: var(--ids-color-white-40);\n  --ids-color-foreground-dark-default: var(--ids-color-black-100);\n```\n\nTo use design tokens you can use `color=\"foreground-default-tertiary\"` removing the start part.\n\n### Visual Guidelines\n\nTake readability and line length into consideration when designing and working with all Infor CloudSuite applications. We suggest keeping text between 50-75 characters per line.\n\n### Typography References\n\nLearn more about this topic [here](https://www.interaction-design.org/literature/article/web-fonts-are-critical-to-the-online-user-experience-don-t-hurt-your-reader-s-eyes).\n\n## Terminology\n\n- **Text**: A a human-readable sequence of character s and the words\n- **Disabled**: Text can be disabled, this is usually done with some other element in mind. For example a disabled field label\n- **Audible**: Text that does not appear in the page but is read by users with screen readers in order to give them information.\n\n### Text alignments\n\nSets the horizontal alignment of the content inside a block element, setting can be specified in one of the following ways:\n\n- **Start**: It is same as left if direction is left-to-right and right if direction is right-to-left.\n- **End**: It is same as right if direction is left-to-right and left if direction is right-to-left.\n- **Center**: The content will be center align.\n- **Justify**: The content will be justified. Text should be spaced to line up its left and right edges to the left and right edges, except for the last line.\n\n### Text status\n\nText can be display the status state in a page. It will show bullet character along text. Text and bullet both are display in various colors based on type of status, available options are as:\n\n- **Base**: Show the base status, normal color for bullet and text.\n- **Error**: Show the error status, error color for built and text.\n- **Info**: Show the info status, info color for built and text.\n- **Success**: Show the success status, success color for built and text.\n- **Warning**: Show the warning status, warning color for built and text.\n\n## Features (With Code Examples)\n\nA normal text element used as a web component in size 16px.\n\n```html\n<ids-text font-size=\"16\">Normal Text</ids-text>\n```\n\nA Disabled appearing text element.\n\n```html\n<ids-text disabled=\"true\">Disabled Text</ids-text>\n```\n\nUsing the data/label.\n```html\n<ids-text label=\"true\">Title</ids-text>\n<ids-text data=\"true\">Some random data</ids-text>\n```\n\nUsing the text alignments.\n```html\n<ids-text text-align=\"end\">Some text display as end align</ids-text>\n```\n\nUsing the text status.\n```html\n<ids-text status=\"error\">Error</ids-text>\n```\n\nUsing label-wrap to control text overflow.\n```html\n<ids-text label=\"true\" label-wrap=\"ellipsis\" tooltip=\"true\">This is a very long label that will be truncated with ellipsis</ids-text>\n<ids-text label=\"true\" label-wrap=\"wrap\" tooltip=\"true\">This is a very long label that will wrap to multiple lines</ids-text>\n<ids-text label=\"true\" label-wrap=\"ellipsis-no-stretch\" tooltip=\"true\">This is a very long label that will be truncated without stretching</ids-text>\n<ids-text label=\"true\" label-wrap=\"wrap-no-stretch\" tooltip=\"true\">This is a very long label that will wrap without stretching</ids-text>\n```\n\nUsing word-break to control how words break across lines.\n\n```html\n<ids-text word-break=\"break-all\">Thisisaverylongwordwithoutanyspaces</ids-text>\n<ids-text word-break=\"keep-all\">This text will not break words</ids-text>\n<ids-text word-break=\"break-word\">Verylongwordthatwillbreakappropriately</ids-text>\n```\n\nText mask to show/hide text content.\n```html\n<ids-text mask-type=\"button-mask\">1234567890</ids-text>\n```\n\n## Settings and Attributes\n\n- `type` {boolean} Set the type of HTML text element used underneath. Common ones would be p, span, h1-h6 but any Html element type will work. Defaults to span\n- `audible` {string} Set `audible` string (screen reader only text)\n- `disabled` {boolean} Set the text to disabled in appearance\n- `fontSize` {string} Set the size of font to use (in pixels) we use design tokens for this in specific increments [10 | 12 | 14 | 16 | 20 | 24 | 28 | 32 | 40 | 48 | 60 | 72 ]\n- `color` {string} If set to `unset`, the CSS color will be `'unset'` allowing you to color with surrounding content. If set to \"muted\" will apply as disabled color.\n- `color-variant` {string} can be set to \"alternate\" to display contrasting color for text via the [IdsColorVariantMixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-color-variant-mixin/README.md)\n- `data` {boolean} Sets the css of the text to the according theme\n- `label` {boolean} Sets the css of the text to the according theme\n- `label-wrap` {string} Controls how long text labels are displayed. Options:\n  - `wrap` (default): Label text wraps to multiple lines when needed\n  - `ellipsis`: Label text is truncated with ellipsis when it overflows (use with `tooltip=\"true\"` to show full text on hover)\n  - `wrap-no-stretch`: Label wraps but doesn't stretch beyond container width\n  - `ellipsis-no-stretch`: Label is truncated with ellipsis and doesn't stretch beyond container width (use with `tooltip=\"true\"` to show full text on hover)\n- `text-align` {string} Sets the text alignments `start`, `end`, `center`, `justify`\n- `status` {string} Sets the text status `base`, `error`, `info`, `success`, `warning`\n- `text-mask-character` {number} Specifies the number of characters to display unmasked at the end of the text content. Maximum value is 4 characters.\n- `mask-type` {'button-mask' | 'masked-only' | 'icon-mask'} Controls how sensitive text is displayed and revealed. Use `button-mask` to show a button with both icon and label, `icon-mask` to show only an icon button, or `masked-only` to display masked text without any reveal option.\n- `max-width` {number} Sets the max width of the text before ellipsis is shown, used for the `overflow` and `tooltip` options\n- `overflow` {string} If set to `ellipsis` the text overflow style will be set to overflow. Can be used with the `tooltip` option.\n- `line-clamp` {number} Sets the number of visual lines before cutting off the text. Useful but not limited to the `overflow` and `tooltip` options\n- `tooltip` {boolean} Can be set to true, if the text is cut off to ellipsis a tooltip will show the contents\n- `word-break` {string} Controls how words break when reaching the end of a line. Options:\n  - `normal` (default): Use default line break rules\n  - `break-all`: Breaks can occur between any characters to prevent overflow\n  - `keep-all`: Prevents breaks between words (useful for CJK text)\n  - `break-word`: Breaks long words at arbitrary points to prevent overflow\n\n## Themeable Parts\n\n- `text` allows you to further style the text element\n\n## States and Variations (With Code Examples)\n\n- Audible\n- Size\n- Disabled\n- Color Variant (alternate)\n- Status\n- Text alignment\n- Text mask\n\n## Keyboard Guidelines\n\nText is not keyboard focusable so has no keyboard shortcuts.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions\n\n- 3.x: Did not exist\n- 4.x: Convert spans/ h1-h6 to use the web component with types\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nText should be localized in the current language. And should flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-textarea","description":{"kind":"markdown","value":"# ids-textarea\n\n## Description\n\nThe IDS Textarea component is a simple wrapper around a standard HTMLTextareaElement that is styled with Infor branding, and contains some additional API that makes it easy to set textarea, label, and functionality.\n\n## Use Cases\n\n- Create a standalone textarea\n- Create a textarea, with different styling to provide context for actions that are disabled, readonly, and various sizes, types.\n\n## Terminology\n\n- Textarea: A standard basic textarea element. It can set to various types, size, and functionality. IDS Textarea will add `aria-required` for required elements.\n- Label: HTMLLabelElement to keep matching with HTMLTextareaElement. Make sure the textarea label has a meaningful relative to textarea. IDS Textarea will add pseudo UI `*` for required elements.\n\n## Features (With Code Samples)\n\nA standard Text Textarea is a basic textarea element:\n\n```html\n<ids-textarea label=\"Basic\"></ids-textarea>\n```\n\nSets textarea as Disabled:\n\n```html\n<ids-textarea label=\"Disabled\" disabled=\"true\"></ids-textarea>\n```\n\nAdd an Readonly to Textarea this way:\n\n```html\n<ids-textarea label=\"Readonly\" readonly=\"true\"></ids-textarea>\n```\n\nSet the `autoselect` to so that inputs get selected on focus using the `autoselect` attribute. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n\n```html\n<ids-textarea label=\"Autoselect\" autoselect=\"true\">Text select on focus</ids-textarea>\n```\n\nSet validation `required` to Textarea this way:\n\n```html\n<ids-textarea label=\"Required\" validate=\"required\"></ids-textarea>\n```\n\nSet the Dirty Tracking to Textarea this way:\n\n```html\n<ids-textarea label=\"Dirty Tracking\" dirty-tracker=\"true\"></ids-textarea>\n```\n\nSet the Resizable to Textarea this way:\n\n```html\n<ids-textarea label=\"Resizable\" resizable=\"true\"></ids-textarea>\n```\n\nSet the Max Length to Textarea this way:\n\n```html\n<ids-textarea label=\"Max Length\" maxlength=\"90\">Line One</ids-textarea>\n```\n\nSet the Max Length and Custom Text to Textarea this way:\n\n```html\n<ids-textarea label=\"Max Length (Custom Text)\" maxlength=\"90\" char-max-text=\"This text cannot exceed {0} characters.\" char-remaining-text=\"You can type {0} more characters.\">Line One</ids-textarea>\n```\n\nSet the Auto Grow to Textarea this way:\n\n```html\n<ids-textarea label=\"Auto Grow\" autogrow=\"true\"></ids-textarea>\n```\n\nSet the Auto Grow and Max Height to Textarea this way:\n\n```html\n<ids-textarea label=\"Auto Grow (Max Height)\" autogrow=\"true\" max-height=\"200\"></ids-textarea>\n```\n\nSet the Rows to Textarea this way:\n\n```html\n<ids-textarea label=\"Rows\" rows=\"15\">Line One</ids-textarea>\n```\n\nSet the Text Align to Text Textarea this way:\n\n```html\n<ids-textarea label=\"Default align (left)\">Default align</ids-textarea>\n<ids-textarea label=\"Left align\" text-align=\"start\">Left align</ids-textarea>\n<ids-textarea label=\"Center align\" text-align=\"center\">Center align</ids-textarea>\n<ids-textarea label=\"Right align\" text-align=\"end\">Right align</ids-textarea>\n```\n\nSet the sizes, available sizes are `'sm'|'md'|'lg'|'full'` and default type is `size=\"md\"`.\n\n```html\n<ids-textarea label=\"Full\" size=\"full\"></ids-textarea>\n```\n\nSet the sizes, available sizes are `'sm'|'md'|'lg'|'full'` and default type is `size=\"md\"`.\n\n```html\n<ids-textarea label=\"Placeholder\" placeholder=\"Type your notes here...\">></ids-textarea>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-textarea label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-textarea>\n<ids-textarea label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-textarea>\n```\n\n## Settings (Attributes)\n\n- `autogrow` {boolean} Sets automatically expand to fit the contents when typing.\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `characterCounter` {boolean} Sets a counter that counts down from the maximum character.\n- `charMaxText` {string} Sets text that will be used in place of the `max` text.\n- `charRemainingText` {string} Sets text that will be used in place of the `remaining` text.\n- `clearable` {boolean} Sets clearable icon on the textarea. See [Ids Clearable Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-clearable-mixin/README.md) for more information.\n- `dirtyTracker` {boolean} Sets dirty tracker to textarea. See [Ids Dirty Tracker Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-dirty-tracker-mixin/README.md) for more information.\n- `disabled` {boolean} Sets disabled state. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `label` {string} Sets the label text.\n- `labelAlignY` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `labelPosition` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `labelRequired` {boolean} Sets the required indicator on label text.\n- `labelWidth` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `maxHeight` {number|string} Sets max height of the textarea when `autogrow` is enabled.\n- `maxlength` {number|string} Sets the maximum characters allowed in textarea.\n- `noMargins` {boolean} Sets to remove the default margins.\n- `placeholder` {string} Sets the placeholder text to textarea.\n- `printable` {boolean} Sets whether or not the textarea can be displayed on a printed page.\n- `readonly` {boolean} Sets readonly state. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `resizable` {boolean} Sets to resize the height of the textarea.\n- `rows` {number|string} Sets to visible height of a textarea in lines.\n- `size` {string} Sets the textarea size, it will set `md` as default.\n- `textAlign` {string} Sets text-align to textarea, it will set `left` as default.\n- `validate` {string} Sets the textarea validation rules, use `space` to add multiple validation rules.\n- `validationEvents` {string} Sets the textarea validation events, use `space` to add multiple validation rules, it will set `blur` as default.\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `value` {string} Sets the textarea value.\n\n## Themeable Parts\n\n- `textarea` allows you to further style the textarea input element\n- `label` allows you to further style the label text\n\n## Keyboard Guidelines\n\nThe IDS Textarea doesn't contain any interactions beyond a standard HTMLTextareaElement:\n\n- <kbd>Tab</kbd> and <kbd>Shift Tab</kbd> moves focus into the edit field to/from the next focusable item in the tab order.\n\n## Responsive Guidelines\n\n- Default size is 362px wide but there are a number of widths.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Textarea was implemented in v4.0.0\n- Textarea can be invoked with `$('#my-element').textarea()`.\n\n**4.x to 5.x**\n\n- Textarea is now a custom element `<ids-textarea></ids-textarea>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n- If using the `clearable` attribute, the \"X\" trigger button on the textarea is now tabbable by default for accessibility\n\n### Converting from 4.x\n\nThe IDS Textarea component is now a WebComponent. Instead of using classes to define the type, it is done directly:\n\n```html\n<!-- 4.x textarea example -->\n<div class=\"field\">\n    <label for=\"textarea-desc\">Description</label>\n    <textarea class=\"textarea\" id=\"textarea-desc\" name=\"textarea-desc\"></textarea>\n</div>\n\n<!-- this is the same textarea using the WebComponent -->\n<ids-textarea label=\"Description\" id=\"textarea-desc\"></ids-textarea>\n```\n\n## Designs\n\n## Alternate Designs\n\n## Proposed Changes\n\n## Test Plan\n\n1. Accessibility - Axe\n1. Visual Regression Test\n1. Repeat Tests in All Supported Browsers\n1. Some of these as test cases from the [WC gold standard](https://github.com/webcomponents/gold-standard/wiki#api)\n1. Can be consumed in NG/Vue/React (pull it in standalone/built see it works standalone)\n\n## Accessibility Guidelines\n\n## Regional Considerations\n"}},{"name":"ids-theme-switcher","attributes":[{"name":"popup","values":[]},{"name":"menu-button","values":[]},{"name":"on-locale-change","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"mode","description":"Set the mode of the current theme","values":[]},{"name":"self-managed","description":"If true the themes are self managed by eh developer (no fetches will be attempted)","values":[]},{"name":"theme","description":"Set the theme","values":[]},{"name":"locale-menu","description":"Sets the state of the locale menu visibility","values":[]}],"description":{"kind":"markdown","value":"# ids-theme-switcher\n\n## Description\n\nWe include a theme switcher component that can be visual or non visual. If visual it comes with a menu button to allow you to pick theme. If non visible you can set its properties and all other components in the page will change theme to the set theme.\n\nYou can include the initial theme one of two ways.\n\n1. Let the components manage the styles in head manually\n2. If you need to serve the css files in a different way you can include the theme manually as a link. Then the theme switcher will replace the file name section when you use it. Or you could full manage this yourself (replacing the theme file changes theme). For example:\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <link rel=\"stylesheet\" href=\"/my-place/themes/ids-theme-default-light.css\">\n</head>\n<body>\n```\n\n## Use Cases\n\n- When you want to use a common look across applications with a theme\n- When you prefer a dark vs light mode or need a high contrast mode for low light situations or Accessibility.\n\n## Terminology\n\n- **Theme**: A broad term to describe changing the look of the application. We essentially have 6 themes from a historical sense but have tried change Terminology over time and currently refer to a theme as one of the UI versions (New vs Classic)\n- **Modes**: Formerly called Variant and lets you switch between dark, light and high contrast with in the version essentially constituting a new theme.\n- **Versions**: Formerly called Theme and lets you switch between the New look and the Classic look and maybe in the future more themes.\n- **New**: The new Formerly called Uplift and Vibrant\n- **Classic**: Formerly called Soho and Subtle\n\n## Features (With Code Examples)\n\nAdd an ids-theme-switcher to the page near the top and set the version and mode properties.\n\n```html\n<ids-theme-switcher mode=\"dark\"></ids-theme-switcher>\n```\n\n## Settings and Attributes\n\n- `mode` {string} Turns on the functionality to add an (x) button to clear remove the tag\n- `selfManaged` {boolean} If added no links will attempt to be fetch via the fetch api. The expectation is you will manage the style sheet themes manually.\n\n## Converting from Previous Versions\n\n- 3.x: This version did not have any themes\n- 4.x: You no longer change the style sheet out like in previous versions\n- 5.x: You no longer need to change the style sheet out like in previous versions because the css in encapsulated within each component now\n\n## Proposed Changes\n\n- Fix Accessibility issue (1.4.1 Use of Color) by adding an icon to the color tags.\n- Fix Accessibility issue (1.4.3 Contrast (Minimum)) by changing or not using some tags\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. The New Version of the theme has better color usage than the classic theme.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1.   The New Version of the theme has better contrast than the classic theme. Light and Dark mode pass WCAG AA and High Contrast passes WCAG AAA\n\n## Regional Considerations\n\nAs a point of interest colors can have certain meanings associated with them for countries and cultures. We found this [article on color meaning](https://www.shutterstock.com/blog/color-symbolism-and-meanings-around-the-world) interesting.\n"}},{"name":"ids-time-picker-common","description":{"kind":"markdown","value":"# ids-time-picker\n\n## Description\n\nThe Timepicker Component provides a click/touch user interface for setting a time.\n\n## Use Cases\n\n- Entering an exact, unrestricted time (allowing any time to be entered, such as 11:39). In this use case, users should be allowed to either type the time values or select them.\n- Entering time intervals (e.g., allowing time entry only in specific set intervals, such as 15 or 30 minutes). In this case, you should either prevent users from manually entering the minute values or automatically correct manual entries to the nearest interval\n- Entering time values only within a specific range of time (such as only enter times within standard business hours). In this case, you should either prevent users from manually entering values or automatically correct manual entries to the nearest valid time\n\n## Terminology\n\n- **Timepicker**: A UI element for setting hours, minutes, seconds and periods (am/pm).\n- **Popup**: A window/modal that appears when the timepicker is clicked.\n- **Dropdowns**: Input elements for selecting hours, minutes, seconds and periods (am/pm).\n- **Period**: AM (before noon) and PM (after noon).\n- **Toggle**: Timepicker's popup will be opened if already closed, or closed if already opened.\n- **Disabled**: Timepicker can be disabled so it cannot be followed or clicked.\n- **Readonly**: Timepicker can be set to readonly so it cannot be edited.\n\n## Settings (Attributes)\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `autoopen` {boolean} Automatically opens the popup on focus.\n- `autoupdate` {boolean} Automatically updates the time string value and hides the \"Set Time\" button.\n- `colorVariant` {string} set the current color variant.\n- `compact` {boolean} sets the component to be compact mode.\n- `dirtyTracker` {boolean} sets the dirty tracking feature on to indicate a changed field. See [Ids Dirty Tracker Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-dirty-tracker-mixin/README.md) for more information.\n- `disabled` {boolean} Disables the timepicker. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `fieldHeight` {string} defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `format` {string} Sets the time format pattern (e.g., 'hh:mm:ss a' for 12-hour with seconds, 'HH:mm' for 24-hour)\n- `hidden` {boolean} Hides the element from display\n- `id` {string} Sets the unique identifier for the timepicker component\n- `readonly` {boolean} Makes the timepicker readonly. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `label` {string} Set the timepicker's label\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `placeholder` {string} Set the timepicker's placeholder\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `size` `{'sm' | 'md' | 'lg' | 'full' | string}` Sets the size of the input-field's width\n- `embeddable` {boolean} Set whether or not to show only hours/minutes/seconds dropdowns without input\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `minuteInterval` {number} Set minutes dropdown options interval. Default is 5\n- `secondInterval` {number} Set seconds dropdown options interval. Default is 5\n- `hours` {number} Set initial value for hours dropdown in the popup or retrieve the dropdown value\n- `minutes` {number} Set initial value for minutes dropdown in the popup or retrieve the dropdown value\n- `seconds` {number} Set initial value for seconds dropdown in the popup or retrieve the dropdown value\n- `period` {number} Set initial value for period dropdown in the popup or retrieve the dropdown value\n- `validate` {'required'|'time'|string} - Input validation rules\n- `validationEvents` {string} - Input validation events, `change blur` as default\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `startHour` {number} - Set the start of limit hours. Default is 0\n- `endHour` {number} - Set the end of limit hours. Default is 24\n- `useCurrentTime` {true|false} - Set whether or not to show current time in the dropdowns. When `true`, the dropdowns default to the current system time. When `false`, the dropdowns default to the first available option in each dropdown. If a value is selected by the user this value will stay even if the field is cleared.\n- `roundToInterval` {true|false} - Set whether or not to round minute/seconds to the time intervals\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `overflow` {string} Controls how text content is handled when it overflows the input field. Options are:\n  - `ellipsis`: Truncates overflowing text with an ellipsis (...) and shows full text in tooltip on hover\n- `tooltip` {string|Boolean} Controls tooltip behavior for the input field. Options are:\n  - `true`: Automatically shows tooltip when text overflows (works with `overflow=\"ellipsis\"`)\n  - Custom string: Shows the specified text as tooltip\n  - `false` or not set: No tooltip is displayed\n\n## Events\n\n- Event listeners for inputs such as `input`, `blur`, `change`, `focus`, `select`, `keydown`, `keypress`, `keyup`, `click`, `dbclick`, `beforetriggerclicked`, `triggerclicked` events can be used on the time picker component.\n\n```js\nconst timePicker = document.querySelector('ids-time-picker');\n\ntimePicker.input.addEventListener('change');\n```\n- Event listeners for popup `show`, `hide` events can be added to `popup` property:\n```js\nconst timePicker = document.querySelector('ids-time-picker');\n\ntimePicker.popup.addEventListener('show');\ntimePicker.popup.addEventListener('hide');\n```\n- Event `timeselected` Fires when clicking the set time button in the popup:\n```js\ntimePicker.addEventListener('timeselected', (e) => {\n  console.log('Selected Time:', e.detail.value);\n  console.log('TimePicker Element:', e.detail.elem);\n});\n```\n\n## Methods\n\n- `open()` Open the timepicker's popup window\n- `close()` Close the timepicker's popup window\n\n## Themeable Parts\n\n- `container` allowing to style the container of the component\n- `trigger-button` allowing to style the trigger button\n- `icon` allowing to style the icon in the trigger button\n- `input` allowing to style the input element\n- `popup` allowing to style the popup with dropdowns\n- `btn-set` allowing to style the set button in the popup\n- `hours` allowing to style the hours dropdown\n- `minutes` allowing to style the minutes dropdown\n- `seconds` allowing to style the seconds dropdown\n- `period` allowing to style the period dropdown\n\n## Features (With Code Examples)\n\nA normal timepicker used as a web component.\n\n```html\n<ids-time-picker\n  label=\"12-Hour Time Picker w/ seconds and period (am/pm)\"\n  placeholder=\"Enter your start time\"\n  format=\"hh:mm:ss a\"\n></ids-time-picker>\n```\n\nA `disabled` timepicker and a `readonly` timepicker.\n\n```html\n<ids-time-picker label=\"Disabled Time Picker\" value=\"10:30 AM\" disabled></ids-time-picker>\n\n<ids-time-picker label=\"Readonly Time Picker\" value=\"10:30 AM\" readonly></ids-time-picker>\n```\n\nAn `autoselect` timepicker and an `autoupdate` timepicker.\n\n```html\n<ids-time-picker label=\"Autoselect Time Picker\" value=\"10:30 AM\" autoselect></ids-time-picker>\n\n<ids-time-picker label=\"Autoupdate Time Picker\" value=\"10:30 AM\" autoupdate></ids-time-picker>\n```\n\nIt's also possible to configure the timepicker with a custom time format. This allows the timepicker to be configured in 24-hour/Military time and/or with a seconds picker for more accurate time.\n\n```html\n<ids-time-picker\n  label=\"12-Hour Time Picker (w/ seconds)\"\n  format=\"hh:mm:ss\"\n></ids-time-picker>\n\n<ids-time-picker\n  label=\"24-Hour Time Picker\"\n  format=\"HH:mm\"\n></ids-time-picker>\n```\n\nIt's also possible to control the intervals of minutes and seconds available for picking.\n\n```html\n<ids-time-picker\n  label=\"5-minute intervals\"\n  format=\"hh:mm\"\n  minute-interval=\"5\"\n></ids-time-picker>\n\n<ids-time-picker\n  label=\"10-second intervals\"\n  format=\"hh:mm:ss\"\n  second-interval=\"10\"\n></ids-time-picker>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-time-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-time-picker>\n<ids-time-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-time-picker>\n```\n\nControl text overflow and tooltip behavior for input values:\n\n```html\n<!-- Show ellipsis for overflowing text with automatic tooltip -->\n<ids-time-picker\n  label=\"Time picker with overflow tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  size=\"xs\"\n></ids-time-picker>\n\n<!-- Custom tooltip text -->\n<ids-time-picker\n  label=\"Time picker with custom tooltip\"\n  tooltip=\"Enter your preferred time\"\n  value=\"10:15 AM\"\n></ids-time-picker>\n```\n\n## Class Hierarchy\n\n- IdsTimePicker\n  - IdsElement\n- Mixins\n  - IdsEventsMixin\n  - IdsKeyboardMixin\n  - IdsPopupOpenEventsMixin\n  - IdsLocaleMixin\n\n## Keyboard Guidelines\n\n- <kbd>Enter</kbd>: Opens the popup window, if the timepicker is not disabled or read-only.\n- <kbd>ArrowDown</kbd>: Opens the popup window, if the timepicker is not disabled or read-only.\n- <kbd>Escape</kbd> or <kbd>Backspace</kbd>: Closes the popup window, if the timepicker is not disabled or read-only.\n- <kbd>Tab</kbd>: Moves focus to the next focusable element.\n- Within the popup, use arrow keys to navigate between time options.\n\n## Responsive Guidelines (TODO)\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Timepicker was implemented in v4.0.0\n- Timepicker can be invoked with `$('#my-element').timepicker()`.\n\n**4.x to 5.x**\n- Listeners for input and popup events should be added to references `input` and `popup` now. See Events section.\n- `disable/readonly/tabbable` are now attributes not methods\n- Timepicker are now custom element `<ids-time-picker></ids-time-picker>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs WC](https://www.figma.com/file/ri2Knf3KchdfdzRAeds0Ab/IDS-Mobility-v4.6?node-id=1%3A5740)\n\n## Accessibility Guidelines\n\n- The Time Picker needs to support both manual time entry (hours, minutes, and, on rare occasions, seconds) as well as some method of selecting from valid entries. Depending on the use case, users may be able to manually enter a time or only select from a restricted set of values.\n- The Time Picker implements the ARIA combo box pattern with proper role and state attributes\n- Screen readers announce the component as a combo box with popup functionality\n- ARIA attributes include:\n  - `role=\"combobox\"` on the input field\n  - `aria-haspopup=\"dialog\"` to indicate popup type\n  - `aria-expanded` to communicate popup state (true/false)\n  - `aria-controls` linking input to popup element\n  - `aria-describedby` for format instructions\n  - `aria-invalid` for validation state indication\n  - `aria-disabled`/`aria-readonly` for state indication\n- Live region announcements provide feedback for:\n  - Time selection confirmation\n  - Popup open/close states\n  - Validation errors\n  - Automatic interval rounding adjustments\n- The trigger button has a clear `aria-label` for its purpose\n- Supports both manual time entry and selection from valid entries\n- All interactive elements are keyboard accessible\n- Focus management ensures proper navigation flow\n\n## Regional Considerations (TODO)\n\nLabels should be localized in the current language. The close and link icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-time-picker-popup","attributes":[{"name":"is-rendering","values":[]},{"name":"on-locale-change","description":"Respond to changing locale","values":[]},{"name":"autoupdate","description":"Gets the autoupdate attribute","values":[]},{"name":"apply-button-el","values":[]},{"name":"buttons","values":[]},{"name":"dropdown-container-el","values":[]},{"name":"embeddable","description":"embeddable attribute","values":[]},{"name":"hours","description":"hours attribute, default is 1","values":[]},{"name":"minutes","description":"minutes attribute, default is 0","values":[]},{"name":"minute-interval","description":"minute-interval attribute, default is 5","values":[]},{"name":"seconds","description":"seconds attribute, default is 0","values":[]},{"name":"second-interval","description":"second-interval attribute, default is 5","values":[]},{"name":"period","description":"period attribute, default is first day period in locale calendar","values":[]},{"name":"start-hour","description":"start-hour attribute, default is 0","values":[]},{"name":"end-hour","description":"end-hour attribute, default is 24","values":[]},{"name":"use-current-time","description":"use-current-time attribute","values":[]},{"name":"internal-value","description":"Stored timestring-value of the timepickers input-field","values":[]},{"name":"value","description":"Gets a timestring that matches the format specified by this.format()","values":[]}],"description":{"kind":"markdown","value":"# ids-time-picker\n\n## Description\n\nThe Timepicker Component provides a click/touch user interface for setting a time.\n\n## Use Cases\n\n- Entering an exact, unrestricted time (allowing any time to be entered, such as 11:39). In this use case, users should be allowed to either type the time values or select them.\n- Entering time intervals (e.g., allowing time entry only in specific set intervals, such as 15 or 30 minutes). In this case, you should either prevent users from manually entering the minute values or automatically correct manual entries to the nearest interval\n- Entering time values only within a specific range of time (such as only enter times within standard business hours). In this case, you should either prevent users from manually entering values or automatically correct manual entries to the nearest valid time\n\n## Terminology\n\n- **Timepicker**: A UI element for setting hours, minutes, seconds and periods (am/pm).\n- **Popup**: A window/modal that appears when the timepicker is clicked.\n- **Dropdowns**: Input elements for selecting hours, minutes, seconds and periods (am/pm).\n- **Period**: AM (before noon) and PM (after noon).\n- **Toggle**: Timepicker's popup will be opened if already closed, or closed if already opened.\n- **Disabled**: Timepicker can be disabled so it cannot be followed or clicked.\n- **Readonly**: Timepicker can be set to readonly so it cannot be edited.\n\n## Settings (Attributes)\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `autoopen` {boolean} Automatically opens the popup on focus.\n- `autoupdate` {boolean} Automatically updates the time string value and hides the \"Set Time\" button.\n- `colorVariant` {string} set the current color variant.\n- `compact` {boolean} sets the component to be compact mode.\n- `dirtyTracker` {boolean} sets the dirty tracking feature on to indicate a changed field. See [Ids Dirty Tracker Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-dirty-tracker-mixin/README.md) for more information.\n- `disabled` {boolean} Disables the timepicker. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `fieldHeight` {string} defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `format` {string} Sets the time format pattern (e.g., 'hh:mm:ss a' for 12-hour with seconds, 'HH:mm' for 24-hour)\n- `hidden` {boolean} Hides the element from display\n- `id` {string} Sets the unique identifier for the timepicker component\n- `readonly` {boolean} Makes the timepicker readonly. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `label` {string} Set the timepicker's label\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `placeholder` {string} Set the timepicker's placeholder\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `size` `{'sm' | 'md' | 'lg' | 'full' | string}` Sets the size of the input-field's width\n- `embeddable` {boolean} Set whether or not to show only hours/minutes/seconds dropdowns without input\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `minuteInterval` {number} Set minutes dropdown options interval. Default is 5\n- `secondInterval` {number} Set seconds dropdown options interval. Default is 5\n- `hours` {number} Set initial value for hours dropdown in the popup or retrieve the dropdown value\n- `minutes` {number} Set initial value for minutes dropdown in the popup or retrieve the dropdown value\n- `seconds` {number} Set initial value for seconds dropdown in the popup or retrieve the dropdown value\n- `period` {number} Set initial value for period dropdown in the popup or retrieve the dropdown value\n- `validate` {'required'|'time'|string} - Input validation rules\n- `validationEvents` {string} - Input validation events, `change blur` as default\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `startHour` {number} - Set the start of limit hours. Default is 0\n- `endHour` {number} - Set the end of limit hours. Default is 24\n- `useCurrentTime` {true|false} - Set whether or not to show current time in the dropdowns. When `true`, the dropdowns default to the current system time. When `false`, the dropdowns default to the first available option in each dropdown. If a value is selected by the user this value will stay even if the field is cleared.\n- `roundToInterval` {true|false} - Set whether or not to round minute/seconds to the time intervals\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `overflow` {string} Controls how text content is handled when it overflows the input field. Options are:\n  - `ellipsis`: Truncates overflowing text with an ellipsis (...) and shows full text in tooltip on hover\n- `tooltip` {string|Boolean} Controls tooltip behavior for the input field. Options are:\n  - `true`: Automatically shows tooltip when text overflows (works with `overflow=\"ellipsis\"`)\n  - Custom string: Shows the specified text as tooltip\n  - `false` or not set: No tooltip is displayed\n\n## Events\n\n- Event listeners for inputs such as `input`, `blur`, `change`, `focus`, `select`, `keydown`, `keypress`, `keyup`, `click`, `dbclick`, `beforetriggerclicked`, `triggerclicked` events can be used on the time picker component.\n\n```js\nconst timePicker = document.querySelector('ids-time-picker');\n\ntimePicker.input.addEventListener('change');\n```\n- Event listeners for popup `show`, `hide` events can be added to `popup` property:\n```js\nconst timePicker = document.querySelector('ids-time-picker');\n\ntimePicker.popup.addEventListener('show');\ntimePicker.popup.addEventListener('hide');\n```\n- Event `timeselected` Fires when clicking the set time button in the popup:\n```js\ntimePicker.addEventListener('timeselected', (e) => {\n  console.log('Selected Time:', e.detail.value);\n  console.log('TimePicker Element:', e.detail.elem);\n});\n```\n\n## Methods\n\n- `open()` Open the timepicker's popup window\n- `close()` Close the timepicker's popup window\n\n## Themeable Parts\n\n- `container` allowing to style the container of the component\n- `trigger-button` allowing to style the trigger button\n- `icon` allowing to style the icon in the trigger button\n- `input` allowing to style the input element\n- `popup` allowing to style the popup with dropdowns\n- `btn-set` allowing to style the set button in the popup\n- `hours` allowing to style the hours dropdown\n- `minutes` allowing to style the minutes dropdown\n- `seconds` allowing to style the seconds dropdown\n- `period` allowing to style the period dropdown\n\n## Features (With Code Examples)\n\nA normal timepicker used as a web component.\n\n```html\n<ids-time-picker\n  label=\"12-Hour Time Picker w/ seconds and period (am/pm)\"\n  placeholder=\"Enter your start time\"\n  format=\"hh:mm:ss a\"\n></ids-time-picker>\n```\n\nA `disabled` timepicker and a `readonly` timepicker.\n\n```html\n<ids-time-picker label=\"Disabled Time Picker\" value=\"10:30 AM\" disabled></ids-time-picker>\n\n<ids-time-picker label=\"Readonly Time Picker\" value=\"10:30 AM\" readonly></ids-time-picker>\n```\n\nAn `autoselect` timepicker and an `autoupdate` timepicker.\n\n```html\n<ids-time-picker label=\"Autoselect Time Picker\" value=\"10:30 AM\" autoselect></ids-time-picker>\n\n<ids-time-picker label=\"Autoupdate Time Picker\" value=\"10:30 AM\" autoupdate></ids-time-picker>\n```\n\nIt's also possible to configure the timepicker with a custom time format. This allows the timepicker to be configured in 24-hour/Military time and/or with a seconds picker for more accurate time.\n\n```html\n<ids-time-picker\n  label=\"12-Hour Time Picker (w/ seconds)\"\n  format=\"hh:mm:ss\"\n></ids-time-picker>\n\n<ids-time-picker\n  label=\"24-Hour Time Picker\"\n  format=\"HH:mm\"\n></ids-time-picker>\n```\n\nIt's also possible to control the intervals of minutes and seconds available for picking.\n\n```html\n<ids-time-picker\n  label=\"5-minute intervals\"\n  format=\"hh:mm\"\n  minute-interval=\"5\"\n></ids-time-picker>\n\n<ids-time-picker\n  label=\"10-second intervals\"\n  format=\"hh:mm:ss\"\n  second-interval=\"10\"\n></ids-time-picker>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-time-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-time-picker>\n<ids-time-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-time-picker>\n```\n\nControl text overflow and tooltip behavior for input values:\n\n```html\n<!-- Show ellipsis for overflowing text with automatic tooltip -->\n<ids-time-picker\n  label=\"Time picker with overflow tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  size=\"xs\"\n></ids-time-picker>\n\n<!-- Custom tooltip text -->\n<ids-time-picker\n  label=\"Time picker with custom tooltip\"\n  tooltip=\"Enter your preferred time\"\n  value=\"10:15 AM\"\n></ids-time-picker>\n```\n\n## Class Hierarchy\n\n- IdsTimePicker\n  - IdsElement\n- Mixins\n  - IdsEventsMixin\n  - IdsKeyboardMixin\n  - IdsPopupOpenEventsMixin\n  - IdsLocaleMixin\n\n## Keyboard Guidelines\n\n- <kbd>Enter</kbd>: Opens the popup window, if the timepicker is not disabled or read-only.\n- <kbd>ArrowDown</kbd>: Opens the popup window, if the timepicker is not disabled or read-only.\n- <kbd>Escape</kbd> or <kbd>Backspace</kbd>: Closes the popup window, if the timepicker is not disabled or read-only.\n- <kbd>Tab</kbd>: Moves focus to the next focusable element.\n- Within the popup, use arrow keys to navigate between time options.\n\n## Responsive Guidelines (TODO)\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Timepicker was implemented in v4.0.0\n- Timepicker can be invoked with `$('#my-element').timepicker()`.\n\n**4.x to 5.x**\n- Listeners for input and popup events should be added to references `input` and `popup` now. See Events section.\n- `disable/readonly/tabbable` are now attributes not methods\n- Timepicker are now custom element `<ids-time-picker></ids-time-picker>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs WC](https://www.figma.com/file/ri2Knf3KchdfdzRAeds0Ab/IDS-Mobility-v4.6?node-id=1%3A5740)\n\n## Accessibility Guidelines\n\n- The Time Picker needs to support both manual time entry (hours, minutes, and, on rare occasions, seconds) as well as some method of selecting from valid entries. Depending on the use case, users may be able to manually enter a time or only select from a restricted set of values.\n- The Time Picker implements the ARIA combo box pattern with proper role and state attributes\n- Screen readers announce the component as a combo box with popup functionality\n- ARIA attributes include:\n  - `role=\"combobox\"` on the input field\n  - `aria-haspopup=\"dialog\"` to indicate popup type\n  - `aria-expanded` to communicate popup state (true/false)\n  - `aria-controls` linking input to popup element\n  - `aria-describedby` for format instructions\n  - `aria-invalid` for validation state indication\n  - `aria-disabled`/`aria-readonly` for state indication\n- Live region announcements provide feedback for:\n  - Time selection confirmation\n  - Popup open/close states\n  - Validation errors\n  - Automatic interval rounding adjustments\n- The trigger button has a clear `aria-label` for its purpose\n- Supports both manual time entry and selection from valid entries\n- All interactive elements are keyboard accessible\n- Focus management ensures proper navigation flow\n\n## Regional Considerations (TODO)\n\nLabels should be localized in the current language. The close and link icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-time-picker","attributes":[{"name":"is-form-component","values":[]},{"name":"color-variants","description":"List of available color variants for this component","values":[]},{"name":"on-locale-change","description":"Respond to changing locale","values":[]},{"name":"on-language-change","description":"Respond to changing language","values":[]},{"name":"is-updating-from-input","values":[]},{"name":"auto-select-blocked","values":[]},{"name":"reset-timeout-id","values":[]},{"name":"before-validate","description":"The beforeValidate callback","values":[]},{"name":"popup","values":[]},{"name":"input","values":[]},{"name":"format","description":"Gets the time format to use in the picker. Defaults to the current locale's time format or english (\"hh:mm a\")","values":[]},{"name":"value","description":"Gets a timestring that matches the format specified by this.format()","values":[]},{"name":"autoopen","description":"Gets the autoopen attribute","values":[]},{"name":"autoupdate","description":"Gets the autoupdate attribute","values":[]},{"name":"disabled","description":"Gets the disabled attribute","values":[]},{"name":"readonly","description":"Gets the readonly attribute","values":[]},{"name":"placeholder","description":"Get the placeholder attribute","values":[]},{"name":"margin-block-end","description":"Gets the margin-block-end token key","values":[]},{"name":"no-margins","description":"no-margins attribute","values":[]},{"name":"size","description":"Get the size attribute","values":[]},{"name":"minute-interval","description":"minute-interval attribute, default is 5","values":[]},{"name":"second-interval","description":"second-interval attribute, default is 5","values":[]},{"name":"embeddable","description":"embeddable attribute","values":[]},{"name":"round-to-interval","description":"Gets the current state of interval rounding","values":[]},{"name":"hours","description":"hours attribute, default is 1","values":[]},{"name":"hours24","description":"Gets hours in 24 hour format","values":[]},{"name":"minutes","description":"minutes attribute, default is 0","values":[]},{"name":"seconds","description":"seconds attribute, default is 0","values":[]},{"name":"period","description":"period attribute, default is first day period in locale calendar","values":[]},{"name":"validate","description":"validate attribute","values":[]},{"name":"validation-events","description":"validation-events attributes","values":[]},{"name":"tabbable","description":"Get the trigger field tabbable attribute","values":[]},{"name":"start-hour","description":"start-hour attribute, default is 0","values":[]},{"name":"end-hour","description":"end-hour attribute, default is 24","values":[]},{"name":"use-current-time","description":"use-current-time attribute","values":[]},{"name":"mask","description":"Get the current mask attribute","values":[]},{"name":"overflow","description":"Get the overflow attribute","values":[]},{"name":"tooltip","description":"Get the tooltip attribute","values":[]},{"name":"trigger-button","description":"Gets the trigger button element within the time picker","values":[]},{"name":"picker","description":"Gets the time picker popup element","values":[]}],"description":{"kind":"markdown","value":"# ids-time-picker\n\n## Description\n\nThe Timepicker Component provides a click/touch user interface for setting a time.\n\n## Use Cases\n\n- Entering an exact, unrestricted time (allowing any time to be entered, such as 11:39). In this use case, users should be allowed to either type the time values or select them.\n- Entering time intervals (e.g., allowing time entry only in specific set intervals, such as 15 or 30 minutes). In this case, you should either prevent users from manually entering the minute values or automatically correct manual entries to the nearest interval\n- Entering time values only within a specific range of time (such as only enter times within standard business hours). In this case, you should either prevent users from manually entering values or automatically correct manual entries to the nearest valid time\n\n## Terminology\n\n- **Timepicker**: A UI element for setting hours, minutes, seconds and periods (am/pm).\n- **Popup**: A window/modal that appears when the timepicker is clicked.\n- **Dropdowns**: Input elements for selecting hours, minutes, seconds and periods (am/pm).\n- **Period**: AM (before noon) and PM (after noon).\n- **Toggle**: Timepicker's popup will be opened if already closed, or closed if already opened.\n- **Disabled**: Timepicker can be disabled so it cannot be followed or clicked.\n- **Readonly**: Timepicker can be set to readonly so it cannot be edited.\n\n## Settings (Attributes)\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `autoopen` {boolean} Automatically opens the popup on focus.\n- `autoupdate` {boolean} Automatically updates the time string value and hides the \"Set Time\" button.\n- `colorVariant` {string} set the current color variant.\n- `compact` {boolean} sets the component to be compact mode.\n- `dirtyTracker` {boolean} sets the dirty tracking feature on to indicate a changed field. See [Ids Dirty Tracker Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-dirty-tracker-mixin/README.md) for more information.\n- `disabled` {boolean} Disables the timepicker. Mutually exclusive with `readonly` — setting `disabled` removes `readonly`, and vice versa.\n- `fieldHeight` {string} defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `format` {string} Sets the time format pattern (e.g., 'hh:mm:ss a' for 12-hour with seconds, 'HH:mm' for 24-hour)\n- `hidden` {boolean} Hides the element from display\n- `id` {string} Sets the unique identifier for the timepicker component\n- `readonly` {boolean} Makes the timepicker readonly. Mutually exclusive with `disabled` — setting `readonly` removes `disabled`, and vice versa.\n- `label` {string} Set the timepicker's label\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still be specified). See [Ids Label State Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-label-state-mixin/README.md) for more information.\n- `labelWrap` {string} Controls how label text is displayed when it's too long for its container. Options are:\n  - `wrap` (default): Label text wraps to multiple lines\n  - `ellipsis`: Label text is truncated with ellipsis and shows full text in tooltip on hover\n  - `wrap-no-stretch`: Label text wraps to multiple lines but doesn't stretch the container width\n  - `ellipsis-no-stretch`: Label text is truncated with ellipsis but doesn't stretch the container width\n- `placeholder` {string} Set the timepicker's placeholder\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `size` `{'sm' | 'md' | 'lg' | 'full' | string}` Sets the size of the input-field's width\n- `embeddable` {boolean} Set whether or not to show only hours/minutes/seconds dropdowns without input\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `minuteInterval` {number} Set minutes dropdown options interval. Default is 5\n- `secondInterval` {number} Set seconds dropdown options interval. Default is 5\n- `hours` {number} Set initial value for hours dropdown in the popup or retrieve the dropdown value\n- `minutes` {number} Set initial value for minutes dropdown in the popup or retrieve the dropdown value\n- `seconds` {number} Set initial value for seconds dropdown in the popup or retrieve the dropdown value\n- `period` {number} Set initial value for period dropdown in the popup or retrieve the dropdown value\n- `validate` {'required'|'time'|string} - Input validation rules\n- `validationEvents` {string} - Input validation events, `change blur` as default\n- `suppress-validation` {boolean} When set to `true`, clearing a field's value programmatically (e.g. `elem.value = ''`) does not trigger required validation errors. Default is `false`.\n- `startHour` {number} - Set the start of limit hours. Default is 0\n- `endHour` {number} - Set the end of limit hours. Default is 24\n- `useCurrentTime` {true|false} - Set whether or not to show current time in the dropdowns. When `true`, the dropdowns default to the current system time. When `false`, the dropdowns default to the first available option in each dropdown. If a value is selected by the user this value will stay even if the field is cleared.\n- `roundToInterval` {true|false} - Set whether or not to round minute/seconds to the time intervals\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n- `overflow` {string} Controls how text content is handled when it overflows the input field. Options are:\n  - `ellipsis`: Truncates overflowing text with an ellipsis (...) and shows full text in tooltip on hover\n- `tooltip` {string|Boolean} Controls tooltip behavior for the input field. Options are:\n  - `true`: Automatically shows tooltip when text overflows (works with `overflow=\"ellipsis\"`)\n  - Custom string: Shows the specified text as tooltip\n  - `false` or not set: No tooltip is displayed\n\n## Events\n\n- Event listeners for inputs such as `input`, `blur`, `change`, `focus`, `select`, `keydown`, `keypress`, `keyup`, `click`, `dbclick`, `beforetriggerclicked`, `triggerclicked` events can be used on the time picker component.\n\n```js\nconst timePicker = document.querySelector('ids-time-picker');\n\ntimePicker.input.addEventListener('change');\n```\n- Event listeners for popup `show`, `hide` events can be added to `popup` property:\n```js\nconst timePicker = document.querySelector('ids-time-picker');\n\ntimePicker.popup.addEventListener('show');\ntimePicker.popup.addEventListener('hide');\n```\n- Event `timeselected` Fires when clicking the set time button in the popup:\n```js\ntimePicker.addEventListener('timeselected', (e) => {\n  console.log('Selected Time:', e.detail.value);\n  console.log('TimePicker Element:', e.detail.elem);\n});\n```\n\n## Methods\n\n- `open()` Open the timepicker's popup window\n- `close()` Close the timepicker's popup window\n\n## Themeable Parts\n\n- `container` allowing to style the container of the component\n- `trigger-button` allowing to style the trigger button\n- `icon` allowing to style the icon in the trigger button\n- `input` allowing to style the input element\n- `popup` allowing to style the popup with dropdowns\n- `btn-set` allowing to style the set button in the popup\n- `hours` allowing to style the hours dropdown\n- `minutes` allowing to style the minutes dropdown\n- `seconds` allowing to style the seconds dropdown\n- `period` allowing to style the period dropdown\n\n## Features (With Code Examples)\n\nA normal timepicker used as a web component.\n\n```html\n<ids-time-picker\n  label=\"12-Hour Time Picker w/ seconds and period (am/pm)\"\n  placeholder=\"Enter your start time\"\n  format=\"hh:mm:ss a\"\n></ids-time-picker>\n```\n\nA `disabled` timepicker and a `readonly` timepicker.\n\n```html\n<ids-time-picker label=\"Disabled Time Picker\" value=\"10:30 AM\" disabled></ids-time-picker>\n\n<ids-time-picker label=\"Readonly Time Picker\" value=\"10:30 AM\" readonly></ids-time-picker>\n```\n\nAn `autoselect` timepicker and an `autoupdate` timepicker.\n\n```html\n<ids-time-picker label=\"Autoselect Time Picker\" value=\"10:30 AM\" autoselect></ids-time-picker>\n\n<ids-time-picker label=\"Autoupdate Time Picker\" value=\"10:30 AM\" autoupdate></ids-time-picker>\n```\n\nIt's also possible to configure the timepicker with a custom time format. This allows the timepicker to be configured in 24-hour/Military time and/or with a seconds picker for more accurate time.\n\n```html\n<ids-time-picker\n  label=\"12-Hour Time Picker (w/ seconds)\"\n  format=\"hh:mm:ss\"\n></ids-time-picker>\n\n<ids-time-picker\n  label=\"24-Hour Time Picker\"\n  format=\"HH:mm\"\n></ids-time-picker>\n```\n\nIt's also possible to control the intervals of minutes and seconds available for picking.\n\n```html\n<ids-time-picker\n  label=\"5-minute intervals\"\n  format=\"hh:mm\"\n  minute-interval=\"5\"\n></ids-time-picker>\n\n<ids-time-picker\n  label=\"10-second intervals\"\n  format=\"hh:mm:ss\"\n  second-interval=\"10\"\n></ids-time-picker>\n```\n\nControl how long labels are displayed with the label-wrap attribute:\n\n```html\n<ids-time-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"ellipsis\"></ids-time-picker>\n<ids-time-picker label=\"This is a very long label that demonstrates label wrapping behavior\" label-wrap=\"wrap\"></ids-time-picker>\n```\n\nControl text overflow and tooltip behavior for input values:\n\n```html\n<!-- Show ellipsis for overflowing text with automatic tooltip -->\n<ids-time-picker\n  label=\"Time picker with overflow tooltip\"\n  overflow=\"ellipsis\"\n  tooltip=\"true\"\n  size=\"xs\"\n></ids-time-picker>\n\n<!-- Custom tooltip text -->\n<ids-time-picker\n  label=\"Time picker with custom tooltip\"\n  tooltip=\"Enter your preferred time\"\n  value=\"10:15 AM\"\n></ids-time-picker>\n```\n\n## Class Hierarchy\n\n- IdsTimePicker\n  - IdsElement\n- Mixins\n  - IdsEventsMixin\n  - IdsKeyboardMixin\n  - IdsPopupOpenEventsMixin\n  - IdsLocaleMixin\n\n## Keyboard Guidelines\n\n- <kbd>Enter</kbd>: Opens the popup window, if the timepicker is not disabled or read-only.\n- <kbd>ArrowDown</kbd>: Opens the popup window, if the timepicker is not disabled or read-only.\n- <kbd>Escape</kbd> or <kbd>Backspace</kbd>: Closes the popup window, if the timepicker is not disabled or read-only.\n- <kbd>Tab</kbd>: Moves focus to the next focusable element.\n- Within the popup, use arrow keys to navigate between time options.\n\n## Responsive Guidelines (TODO)\n\n- Flows with padding and margin within the width and height of the parent container. Possibly scrolling as needed based on parent dimensions.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Timepicker was implemented in v4.0.0\n- Timepicker can be invoked with `$('#my-element').timepicker()`.\n\n**4.x to 5.x**\n- Listeners for input and popup events should be added to references `input` and `popup` now. See Events section.\n- `disable/readonly/tabbable` are now attributes not methods\n- Timepicker are now custom element `<ids-time-picker></ids-time-picker>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs WC](https://www.figma.com/file/ri2Knf3KchdfdzRAeds0Ab/IDS-Mobility-v4.6?node-id=1%3A5740)\n\n## Accessibility Guidelines\n\n- The Time Picker needs to support both manual time entry (hours, minutes, and, on rare occasions, seconds) as well as some method of selecting from valid entries. Depending on the use case, users may be able to manually enter a time or only select from a restricted set of values.\n- The Time Picker implements the ARIA combo box pattern with proper role and state attributes\n- Screen readers announce the component as a combo box with popup functionality\n- ARIA attributes include:\n  - `role=\"combobox\"` on the input field\n  - `aria-haspopup=\"dialog\"` to indicate popup type\n  - `aria-expanded` to communicate popup state (true/false)\n  - `aria-controls` linking input to popup element\n  - `aria-describedby` for format instructions\n  - `aria-invalid` for validation state indication\n  - `aria-disabled`/`aria-readonly` for state indication\n- Live region announcements provide feedback for:\n  - Time selection confirmation\n  - Popup open/close states\n  - Validation errors\n  - Automatic interval rounding adjustments\n- The trigger button has a clear `aria-label` for its purpose\n- Supports both manual time entry and selection from valid entries\n- All interactive elements are keyboard accessible\n- Focus management ensures proper navigation flow\n\n## Regional Considerations (TODO)\n\nLabels should be localized in the current language. The close and link icons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-toast-message","attributes":[{"name":"progress-bar-el","values":[]},{"name":"audible","description":"Set as invisible on the screen, but still read out lout by screen readers.","values":[]},{"name":"progress-bar","description":"Set toast to have a visible progress bar.","values":[]},{"name":"timeout","description":"Set the amount of time, the toast should be present on-screen.","values":[]},{"name":"message-id","description":"Set toast-id to manage each toast.","values":[]}],"description":{"kind":"markdown","value":"# ids-toast\n\n## Description\n\nToasts are used to display confirmations of success, failure, or other statuses of system processes related to a user’s workflow. If a user submits a form, a toast will confirm the successful or unsuccessful completion of that submission. Toasts are dismissible via the “close” icon or the escape key. If not dismissed, the toast will hide after a configurable amount of time. The Toast will close itself after a timeout (default 6s) or if the close button is clicked. It is also possible to have more than one toast onscreen at a time.\n\n## Use Cases\n\n- Toast component use to give feedback to users after an action has taken place.\n- Use a toast component to display notifications and other non-critical messages.\n\n## Terminology\n\n**Title:** An html text element that display as toast message title.\n**Message:** An html text element that display as toast message body.\n**Close Button:** A trigger button to close the toast message.\n**Progress Bar:** An html element that display as progress bar.\n\n## Features (With Code Examples)\n\nA normal toast used as a web component.\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Toast Message</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSet position of the toast container in specific place\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    // 'bottom-end', 'bottom-start', 'top-end', 'top-start' (default: 'top-end')\n    toast.position = 'bottom-start';\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSet user to allows drag/drop the toast container\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Draggable</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.draggable = true;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSave toast container position to local storage, apply only when draggable set to true\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Save position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  // uniqueId: Use when need to clear saved position from storage\n  // if not will use internal auto generated\n  const uniqueId = 'some-uniqueid';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.draggable = true;\n    toast.uniqueId = uniqueId;\n    toast.savePosition = true;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nClear the saved position from local storage\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Clear saved position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  // uniqueId: used with toast while saved position toast\n  const uniqueId = 'some-uniqueid';\n  const toast = document.createElement('ids-toast');\n  toast.clearPosition(uniqueId);\n});\n```\n\nClear all toast related saved position from local storage\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Clear (all) saved positions</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toast = document.createElement('ids-toast');\n  toast.clearPositionAll();\n});\n```\n\nSet to not destroy after complete all the toast messages\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>No destroy after complete</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.destroyOnComplete = false;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nIt is possible to put links in the toast message by adding it to the message. We only suggest to use one link per toast message. Because of the timeout natural of the toast this variation has questionable usability. But if required you could use it and increase the timeout to a higher value. Consider if a message or some other fixed time mechanism is better.\n\n### Using the hyperlink option (Recommended)\n\nThe preferred way to add a hyperlink is using the `hyperlink` configuration object:\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Update Available',\n    message: 'A new version is ready to install.',\n    hyperlink: {\n      text: 'View details',\n      href: 'https://example.com/updates',\n      target: '_blank'\n    }\n  });\n});\n```\n\nYou can also use a callback function instead of navigation:\n\n```javascript\ntoast.show({\n  title: 'Action Required',\n  message: 'Please review the changes.',\n  hyperlink: {\n    text: 'Review now',\n    onClick: (e) => {\n      console.log('Link clicked', e);\n      // Custom action here\n    }\n  }\n});\n```\n\n### Closing toasts on hyperlink click\n\nYou can automatically close toasts when a hyperlink is clicked using the `closeOnClick` or `closeAllOnClick` options:\n\n```javascript\n// Close only this toast when link is clicked\ntoast.show({\n  title: 'Close on click',\n  message: 'Clicking the link will close this toast only.',\n  hyperlink: {\n    text: 'Close this toast',\n    closeOnClick: true\n  }\n});\n\n// Close all toasts when link is clicked\ntoast.show({\n  title: 'Close all on click',\n  message: 'Clicking the link will close all toasts.',\n  hyperlink: {\n    text: 'Close all toasts',\n    closeAllOnClick: true\n  }\n});\n```\n\nYou can also programmatically close toasts using the callback:\n\n```javascript\ntoast.show({\n  title: 'Callback close',\n  message: 'Uses callback to programmatically close this toast.',\n  hyperlink: {\n    text: 'Close via callback',\n    onClick: (e) => {\n      // Close this specific toast\n      e.detail.elem.close(e.detail.messageId);\n    }\n  }\n});\n\ntoast.show({\n  title: 'Callback close all',\n  message: 'Uses callback to programmatically close all toasts.',\n  hyperlink: {\n    text: 'Close all via callback',\n    onClick: (e) => {\n      // Close all toasts\n      e.detail.elem.closeAll();\n    }\n  }\n});\n```\n\n### Using allowLink\n\nAlternatively, you can embed HTML in the message and use `allowLink`:\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'Link in message: <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\">Google</ids-hyperlink>',\n    allowLink: true\n  });\n});\n```\n\nSet the amount of time (2 seconds), the toast should be present on-screen\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Timeout (2 seconds)</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    timeout: 2000\n  });\n});\n```\n\nCustom text that use for close button label in the toast message\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Close button custom label text</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    closeButtonLabel: 'Click here to close'\n  });\n});\n```\n\nHide the progress bar in toast message\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Progress bar (hidden)</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    progressBar: false\n  });\n});\n```\n\nAdd an icon to the toast message\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Success',\n    message: 'Operation completed successfully.',\n    icon: {\n      icon: 'success',\n      size: 'medium',\n      statusColor: 'success'\n    }\n  });\n});\n```\n\nLet toast message to be invisible on the screen\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Audible only</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    audible: true\n  });\n});\n```\n\nToast message by markup\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Toast message by markup</span>\n</ids-button>\n<ids-toast id=\"toast-markup\" destroy-on-complete=\"false\">\n  <span slot=\"title\">Application Offline</span>\n  <span slot=\"message\">This is a Toast message.</span>\n</ids-toast>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\nconst toast = document.querySelector('#demo-toast');\n\nbtnToast?.addEventListener('click', () => {\n  toast.show();\n});\n```\n\n## Using IdsToastService\n\nFor a simpler API, you can use the IdsToastService which handles toast creation and management automatically:\n\n```javascript\nimport { IdsToastService } from 'ids-enterprise-wc';\n\n// Show a basic toast\nIdsToastService.show({\n  title: 'Success',\n  message: 'Operation completed successfully'\n});\n\n// Show toast with custom timeout\nIdsToastService.show({\n  title: 'Warning',\n  message: 'Please review your changes',\n  timeout: 8000\n});\n\n// Show toast with custom position\nIdsToastService.show({\n  title: 'Info',\n  message: 'New notification received',\n  position: 'bottom-start'\n});\n```\n\n## Settings and Attributes (Toast)\n\n- `allowLink` {boolean} Set to put links in the toast message\n- `audible` {boolean} Set as invisible on the screen, but still read out loud by screen readers\n- `destroyOnComplete` {boolean} Set to destroy after complete all the toast messages\n- `draggable` {boolean} Set user to allows drag/drop the toast container\n- `position` {string} Set position of the toast container in specific place\n- `progressBar` {boolean} Set toast to have a visible progress bar\n- `savePosition` {boolean} Set toast container to save position to local storage, apply only when draggable set to true\n- `timeout` {number} Set the amount of time, the toast should be present on-screen\n- `uniqueId` {number} Set uniqueId to save to local storage, so same saved position can be use for whole app, apply only when draggable set to true\n\n## Settings and Attributes (Toast Message)\n\n- `audible` {boolean} Set as invisible on the screen, but still read out loud by screen readers\n- `icon` {object} Configure an icon to display in the toast message with properties:\n  - `icon` {string} The icon name to display\n  - `size` {string} The icon size ('xsmall',  'small',  'medium',  'large',  'xl',  'xxl')\n  - `statusColor` {string} The icon color ('error', 'warning', 'caution', 'info', 'success',  'neutral',  'red',  'yellow',  'green',  'blue',  'teal',  'purple',  'white',  'black')\n- `hyperlink` {object} Configure a hyperlink to display in the toast message with properties:\n  - `text` {string} The link text to display (required)\n  - `href` {string} The URL to navigate to (optional)\n  - `target` {string} The link target ('_blank', '_self', '_parent', '_top') (optional)\n  - `onClick` {function} Callback function when link is clicked (optional, takes precedence over href)\n  - `closeOnClick` {boolean} If true, closes this toast when the hyperlink is clicked (optional)\n  - `closeAllOnClick` {boolean} If true, closes all toasts when the hyperlink is clicked (optional)\n- `progressBar` {boolean} Set toast to have a visible progress bar\n- `timeout` {number} Set the amount of time, the toast should be present on-screen\n- `messageId` {string} Set id to manage each toast message\n\n## Theme-able Parts (Toast Message)\n\n- `toast` allows you to further style the toast element\n- `title` allows you to further style the toast title element\n- `message` allows you to further style the toast message element\n- `progress-bar` allows you to further style the toast progress bar element\n- `close-button` allows you to further style the toast close button element\n- `close-button-icon` allows you to further style the toast close button icon element\n\n## Events (Toast)\n\n- `add-message` Fires while the toast message is added to container\n- `remove-message` Fires while the toast message is removed from container\n- `save-position` Fires after the local storage settings changed in some way\n- `clear-position` Fires after clear the saved position from local storage\n- `remove-container` Fires after removed the toast message container\n- `link-clicked` Fires when an A-tag or IDS-HYPERLINK in the message body is clicked\n\n## Events (Toast Message)\n\n- `remove-message` Fires while the toast message is removed from container\n\n## Methods (Toast)\n\n- `clearPosition(uniqueId: string|undefined)` Clear the saved position from local storage, If uniqueId is undefined will use Internal attached\n- `clearPositionAll()` Clear all toast related saved position from local storage\n- `close(toastMessageId: string)` Close a specific toast message by its message ID\n- `closeAll()` Close all toast messages currently displayed\n- `messageElem(messageId: string)` Get message element by given message id\n- `show(options: IdsToastShowSettings)` Set to show the toast message\n- `toastContainer()` Get the toast container\n\n## Methods (Toast Message)\n\n- `removeToastMessage()` Remove the toast message from container\n\n## States and Variations (With Code Examples)\n\n- Audible\n- Auto Closeable\n- Closeable\n- Contains Link\n- Draggable\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the tab is focusable this will focus or unfocus the toast.\n- <kbd>Control+Alt+P</kbd>: It will toggle pause and play timeout timer.\n- <kbd>Escape</kbd>: It will close the toast message.\n\n## Responsive Guidelines\n\n- Toasts can be configured to appear at either the top-start, top-end, bottom-start or bottom-end of an application window.\n- Will be placed in the top-end corner by default.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Toasts were implemented in v4.0.0\n- Toasts can be invoked with `$('#my-element').toast()`.\n\n**4.x to 5.x**\n\n- Toasts are now custom elements `<ids-toast></ids-toast>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\n## Regional Considerations\n\nLabels should be localized in the current language. The close icon and progress bar will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-toast-service","attributes":[],"description":{"kind":"markdown","value":"# ids-toast\n\n## Description\n\nToasts are used to display confirmations of success, failure, or other statuses of system processes related to a user’s workflow. If a user submits a form, a toast will confirm the successful or unsuccessful completion of that submission. Toasts are dismissible via the “close” icon or the escape key. If not dismissed, the toast will hide after a configurable amount of time. The Toast will close itself after a timeout (default 6s) or if the close button is clicked. It is also possible to have more than one toast onscreen at a time.\n\n## Use Cases\n\n- Toast component use to give feedback to users after an action has taken place.\n- Use a toast component to display notifications and other non-critical messages.\n\n## Terminology\n\n**Title:** An html text element that display as toast message title.\n**Message:** An html text element that display as toast message body.\n**Close Button:** A trigger button to close the toast message.\n**Progress Bar:** An html element that display as progress bar.\n\n## Features (With Code Examples)\n\nA normal toast used as a web component.\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Toast Message</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSet position of the toast container in specific place\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    // 'bottom-end', 'bottom-start', 'top-end', 'top-start' (default: 'top-end')\n    toast.position = 'bottom-start';\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSet user to allows drag/drop the toast container\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Draggable</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.draggable = true;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSave toast container position to local storage, apply only when draggable set to true\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Save position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  // uniqueId: Use when need to clear saved position from storage\n  // if not will use internal auto generated\n  const uniqueId = 'some-uniqueid';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.draggable = true;\n    toast.uniqueId = uniqueId;\n    toast.savePosition = true;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nClear the saved position from local storage\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Clear saved position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  // uniqueId: used with toast while saved position toast\n  const uniqueId = 'some-uniqueid';\n  const toast = document.createElement('ids-toast');\n  toast.clearPosition(uniqueId);\n});\n```\n\nClear all toast related saved position from local storage\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Clear (all) saved positions</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toast = document.createElement('ids-toast');\n  toast.clearPositionAll();\n});\n```\n\nSet to not destroy after complete all the toast messages\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>No destroy after complete</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.destroyOnComplete = false;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nIt is possible to put links in the toast message by adding it to the message. We only suggest to use one link per toast message. Because of the timeout natural of the toast this variation has questionable usability. But if required you could use it and increase the timeout to a higher value. Consider if a message or some other fixed time mechanism is better.\n\n### Using the hyperlink option (Recommended)\n\nThe preferred way to add a hyperlink is using the `hyperlink` configuration object:\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Update Available',\n    message: 'A new version is ready to install.',\n    hyperlink: {\n      text: 'View details',\n      href: 'https://example.com/updates',\n      target: '_blank'\n    }\n  });\n});\n```\n\nYou can also use a callback function instead of navigation:\n\n```javascript\ntoast.show({\n  title: 'Action Required',\n  message: 'Please review the changes.',\n  hyperlink: {\n    text: 'Review now',\n    onClick: (e) => {\n      console.log('Link clicked', e);\n      // Custom action here\n    }\n  }\n});\n```\n\n### Closing toasts on hyperlink click\n\nYou can automatically close toasts when a hyperlink is clicked using the `closeOnClick` or `closeAllOnClick` options:\n\n```javascript\n// Close only this toast when link is clicked\ntoast.show({\n  title: 'Close on click',\n  message: 'Clicking the link will close this toast only.',\n  hyperlink: {\n    text: 'Close this toast',\n    closeOnClick: true\n  }\n});\n\n// Close all toasts when link is clicked\ntoast.show({\n  title: 'Close all on click',\n  message: 'Clicking the link will close all toasts.',\n  hyperlink: {\n    text: 'Close all toasts',\n    closeAllOnClick: true\n  }\n});\n```\n\nYou can also programmatically close toasts using the callback:\n\n```javascript\ntoast.show({\n  title: 'Callback close',\n  message: 'Uses callback to programmatically close this toast.',\n  hyperlink: {\n    text: 'Close via callback',\n    onClick: (e) => {\n      // Close this specific toast\n      e.detail.elem.close(e.detail.messageId);\n    }\n  }\n});\n\ntoast.show({\n  title: 'Callback close all',\n  message: 'Uses callback to programmatically close all toasts.',\n  hyperlink: {\n    text: 'Close all via callback',\n    onClick: (e) => {\n      // Close all toasts\n      e.detail.elem.closeAll();\n    }\n  }\n});\n```\n\n### Using allowLink\n\nAlternatively, you can embed HTML in the message and use `allowLink`:\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'Link in message: <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\">Google</ids-hyperlink>',\n    allowLink: true\n  });\n});\n```\n\nSet the amount of time (2 seconds), the toast should be present on-screen\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Timeout (2 seconds)</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    timeout: 2000\n  });\n});\n```\n\nCustom text that use for close button label in the toast message\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Close button custom label text</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    closeButtonLabel: 'Click here to close'\n  });\n});\n```\n\nHide the progress bar in toast message\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Progress bar (hidden)</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    progressBar: false\n  });\n});\n```\n\nAdd an icon to the toast message\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Success',\n    message: 'Operation completed successfully.',\n    icon: {\n      icon: 'success',\n      size: 'medium',\n      statusColor: 'success'\n    }\n  });\n});\n```\n\nLet toast message to be invisible on the screen\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Audible only</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    audible: true\n  });\n});\n```\n\nToast message by markup\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Toast message by markup</span>\n</ids-button>\n<ids-toast id=\"toast-markup\" destroy-on-complete=\"false\">\n  <span slot=\"title\">Application Offline</span>\n  <span slot=\"message\">This is a Toast message.</span>\n</ids-toast>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\nconst toast = document.querySelector('#demo-toast');\n\nbtnToast?.addEventListener('click', () => {\n  toast.show();\n});\n```\n\n## Using IdsToastService\n\nFor a simpler API, you can use the IdsToastService which handles toast creation and management automatically:\n\n```javascript\nimport { IdsToastService } from 'ids-enterprise-wc';\n\n// Show a basic toast\nIdsToastService.show({\n  title: 'Success',\n  message: 'Operation completed successfully'\n});\n\n// Show toast with custom timeout\nIdsToastService.show({\n  title: 'Warning',\n  message: 'Please review your changes',\n  timeout: 8000\n});\n\n// Show toast with custom position\nIdsToastService.show({\n  title: 'Info',\n  message: 'New notification received',\n  position: 'bottom-start'\n});\n```\n\n## Settings and Attributes (Toast)\n\n- `allowLink` {boolean} Set to put links in the toast message\n- `audible` {boolean} Set as invisible on the screen, but still read out loud by screen readers\n- `destroyOnComplete` {boolean} Set to destroy after complete all the toast messages\n- `draggable` {boolean} Set user to allows drag/drop the toast container\n- `position` {string} Set position of the toast container in specific place\n- `progressBar` {boolean} Set toast to have a visible progress bar\n- `savePosition` {boolean} Set toast container to save position to local storage, apply only when draggable set to true\n- `timeout` {number} Set the amount of time, the toast should be present on-screen\n- `uniqueId` {number} Set uniqueId to save to local storage, so same saved position can be use for whole app, apply only when draggable set to true\n\n## Settings and Attributes (Toast Message)\n\n- `audible` {boolean} Set as invisible on the screen, but still read out loud by screen readers\n- `icon` {object} Configure an icon to display in the toast message with properties:\n  - `icon` {string} The icon name to display\n  - `size` {string} The icon size ('xsmall',  'small',  'medium',  'large',  'xl',  'xxl')\n  - `statusColor` {string} The icon color ('error', 'warning', 'caution', 'info', 'success',  'neutral',  'red',  'yellow',  'green',  'blue',  'teal',  'purple',  'white',  'black')\n- `hyperlink` {object} Configure a hyperlink to display in the toast message with properties:\n  - `text` {string} The link text to display (required)\n  - `href` {string} The URL to navigate to (optional)\n  - `target` {string} The link target ('_blank', '_self', '_parent', '_top') (optional)\n  - `onClick` {function} Callback function when link is clicked (optional, takes precedence over href)\n  - `closeOnClick` {boolean} If true, closes this toast when the hyperlink is clicked (optional)\n  - `closeAllOnClick` {boolean} If true, closes all toasts when the hyperlink is clicked (optional)\n- `progressBar` {boolean} Set toast to have a visible progress bar\n- `timeout` {number} Set the amount of time, the toast should be present on-screen\n- `messageId` {string} Set id to manage each toast message\n\n## Theme-able Parts (Toast Message)\n\n- `toast` allows you to further style the toast element\n- `title` allows you to further style the toast title element\n- `message` allows you to further style the toast message element\n- `progress-bar` allows you to further style the toast progress bar element\n- `close-button` allows you to further style the toast close button element\n- `close-button-icon` allows you to further style the toast close button icon element\n\n## Events (Toast)\n\n- `add-message` Fires while the toast message is added to container\n- `remove-message` Fires while the toast message is removed from container\n- `save-position` Fires after the local storage settings changed in some way\n- `clear-position` Fires after clear the saved position from local storage\n- `remove-container` Fires after removed the toast message container\n- `link-clicked` Fires when an A-tag or IDS-HYPERLINK in the message body is clicked\n\n## Events (Toast Message)\n\n- `remove-message` Fires while the toast message is removed from container\n\n## Methods (Toast)\n\n- `clearPosition(uniqueId: string|undefined)` Clear the saved position from local storage, If uniqueId is undefined will use Internal attached\n- `clearPositionAll()` Clear all toast related saved position from local storage\n- `close(toastMessageId: string)` Close a specific toast message by its message ID\n- `closeAll()` Close all toast messages currently displayed\n- `messageElem(messageId: string)` Get message element by given message id\n- `show(options: IdsToastShowSettings)` Set to show the toast message\n- `toastContainer()` Get the toast container\n\n## Methods (Toast Message)\n\n- `removeToastMessage()` Remove the toast message from container\n\n## States and Variations (With Code Examples)\n\n- Audible\n- Auto Closeable\n- Closeable\n- Contains Link\n- Draggable\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the tab is focusable this will focus or unfocus the toast.\n- <kbd>Control+Alt+P</kbd>: It will toggle pause and play timeout timer.\n- <kbd>Escape</kbd>: It will close the toast message.\n\n## Responsive Guidelines\n\n- Toasts can be configured to appear at either the top-start, top-end, bottom-start or bottom-end of an application window.\n- Will be placed in the top-end corner by default.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Toasts were implemented in v4.0.0\n- Toasts can be invoked with `$('#my-element').toast()`.\n\n**4.x to 5.x**\n\n- Toasts are now custom elements `<ids-toast></ids-toast>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\n## Regional Considerations\n\nLabels should be localized in the current language. The close icon and progress bar will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-toast-shared","description":{"kind":"markdown","value":"# ids-toast\n\n## Description\n\nToasts are used to display confirmations of success, failure, or other statuses of system processes related to a user’s workflow. If a user submits a form, a toast will confirm the successful or unsuccessful completion of that submission. Toasts are dismissible via the “close” icon or the escape key. If not dismissed, the toast will hide after a configurable amount of time. The Toast will close itself after a timeout (default 6s) or if the close button is clicked. It is also possible to have more than one toast onscreen at a time.\n\n## Use Cases\n\n- Toast component use to give feedback to users after an action has taken place.\n- Use a toast component to display notifications and other non-critical messages.\n\n## Terminology\n\n**Title:** An html text element that display as toast message title.\n**Message:** An html text element that display as toast message body.\n**Close Button:** A trigger button to close the toast message.\n**Progress Bar:** An html element that display as progress bar.\n\n## Features (With Code Examples)\n\nA normal toast used as a web component.\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Toast Message</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSet position of the toast container in specific place\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    // 'bottom-end', 'bottom-start', 'top-end', 'top-start' (default: 'top-end')\n    toast.position = 'bottom-start';\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSet user to allows drag/drop the toast container\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Draggable</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.draggable = true;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSave toast container position to local storage, apply only when draggable set to true\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Save position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  // uniqueId: Use when need to clear saved position from storage\n  // if not will use internal auto generated\n  const uniqueId = 'some-uniqueid';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.draggable = true;\n    toast.uniqueId = uniqueId;\n    toast.savePosition = true;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nClear the saved position from local storage\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Clear saved position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  // uniqueId: used with toast while saved position toast\n  const uniqueId = 'some-uniqueid';\n  const toast = document.createElement('ids-toast');\n  toast.clearPosition(uniqueId);\n});\n```\n\nClear all toast related saved position from local storage\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Clear (all) saved positions</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toast = document.createElement('ids-toast');\n  toast.clearPositionAll();\n});\n```\n\nSet to not destroy after complete all the toast messages\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>No destroy after complete</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.destroyOnComplete = false;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nIt is possible to put links in the toast message by adding it to the message. We only suggest to use one link per toast message. Because of the timeout natural of the toast this variation has questionable usability. But if required you could use it and increase the timeout to a higher value. Consider if a message or some other fixed time mechanism is better.\n\n### Using the hyperlink option (Recommended)\n\nThe preferred way to add a hyperlink is using the `hyperlink` configuration object:\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Update Available',\n    message: 'A new version is ready to install.',\n    hyperlink: {\n      text: 'View details',\n      href: 'https://example.com/updates',\n      target: '_blank'\n    }\n  });\n});\n```\n\nYou can also use a callback function instead of navigation:\n\n```javascript\ntoast.show({\n  title: 'Action Required',\n  message: 'Please review the changes.',\n  hyperlink: {\n    text: 'Review now',\n    onClick: (e) => {\n      console.log('Link clicked', e);\n      // Custom action here\n    }\n  }\n});\n```\n\n### Closing toasts on hyperlink click\n\nYou can automatically close toasts when a hyperlink is clicked using the `closeOnClick` or `closeAllOnClick` options:\n\n```javascript\n// Close only this toast when link is clicked\ntoast.show({\n  title: 'Close on click',\n  message: 'Clicking the link will close this toast only.',\n  hyperlink: {\n    text: 'Close this toast',\n    closeOnClick: true\n  }\n});\n\n// Close all toasts when link is clicked\ntoast.show({\n  title: 'Close all on click',\n  message: 'Clicking the link will close all toasts.',\n  hyperlink: {\n    text: 'Close all toasts',\n    closeAllOnClick: true\n  }\n});\n```\n\nYou can also programmatically close toasts using the callback:\n\n```javascript\ntoast.show({\n  title: 'Callback close',\n  message: 'Uses callback to programmatically close this toast.',\n  hyperlink: {\n    text: 'Close via callback',\n    onClick: (e) => {\n      // Close this specific toast\n      e.detail.elem.close(e.detail.messageId);\n    }\n  }\n});\n\ntoast.show({\n  title: 'Callback close all',\n  message: 'Uses callback to programmatically close all toasts.',\n  hyperlink: {\n    text: 'Close all via callback',\n    onClick: (e) => {\n      // Close all toasts\n      e.detail.elem.closeAll();\n    }\n  }\n});\n```\n\n### Using allowLink\n\nAlternatively, you can embed HTML in the message and use `allowLink`:\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'Link in message: <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\">Google</ids-hyperlink>',\n    allowLink: true\n  });\n});\n```\n\nSet the amount of time (2 seconds), the toast should be present on-screen\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Timeout (2 seconds)</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    timeout: 2000\n  });\n});\n```\n\nCustom text that use for close button label in the toast message\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Close button custom label text</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    closeButtonLabel: 'Click here to close'\n  });\n});\n```\n\nHide the progress bar in toast message\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Progress bar (hidden)</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    progressBar: false\n  });\n});\n```\n\nAdd an icon to the toast message\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Success',\n    message: 'Operation completed successfully.',\n    icon: {\n      icon: 'success',\n      size: 'medium',\n      statusColor: 'success'\n    }\n  });\n});\n```\n\nLet toast message to be invisible on the screen\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Audible only</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    audible: true\n  });\n});\n```\n\nToast message by markup\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Toast message by markup</span>\n</ids-button>\n<ids-toast id=\"toast-markup\" destroy-on-complete=\"false\">\n  <span slot=\"title\">Application Offline</span>\n  <span slot=\"message\">This is a Toast message.</span>\n</ids-toast>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\nconst toast = document.querySelector('#demo-toast');\n\nbtnToast?.addEventListener('click', () => {\n  toast.show();\n});\n```\n\n## Using IdsToastService\n\nFor a simpler API, you can use the IdsToastService which handles toast creation and management automatically:\n\n```javascript\nimport { IdsToastService } from 'ids-enterprise-wc';\n\n// Show a basic toast\nIdsToastService.show({\n  title: 'Success',\n  message: 'Operation completed successfully'\n});\n\n// Show toast with custom timeout\nIdsToastService.show({\n  title: 'Warning',\n  message: 'Please review your changes',\n  timeout: 8000\n});\n\n// Show toast with custom position\nIdsToastService.show({\n  title: 'Info',\n  message: 'New notification received',\n  position: 'bottom-start'\n});\n```\n\n## Settings and Attributes (Toast)\n\n- `allowLink` {boolean} Set to put links in the toast message\n- `audible` {boolean} Set as invisible on the screen, but still read out loud by screen readers\n- `destroyOnComplete` {boolean} Set to destroy after complete all the toast messages\n- `draggable` {boolean} Set user to allows drag/drop the toast container\n- `position` {string} Set position of the toast container in specific place\n- `progressBar` {boolean} Set toast to have a visible progress bar\n- `savePosition` {boolean} Set toast container to save position to local storage, apply only when draggable set to true\n- `timeout` {number} Set the amount of time, the toast should be present on-screen\n- `uniqueId` {number} Set uniqueId to save to local storage, so same saved position can be use for whole app, apply only when draggable set to true\n\n## Settings and Attributes (Toast Message)\n\n- `audible` {boolean} Set as invisible on the screen, but still read out loud by screen readers\n- `icon` {object} Configure an icon to display in the toast message with properties:\n  - `icon` {string} The icon name to display\n  - `size` {string} The icon size ('xsmall',  'small',  'medium',  'large',  'xl',  'xxl')\n  - `statusColor` {string} The icon color ('error', 'warning', 'caution', 'info', 'success',  'neutral',  'red',  'yellow',  'green',  'blue',  'teal',  'purple',  'white',  'black')\n- `hyperlink` {object} Configure a hyperlink to display in the toast message with properties:\n  - `text` {string} The link text to display (required)\n  - `href` {string} The URL to navigate to (optional)\n  - `target` {string} The link target ('_blank', '_self', '_parent', '_top') (optional)\n  - `onClick` {function} Callback function when link is clicked (optional, takes precedence over href)\n  - `closeOnClick` {boolean} If true, closes this toast when the hyperlink is clicked (optional)\n  - `closeAllOnClick` {boolean} If true, closes all toasts when the hyperlink is clicked (optional)\n- `progressBar` {boolean} Set toast to have a visible progress bar\n- `timeout` {number} Set the amount of time, the toast should be present on-screen\n- `messageId` {string} Set id to manage each toast message\n\n## Theme-able Parts (Toast Message)\n\n- `toast` allows you to further style the toast element\n- `title` allows you to further style the toast title element\n- `message` allows you to further style the toast message element\n- `progress-bar` allows you to further style the toast progress bar element\n- `close-button` allows you to further style the toast close button element\n- `close-button-icon` allows you to further style the toast close button icon element\n\n## Events (Toast)\n\n- `add-message` Fires while the toast message is added to container\n- `remove-message` Fires while the toast message is removed from container\n- `save-position` Fires after the local storage settings changed in some way\n- `clear-position` Fires after clear the saved position from local storage\n- `remove-container` Fires after removed the toast message container\n- `link-clicked` Fires when an A-tag or IDS-HYPERLINK in the message body is clicked\n\n## Events (Toast Message)\n\n- `remove-message` Fires while the toast message is removed from container\n\n## Methods (Toast)\n\n- `clearPosition(uniqueId: string|undefined)` Clear the saved position from local storage, If uniqueId is undefined will use Internal attached\n- `clearPositionAll()` Clear all toast related saved position from local storage\n- `close(toastMessageId: string)` Close a specific toast message by its message ID\n- `closeAll()` Close all toast messages currently displayed\n- `messageElem(messageId: string)` Get message element by given message id\n- `show(options: IdsToastShowSettings)` Set to show the toast message\n- `toastContainer()` Get the toast container\n\n## Methods (Toast Message)\n\n- `removeToastMessage()` Remove the toast message from container\n\n## States and Variations (With Code Examples)\n\n- Audible\n- Auto Closeable\n- Closeable\n- Contains Link\n- Draggable\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the tab is focusable this will focus or unfocus the toast.\n- <kbd>Control+Alt+P</kbd>: It will toggle pause and play timeout timer.\n- <kbd>Escape</kbd>: It will close the toast message.\n\n## Responsive Guidelines\n\n- Toasts can be configured to appear at either the top-start, top-end, bottom-start or bottom-end of an application window.\n- Will be placed in the top-end corner by default.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Toasts were implemented in v4.0.0\n- Toasts can be invoked with `$('#my-element').toast()`.\n\n**4.x to 5.x**\n\n- Toasts are now custom elements `<ids-toast></ids-toast>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\n## Regional Considerations\n\nLabels should be localized in the current language. The close icon and progress bar will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-toast","attributes":[{"name":"ls","values":[]},{"name":"#toasts-map","description":"Map of toast massages added in container, to keep track each toast.","values":[]},{"name":"#toasts-counter","description":"Toatl number of toast massages added in container.","values":[]},{"name":"is-service-message","values":[]},{"name":"allow-link","description":"Set to put links in the toast message.","values":[]},{"name":"audible","description":"Set as invisible on the screen, but still read out loud by screen readers.","values":[]},{"name":"destroy-on-complete","description":"Set to destroy after complete all the toasts.\nwill remove from DOM host element.","values":[]},{"name":"draggable","description":"Set user to allows drag/drop the toast container.","values":[]},{"name":"position","description":"Set position of the toast container in specific place.\nOptions: 'bottom-end', 'bottom-start', 'top-end', 'top-start'","values":[]},{"name":"progress-bar","description":"Set toast to have a visible progress bar.","values":[]},{"name":"save-position","description":"Set toast container to save position to local storage.","values":[]},{"name":"timeout","description":"Set the amount of time, the toast should be present on-screen.","values":[]},{"name":"unique-id","description":"Set uniqueId to save to local storage, so same saved position can be use for whole app.","values":[]}],"description":{"kind":"markdown","value":"# ids-toast\n\n## Description\n\nToasts are used to display confirmations of success, failure, or other statuses of system processes related to a user’s workflow. If a user submits a form, a toast will confirm the successful or unsuccessful completion of that submission. Toasts are dismissible via the “close” icon or the escape key. If not dismissed, the toast will hide after a configurable amount of time. The Toast will close itself after a timeout (default 6s) or if the close button is clicked. It is also possible to have more than one toast onscreen at a time.\n\n## Use Cases\n\n- Toast component use to give feedback to users after an action has taken place.\n- Use a toast component to display notifications and other non-critical messages.\n\n## Terminology\n\n**Title:** An html text element that display as toast message title.\n**Message:** An html text element that display as toast message body.\n**Close Button:** A trigger button to close the toast message.\n**Progress Bar:** An html element that display as progress bar.\n\n## Features (With Code Examples)\n\nA normal toast used as a web component.\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Toast Message</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSet position of the toast container in specific place\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    // 'bottom-end', 'bottom-start', 'top-end', 'top-start' (default: 'top-end')\n    toast.position = 'bottom-start';\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSet user to allows drag/drop the toast container\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Draggable</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.draggable = true;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nSave toast container position to local storage, apply only when draggable set to true\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Save position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  // uniqueId: Use when need to clear saved position from storage\n  // if not will use internal auto generated\n  const uniqueId = 'some-uniqueid';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.draggable = true;\n    toast.uniqueId = uniqueId;\n    toast.savePosition = true;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nClear the saved position from local storage\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Clear saved position</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  // uniqueId: used with toast while saved position toast\n  const uniqueId = 'some-uniqueid';\n  const toast = document.createElement('ids-toast');\n  toast.clearPosition(uniqueId);\n});\n```\n\nClear all toast related saved position from local storage\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Clear (all) saved positions</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toast = document.createElement('ids-toast');\n  toast.clearPositionAll();\n});\n```\n\nSet to not destroy after complete all the toast messages\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>No destroy after complete</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    toast.destroyOnComplete = false;\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.'\n  });\n});\n```\n\nIt is possible to put links in the toast message by adding it to the message. We only suggest to use one link per toast message. Because of the timeout natural of the toast this variation has questionable usability. But if required you could use it and increase the timeout to a higher value. Consider if a message or some other fixed time mechanism is better.\n\n### Using the hyperlink option (Recommended)\n\nThe preferred way to add a hyperlink is using the `hyperlink` configuration object:\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Update Available',\n    message: 'A new version is ready to install.',\n    hyperlink: {\n      text: 'View details',\n      href: 'https://example.com/updates',\n      target: '_blank'\n    }\n  });\n});\n```\n\nYou can also use a callback function instead of navigation:\n\n```javascript\ntoast.show({\n  title: 'Action Required',\n  message: 'Please review the changes.',\n  hyperlink: {\n    text: 'Review now',\n    onClick: (e) => {\n      console.log('Link clicked', e);\n      // Custom action here\n    }\n  }\n});\n```\n\n### Closing toasts on hyperlink click\n\nYou can automatically close toasts when a hyperlink is clicked using the `closeOnClick` or `closeAllOnClick` options:\n\n```javascript\n// Close only this toast when link is clicked\ntoast.show({\n  title: 'Close on click',\n  message: 'Clicking the link will close this toast only.',\n  hyperlink: {\n    text: 'Close this toast',\n    closeOnClick: true\n  }\n});\n\n// Close all toasts when link is clicked\ntoast.show({\n  title: 'Close all on click',\n  message: 'Clicking the link will close all toasts.',\n  hyperlink: {\n    text: 'Close all toasts',\n    closeAllOnClick: true\n  }\n});\n```\n\nYou can also programmatically close toasts using the callback:\n\n```javascript\ntoast.show({\n  title: 'Callback close',\n  message: 'Uses callback to programmatically close this toast.',\n  hyperlink: {\n    text: 'Close via callback',\n    onClick: (e) => {\n      // Close this specific toast\n      e.detail.elem.close(e.detail.messageId);\n    }\n  }\n});\n\ntoast.show({\n  title: 'Callback close all',\n  message: 'Uses callback to programmatically close all toasts.',\n  hyperlink: {\n    text: 'Close all via callback',\n    onClick: (e) => {\n      // Close all toasts\n      e.detail.elem.closeAll();\n    }\n  }\n});\n```\n\n### Using allowLink\n\nAlternatively, you can embed HTML in the message and use `allowLink`:\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'Link in message: <ids-hyperlink href=\"http://www.example.com\" target=\"_blank\">Google</ids-hyperlink>',\n    allowLink: true\n  });\n});\n```\n\nSet the amount of time (2 seconds), the toast should be present on-screen\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Timeout (2 seconds)</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    timeout: 2000\n  });\n});\n```\n\nCustom text that use for close button label in the toast message\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Close button custom label text</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    closeButtonLabel: 'Click here to close'\n  });\n});\n```\n\nHide the progress bar in toast message\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Progress bar (hidden)</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    progressBar: false\n  });\n});\n```\n\nAdd an icon to the toast message\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Success',\n    message: 'Operation completed successfully.',\n    icon: {\n      icon: 'success',\n      size: 'medium',\n      statusColor: 'success'\n    }\n  });\n});\n```\n\nLet toast message to be invisible on the screen\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Audible only</span>\n</ids-button>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\n\nbtnToast?.addEventListener('click', () => {\n  const toastId = 'demo-toast';\n  let toast = document.querySelector(`#${toastId}`);\n  if (!toast) {\n    toast = document.createElement('ids-toast');\n    toast.setAttribute('id', toastId);\n    document.body.appendChild(toast);\n  }\n  toast.show({\n    title: 'Application Offline',\n    message: 'This is a Toast message.',\n    audible: true\n  });\n});\n```\n\nToast message by markup\n\n```html\n<ids-button id=\"btn-toast\" appearance=\"secondary\">\n  <span>Toast message by markup</span>\n</ids-button>\n<ids-toast id=\"toast-markup\" destroy-on-complete=\"false\">\n  <span slot=\"title\">Application Offline</span>\n  <span slot=\"message\">This is a Toast message.</span>\n</ids-toast>\n```\n\n```javascript\nconst btnToast = document.querySelector('#btn-toast');\nconst toast = document.querySelector('#demo-toast');\n\nbtnToast?.addEventListener('click', () => {\n  toast.show();\n});\n```\n\n## Using IdsToastService\n\nFor a simpler API, you can use the IdsToastService which handles toast creation and management automatically:\n\n```javascript\nimport { IdsToastService } from 'ids-enterprise-wc';\n\n// Show a basic toast\nIdsToastService.show({\n  title: 'Success',\n  message: 'Operation completed successfully'\n});\n\n// Show toast with custom timeout\nIdsToastService.show({\n  title: 'Warning',\n  message: 'Please review your changes',\n  timeout: 8000\n});\n\n// Show toast with custom position\nIdsToastService.show({\n  title: 'Info',\n  message: 'New notification received',\n  position: 'bottom-start'\n});\n```\n\n## Settings and Attributes (Toast)\n\n- `allowLink` {boolean} Set to put links in the toast message\n- `audible` {boolean} Set as invisible on the screen, but still read out loud by screen readers\n- `destroyOnComplete` {boolean} Set to destroy after complete all the toast messages\n- `draggable` {boolean} Set user to allows drag/drop the toast container\n- `position` {string} Set position of the toast container in specific place\n- `progressBar` {boolean} Set toast to have a visible progress bar\n- `savePosition` {boolean} Set toast container to save position to local storage, apply only when draggable set to true\n- `timeout` {number} Set the amount of time, the toast should be present on-screen\n- `uniqueId` {number} Set uniqueId to save to local storage, so same saved position can be use for whole app, apply only when draggable set to true\n\n## Settings and Attributes (Toast Message)\n\n- `audible` {boolean} Set as invisible on the screen, but still read out loud by screen readers\n- `icon` {object} Configure an icon to display in the toast message with properties:\n  - `icon` {string} The icon name to display\n  - `size` {string} The icon size ('xsmall',  'small',  'medium',  'large',  'xl',  'xxl')\n  - `statusColor` {string} The icon color ('error', 'warning', 'caution', 'info', 'success',  'neutral',  'red',  'yellow',  'green',  'blue',  'teal',  'purple',  'white',  'black')\n- `hyperlink` {object} Configure a hyperlink to display in the toast message with properties:\n  - `text` {string} The link text to display (required)\n  - `href` {string} The URL to navigate to (optional)\n  - `target` {string} The link target ('_blank', '_self', '_parent', '_top') (optional)\n  - `onClick` {function} Callback function when link is clicked (optional, takes precedence over href)\n  - `closeOnClick` {boolean} If true, closes this toast when the hyperlink is clicked (optional)\n  - `closeAllOnClick` {boolean} If true, closes all toasts when the hyperlink is clicked (optional)\n- `progressBar` {boolean} Set toast to have a visible progress bar\n- `timeout` {number} Set the amount of time, the toast should be present on-screen\n- `messageId` {string} Set id to manage each toast message\n\n## Theme-able Parts (Toast Message)\n\n- `toast` allows you to further style the toast element\n- `title` allows you to further style the toast title element\n- `message` allows you to further style the toast message element\n- `progress-bar` allows you to further style the toast progress bar element\n- `close-button` allows you to further style the toast close button element\n- `close-button-icon` allows you to further style the toast close button icon element\n\n## Events (Toast)\n\n- `add-message` Fires while the toast message is added to container\n- `remove-message` Fires while the toast message is removed from container\n- `save-position` Fires after the local storage settings changed in some way\n- `clear-position` Fires after clear the saved position from local storage\n- `remove-container` Fires after removed the toast message container\n- `link-clicked` Fires when an A-tag or IDS-HYPERLINK in the message body is clicked\n\n## Events (Toast Message)\n\n- `remove-message` Fires while the toast message is removed from container\n\n## Methods (Toast)\n\n- `clearPosition(uniqueId: string|undefined)` Clear the saved position from local storage, If uniqueId is undefined will use Internal attached\n- `clearPositionAll()` Clear all toast related saved position from local storage\n- `close(toastMessageId: string)` Close a specific toast message by its message ID\n- `closeAll()` Close all toast messages currently displayed\n- `messageElem(messageId: string)` Get message element by given message id\n- `show(options: IdsToastShowSettings)` Set to show the toast message\n- `toastContainer()` Get the toast container\n\n## Methods (Toast Message)\n\n- `removeToastMessage()` Remove the toast message from container\n\n## States and Variations (With Code Examples)\n\n- Audible\n- Auto Closeable\n- Closeable\n- Contains Link\n- Draggable\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the tab is focusable this will focus or unfocus the toast.\n- <kbd>Control+Alt+P</kbd>: It will toggle pause and play timeout timer.\n- <kbd>Escape</kbd>: It will close the toast message.\n\n## Responsive Guidelines\n\n- Toasts can be configured to appear at either the top-start, top-end, bottom-start or bottom-end of an application window.\n- Will be placed in the top-end corner by default.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Toasts were implemented in v4.0.0\n- Toasts can be invoked with `$('#my-element').toast()`.\n\n**4.x to 5.x**\n\n- Toasts are now custom elements `<ids-toast></ids-toast>`\n- If using events, events are now plain JS events\n- Can now be imported as a single JS file and used with encapsulated styles\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/ok0LLOT9PP1J0kBkPMaZ5c/IDS_Component_File_v4.6-(Draft))\n\n## Accessibility Guidelines\n\n## Regional Considerations\n\nLabels should be localized in the current language. The close icon and progress bar will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-toggle-button","attributes":[{"name":"pressed","description":"Set the pressed (on/off) state","values":[]},{"name":"no-auto-toggle","description":"Set the `no-auto-toggle` attribute","values":[]},{"name":"appearance","description":"Override setting the \"appearance\" on Toggle Buttons, since they can only be the default style","values":[]},{"name":"icon-off","description":"Defines the `unpressed/off` toggle state icon.","values":[]},{"name":"icon-on","description":"Defines the `pressed/on` toggle state icon.","values":[]},{"name":"disable-icon","description":"Get the `disable-icon` attribute","values":[]},{"name":"text-off","description":"Defines the `unpressed/off` toggle state text.","values":[]},{"name":"text-on","description":"Defines the `pressed/on` toggle state icon.","values":[]},{"name":"should-update","values":[]},{"name":"#is-setting-initial-state","values":[]},{"name":"#size-ro","description":"ResizeObserver for size-based margin computation","values":[]},{"name":"#is-overflowing","values":[]},{"name":"size-widths","description":"Map of size keys to CSS variable names matching ids-input widths","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"#mo","description":"Watches for changes","values":[]},{"name":"#audible-mo","description":"Watches for changes on .audible element within the button","values":[]},{"name":"proto-classes","description":"Figure out the classes","values":[]},{"name":"#is-updating-hidden","values":[]},{"name":"tab-index","description":"Set the tab index value","values":[]},{"name":"hidden","description":"Set the hidden value","values":[]},{"name":"button","values":[]},{"name":"span","values":[]},{"name":"compact","description":"Indicates whether the button is in a compact state.","values":[]},{"name":"content-align","description":"Set the button content alignment between 'default (center)', 'start', or 'end'","values":[]},{"name":"overflow","description":"Set how content overflows; can specify 'ellipsis', or undefined or 'none'","values":[]},{"name":"css-class","values":[]},{"name":"disabled","description":"Passes a disabled attribute from the custom element to the button","values":[]},{"name":"#tab-index","description":"Passes a tabIndex attribute from the custom element to the button","values":[]},{"name":"icon","description":"Gets the current icon used on the button","values":[]},{"name":"icon-el","description":"Gets the current icon element","values":[]},{"name":"icon-align","description":"Sets the automatic alignment of an existing icon to the 'start' or 'end' of the text","values":[]},{"name":"width","description":"Set width of button","values":[]},{"name":"height","description":"Set height of button","values":[]},{"name":"no-animation","description":"Gets flag for generative AI animation","values":[]},{"name":"text","values":[]},{"name":"type","description":"Sets the HTMLButtonElement 'type' attribute","values":[]},{"name":"no-margins","description":"Sets the no margins attribute","values":[]},{"name":"margin-block-end","description":"Sets the margin-block-end on the button","values":[]},{"name":"no-padding","values":[]},{"name":"square","values":[]},{"name":"badge-color","values":[]},{"name":"badge-position","values":[]},{"name":"label-audible","description":"Set the audible text of button","values":[]},{"name":"label-width","description":"Gets the current label width value","values":[]},{"name":"label-position","description":"Gets the current label position value","values":[]},{"name":"size","description":"Gets the current size value","values":[]},{"name":"described-by","description":"Aria describedby for button","values":[]},{"name":"background-fill","description":"Get the background fill setting","values":[]}],"description":{"kind":"markdown","value":"# Ids Toggle Button\n\n## Description\n\nThe IDS Toggle Button component is an extension of the standard [IDS Button](../ids-button/README.md) component, which provides some API around \"toggling\" a feature and having a \"pressed\" state, in addition to the IDS Button's standard features.\n\n## Use Cases\n\n- Create buttons with \"pressed\" and \"unpressed\" states, which represent an action being toggled \"on\" and \"off\".\n\n## Terminology\n\n- Unpressed: an unpressed state is the visual equivalent to turning a feature \"off\".\n- Pressed: a pressed state is the visual equivalent to turning a feature \"on\".\n- Toggle: the action of toggling switches between unpressed and pressed, swapping to the alternate of what is currently set.\n\n## Features (With Code Examples)\n\nThe Toggle Button extends IDS Button with \"on\" (pressed) and \"off\" (unpressed) states. Use `icon-on`/`icon-off` and `text-on`/`text-off` to define the content for each state:\n\n```html\n<ids-toggle-button\n  id=\"my-toggle\"\n  icon-on=\"star-filled\"\n  icon-off=\"star-outlined\"\n  text-off=\"Toggle off\"\n  text-on=\"Toggle on\">\n</ids-toggle-button>\n```\n\nTo default the button to the pressed/on state, add the `pressed` attribute:\n\n```html\n<ids-toggle-button id=\"my-toggle\" pressed=\"true\" icon=\"star-filled\" icon-on=\"star-filled\" icon-off=\"star-outlined\" text-off=\"Toggle Button (Off)\" text-on=\"Toggle Button (On)\"></ids-toggle-button>\n```\n\nTo render a toggle button without an icon (text only), use the `disable-icon` attribute:\n\n```html\n<ids-toggle-button\n  id=\"my-toggle\"\n  pressed\n  icon-on=\"star-filled\"\n  icon-off=\"star-outlined\"\n  text-off=\"Toggle off\"\n  text-on=\"Toggle on\">\n</ids-toggle-button>\n```\n\nTo disable automatic toggling on click and handle it manually:\n\n```html\n<ids-toggle-button\n  id=\"my-toggle\"\n  no-auto-toggle\n  icon-on=\"star-filled\"\n  icon-off=\"star-outlined\"\n  text-off=\"Toggle off\"\n  text-on=\"Toggle on\">\n</ids-toggle-button>\n```\n\n```js\nconst btn = document.querySelector('#my-toggle');\nbtn.addEventListener('click', () => {\n  // Custom logic here\n  btn.toggle();\n});\n```\n\n```js\nconst btn = document.createElement('ids-toggle-button');\nbtn.textOff = 'Favorite';\nbtn.textOn = 'Favorited';\nbtn.iconOff = 'star-outlined';\nbtn.iconOn = 'star-filled';\ndocument.body.appendChild(btn);\n\nbtn.toggle(); // switches to pressed state\n```\n\n## Settings (Attributes)\n\n- `pressed` {boolean} Sets the on/off toggle state.\n- `icon-on` {string} Icon to display when pressed. Defaults to `star-filled` if not set. Set to an empty string `''` or `false` to explicitly hide the icon in the pressed state.\n- `icon-off` {string} Icon to display when unpressed. Defaults to `star-outlined` if not set. Set to an empty string `''` or `false` to explicitly hide the icon in the unpressed state.\n- `text-on` {string} Text label to display when pressed.\n- `text-off` {string} Text label to display when unpressed.\n- `disable-icon` {boolean} When `true`, hides the icon entirely regardless of `icon-on`/`icon-off`. Setting `icon-on` or `icon-off` to a non-empty value will automatically remove this attribute.\n- `no-auto-toggle` {boolean} When present, disables automatic toggling on click. The button will not toggle when clicked; you must call `toggle()` or set `pressed` programmatically.\n\n## Manual Toggle Control\n\nBy default, the toggle button automatically toggles its state when clicked. If you need custom click handling logic, use the `no-auto-toggle` attribute to disable this behavior:\n\n```html\n<ids-toggle-button\n  id=\"custom-toggle\"\n  no-auto-toggle\n  icon-on=\"check\"\n  icon-off=\"close\"\n  text-off=\"Disabled\"\n  text-on=\"Enabled\">\n</ids-toggle-button>\n```\n\n```js\nconst btn = document.querySelector('#custom-toggle');\n\nbtn.addEventListener('click', async () => {\n  // Perform validation or async operation before toggling\n  const isValid = await validateChange(btn.pressed);\n\n  if (isValid) {\n    btn.toggle();\n  } else {\n    console.warn('Change not allowed');\n  }\n});\n```\n\nYou can also control this programmatically:\n\n```js\nconst btn = document.querySelector('#my-toggle');\n\n// Disable auto-toggle\nbtn.noAutoToggle = true;\n\n// Re-enable auto-toggle\nbtn.noAutoToggle = false;\n```\n\n### `refreshIcon()` Example\n\n```js\nconst btn = document.querySelector('#my-toggle');\nbtn.pressed = true;\nbtn.refreshIcon(); // icon updates to icon-on value\n```\n\n### `refreshText()` Example\n\n```js\nconst btn = document.querySelector('#my-toggle');\nbtn.pressed = true;\nbtn.refreshText(); // text updates to text-on value\n```\n\n## States and Variations\n\nIn addition to having the same states as Buttons, Toggle Buttons can also have:\n\n- Pressed (on)\n- Unpressed (off)\n\n### \"Default\" Appearance\n\nToggle buttons can only be displayed in the \"default\" button appearance\n\n## Settings and Attributes\n\n- `pressed` {boolean} Sets the toggle button to its \"on\" (pressed) state. Defaults to `false`.\n- `icon-on` {string} Icon to display when the button is in the pressed/on state. Defaults to `star-filled`.\n- `icon-off` {string} Icon to display when the button is in the unpressed/off state. Defaults to `star-outlined`.\n- `text-on` {string} Text label to display when the button is in the pressed/on state.\n- `text-off` {string} Text label to display when the button is in the unpressed/off state.\n- `disable-icon` {boolean} When present, hides the icon and renders the button as text-only.\n- `no-auto-toggle` {boolean} When present, disables automatic toggling on click. The button will not toggle when clicked; you must call `toggle()` or set `pressed` programmatically.\n\n## Methods\n\n- `toggle()` Toggles the pressed state between `true` and `false`.\n- `refreshIcon()` Updates the button's icon to reflect the current pressed state. Uses `icon-on` when pressed, `icon-off` when unpressed. Has no effect when `disable-icon` is set.\n- `refreshText()` Updates the button's visible text label to reflect the current pressed state. Uses `text-on` when pressed, `text-off` when unpressed.\n\n## Events\n\n- `pressed-changed` Fires when the pressed state changes. The `detail` object contains `{ pressed: boolean, element: IdsToggleButton }`.\n\n```js\ndocument.querySelector('#my-toggle').addEventListener('pressed-changed', (e) => {\n  console.log('Pressed:', e.detail.pressed);\n});\n```\n\n## Keyboard Guidelines\n\nThe IDS Toggle Button component supports keyboard navigation for improved accessibility:\n\n- **Tab / Shift+Tab**: Move focus to and from the toggle button\n- **Space / Enter**: Toggle the button state between pressed and unpressed\n- **Arrow Left / Right**: Navigate between sibling toggle buttons within a container\n- **Arrow Keys**: Navigate between toggle buttons when placed inside a toolbar\n\n## Responsive Guidelines\n\n- Toggle buttons adapt to their container width on smaller viewports; avoid fixed widths so the button can reflow naturally\n- On touch devices, the tap target meets the minimum recommended size (44×44 px) to ensure usability\n- When used inside a toolbar, toggle buttons collapse or wrap consistently with the other toolbar items at narrow breakpoints\n- Icon-only toggle buttons (using `disable-icon=\"false\"` with no text) should always include a visible tooltip or `aria-label` so the purpose remains clear on all screen sizes\n\n## Converting from Previous Versions\n\n## Designs\n\n## Alternate Designs\n\n## Proposed Changes\n\n## Test Plan\n\n1. Accessibility - Axe\n1. Visual Regression Test\n1. Repeat Tests in All Supported Browsers\n1. Some of these as test cases from the [WC gold standard](https://github.com/webcomponents/gold-standard/wiki#api)\n1. Can be consumed in NG/Vue/React (pull it in standalone/built see it works standalone)\n\n## Accessibility Guidelines\n\n- The toggle button renders as a native `<button>` element, ensuring full keyboard and assistive technology support out of the box\n- `aria-pressed` is automatically reflected from the `pressed` property (`\"true\"` when on, `\"false\"` when off), communicating the current toggle state to screen readers\n- When only an icon is shown (no visible text), provide a meaningful `aria-label` on the component so screen readers announce the button's purpose:\n\n```html\n<ids-toggle-button icon-on=\"star-filled\" icon-off=\"star-outlined\" aria-label=\"Favorite\"></ids-toggle-button>\n```\n\n- When both `text-on` and `text-off` are supplied, the visible label changes with the state, giving sighted and screen-reader users consistent feedback\n- Avoid relying solely on color to convey the pressed/unpressed state; the icon and/or text change provides a non-color indicator\n- Ensure sufficient color contrast between the button label/icon and its background in both pressed and unpressed states (WCAG 2.0 AA minimum, AAA preferred)\n\n## Regional Considerations\n\nBe conscious of the layout of content within your buttons when they are present in RTL situations.\n"}},{"name":"ids-toolbar-more-actions","attributes":[{"name":"#menu-item-observer","description":"MutationObserver to watch for disabled attribute changes on overflow menu items","values":[]},{"name":"#child-observer","description":"MutationObserver to watch for new child elements being added\n(handles frameworks like ExtJS that add children after connectedCallback)","values":[]},{"name":"color-variants","values":[]},{"name":"button","values":[]},{"name":"menu","values":[]},{"name":"menu-items","values":[]},{"name":"predefined-menu-items","values":[]},{"name":"overflow-menu-items","values":[]},{"name":"toolbar","values":[]},{"name":"pinnable-section","values":[]},{"name":"disabled","values":[]},{"name":"overflow","values":[]},{"name":"toolbar-type","values":[]},{"name":"type","description":"Overrides the standard toolbar section \"type\" getter, which always returns \"more\" in this case.","values":[]},{"name":"visible","values":[]}],"description":{"kind":"markdown","value":"# ids-toolbar\n\n## Description\n\nThe Ids Toolbar is used for building highly-configurable Toolbars for sections of your application.  It displays [buttons](../ids-button/README.md), hyperlinks, and other components in different align-able sections, along with contextual information about a workflow or process.\n\nThe Ids Toolbar can also be responsive, intelligently hiding buttons that can't be shown on-screen, and displaying them in an overflow menu.\n\n## Use Cases\n\n- Provides contextual information for a workflow or process displayed on screen\n- Provides access to contextual actions for said workflow/process\n\n## Terminology\n\n- **Section** - Toolbars are divided into sections. Each of these sections has their own alignment style and \"type\" that determines how it fits within the Toolbar.\n- **Item** - Toolbar items are the actionable elements within a toolbar. In general they correspond to standard HTML Elements or other IDS Components, such as buttons, hyperlinks, checkboxes, etc.\n- **More Actions** - This optional element can be applied to Toolbars that contain a significant number of actions that cannot all be displayed on screen at one time. This element contains a menu button that will display any \"spilled-over\" contents from the Toolbar when active, once those actions are no longer visible on the Toolbar.\n\n## Settings (Attributes)\n\n### Toolbar\n\n#### Properties\n\n- `disabled` {Boolean} - Makes the entire toolbar enabled/disabled\n- `hidden` {boolean} - Hides the element from display\n- `padding` {string|number} - Sets padding to the container (in pixels)\n- `tabbable` {Boolean} - Controls toolbar navigation mode. When `true`, all toolbar items can be navigated using Tab/Shift+Tab keys. When `false` (default), uses roving tabindex where only one item is tabbable at a time and arrow keys navigate between items\n- `type` {string} - Sets the toolbar type. Can be `formatter` for formatter-style toolbars\n\n#### Read-only Properties\n\n- `focused` {HTMLElement} - Describes the currently-focused Toolbar item\n- `items` {Array<HTMLElement>} - Provides access to all Toolbar items in all sections\n- `sections` {Array<IdsToolbarSection>} - Provides access to all the Toolbar's sections\n- `separators` {Array<IdsSeparator>} - Provides access to all the Toolbar's separators\n\n### Toolbar Section\n\n- `align` {string} - Determines the alignment of the items within this section\n  - `center` - Center alignment\n  - `center-even` - Center alignment with even spacing\n  - `end` - Right side of the Toolbar in Left-to-Right setup\n  - `start` (default) - Left side of the Toolbar in Left-to-Right setup\n- `favor` {Boolean} - Determines if this section should not shrink/collapse when the size of the entire Toolbar shrinks. This causes the other Toolbar sections to become smaller first\n- `flex-grow` {string} - Controls the CSS flex-grow property of the section. Set to `'0'` to prevent the section from growing and taking up extra space. Useful for keeping sections adjacent to each other\n- `hidden` {boolean} - Hides the element from display\n- `inactive` {Boolean} - If true, makes the toolbar section inactive (takes up space, but items are not visible)\n- `pinnable` {Boolean} - If true, makes the items inside this section `pinnable`\n- `keep-visible` {Boolean} - If true, prevents the section from being auto-hidden when it has no visible children\n- `toolbar-type` {string} - Sets the toolbar type for styling purposes. Can be `formatter` for formatter-style toolbars\n- `type` {string} - Sets a pre-defined type on the toolbar section\n  - `button` - Section for a single button to maintain button's focus state\n  - `buttonset` - Section optimized for containing multiple buttons\n  - `fluid` - Section that fills available space\n  - `more` - Section type for more actions\n  - `search` - Section styled for search functionality\n  - `static` (default) - Basic section with no special styling, static sections will never go into the overflow. They take up as little space as possible and have no special styling. They're basic sections with no predefined behavior.\n  - `title` - Section styled for displaying titles and subtitles\n\n#### Section Read-only Properties\n\n- `items` {Array<Element>} - Provides access to all Toolbar items in this section\n- `pinned` {Array<Element>} - List of items that have the pinned status\n- `separators` {Array<Element>} - List of ids-separator nodes contained by the toolbar section\n- `textElems` {Array<Element>} - List of text nodes contained by the toolbar section\n- `toolbar` {HTMLElement} - Reference to this section's toolbar parent node\n\n#### Supported Item Types\n\nToolbar sections can contain various IDS components:\n\n- [IDS Button](../ids-button/README.md) - Primary action buttons\n- [IDS Checkbox](../ids-checkbox/README.md) - Toggle options\n- [IDS Dropdown](../ids-dropdown/README.md) - Selection dropdowns\n- [IDS Hyperlink](../ids-hyperlink/README.md) - Navigation links\n- [IDS Icon](../ids-icon/README.md) - Visual indicators\n- [IDS Input](../ids-input/README.md) - Text input fields\n- [IDS Separator](../ids-separator/README.md) - Visual dividers\n- [IDS Text](../ids-text/README.md) - Text content\n\n### Toolbar More Actions\n\n- `disabled` {Boolean} - Makes the More Actions menu button disabled/enabled\n- `hidden` {boolean} - Hides the element from display\n- `overflow` {Boolean} - If true, menu items that cannot be displayed in the main Toolbar area due to lack of space will be \"mirrored\" and generated as menu items in a special group inside this menu. Clicking the mirrored menu items will cause the original Toolbar action to be fired. When a [Menu Button](../ids-menu-button/README.md) component is mirrored, its attached menu is also mirrored as a submenu on its generated menu item\n- `toolbar-type` {string} - Sets the toolbar type for styling purposes. Can be `formatter` for formatter-style toolbars\n- `visible` {Boolean} - Controls whether the More Actions menu is displayed/hidden\n\n#### More Actions Read-only Properties\n\n- `button` {IdsMenuButton} - Provides access to the internal [Menu Button component](../ids-menu-button/README.md)\n- `menu` {IdsPopupMenu} - Provides access to the internal [Popup Menu component](../ids-popup-menu/README.md)\n- `menuItems` {Array<IdsMenuItem>} - Get the menu-items inside this IdsToolbarMoreActions\n- `overflowMenuItems` {Array<HTMLElement>} - List of menu items that mirror Toolbar items\n- `pinnableSection` {IdsToolbarSection} - Reference to the `pinnable` section in the toolbar\n- `predefinedMenuItems` {Array<HTMLElement>} - List of manually-defined menu items\n- `toolbar` {HTMLElement} - Reference to this section's toolbar parent node\n- `type` {string} - This component is a standalone toolbar section that always reports `more` for its type\n\n## States and Variations\n\n- **Disabled** - The entire toolbar can be disabled, preventing interaction with all contained items\n- **Tabbable** - Controls keyboard navigation behavior through toolbar items\n\nAside from the Toolbar-level disabled state, all individual Toolbar items are responsible for management of their own state. For more information on these components' states, see their respective documentation:\n\n- [IDS Button States](../ids-button/README.md)\n- [IDS Checkbox States](../ids-checkbox/README.md)\n- [IDS Dropdown States](../ids-dropdown/README.md)\n- [IDS Input States](../ids-input/README.md)\n\n## Features (With Code Examples)\n\nIds Toolbars are comprised of the Toolbar element, an indeterminate number of Toolbar sections, and an optional \"More Actions\" menu button element. Inside of the different toolbar sections, it's possible to place different Ids Components.  Below is a basic example of what an entire Ids Toolbar may look like:\n\n```html\n<ids-toolbar>\n    <ids-toolbar-section type=\"title\">\n        <ids-text type=\"h3\">My Toolbar</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"buttonset\" align=\"end\">\n        <ids-button id=\"button-1\" role=\"button\">\n            <span>Text</span>\n        </ids-button>\n        <ids-button id=\"button-2\">\n            <span class=\"audible\">Settings</span>\n            <ids-icon icon=\"settings\"></ids-icon>\n        </ids-button>\n    </ids-toolbar-section>\n    <ids-toolbar-more-actions>\n        <ids-menu-group>\n            <ids-menu-item value=\"1\">Option One</ids-menu-item>\n            <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n            <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n            <ids-menu-item>More Options\n            <ids-popup-menu>\n                <ids-menu-group>\n                <ids-menu-item value=\"4\">Option Four</ids-menu-item>\n                <ids-menu-item value=\"5\">Option Five</ids-menu-item>\n                <ids-menu-item value=\"6\">Option Six</ids-menu-item>\n                </ids-menu-group>\n            </ids-popup-menu>\n            </ids-menu-item>\n        </ids-menu-group>\n    </ids-toolbar-more-actions>\n</ids-toolbar>\n```\n\n### Sections\n\nToolbar sections can be configured with different \"types\" that can determine their look/feel/function.  By default, the sections do not fill available space and contain no padding.  These are `static` toolbar sections:\n\n```html\n<ids-toolbar-section>\n    <ids-button icon=\"menu\" role=\"button\">\n        <span class=\"audible\">Application Menu Trigger</span>\n    </ids-button>\n</ids-toolbar-section>\n```\n\nFor compatibility with 4.x components Toolbars, the IDS Toolbar also supports `title` and `buttonset` section types that act similarly.  The styling is less rigid than in previous iterations, so to make a `buttonset` section \"right\"-aligned, it's necessary to add the `align=\"end\"` attribute:\n\n```html\n<ids-toolbar-section type=\"title\">\n    <ids-text font-size=\"20\">My Toolbar</ids-text>\n    <ids-text font-size=\"14\">Subtitle</ids-text>\n</ids-toolbar-section>\n<ids-toolbar-section type=\"buttonset\" align=\"end\">\n    <ids-button id=\"button-1\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n    <ids-button id=\"button-2\">\n        <span class=\"audible\">Settings</span>\n        <ids-icon icon=\"settings\"></ids-icon>\n    </ids-button>\n</ids-toolbar-section>\n```\n\n#### Controlling Section Growth with Flex-Grow\n\nTo prevent sections from growing and maintain fixed widths, use the `flex-grow` attribute:\n\n```html\n<ids-toolbar>\n    <ids-toolbar-section>\n        <ids-button icon=\"menu\">\n            <span class=\"audible\">Menu</span>\n        </ids-button>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"title\" flex-grow=\"0\">\n        <ids-text font-size=\"20\">Dashboard</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section>\n        <ids-text>Adjacent text</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"buttonset\" align=\"end\">\n        <ids-button icon=\"settings\">Settings</ids-button>\n    </ids-toolbar-section>\n</ids-toolbar>\n```\n\nIn this example, the title section has `flex-grow=\"0\"` to prevent it from expanding and taking up extra space, keeping sections closer together.\n\nToolbar Title sections can have multiple text elements, if needed:\n\n```html\n<ids-toolbar-section type=\"title\">\n    <ids-text font-size=\"20\">My Toolbar</ids-text>\n    <ids-text font-size=\"14\">Subtitle</ids-text>\n</ids-toolbar-section>\n\n<!-- or... -->\n\n<ids-toolbar-section type=\"title\">\n    <ids-text font-size=\"20\">My Toolbar</ids-text>\n</ids-toolbar-section>\n```\n\nToolbar Button Set sections can contain an indeterminate number of components.  Generally these are [Buttons](../ids-button/README.md), but other component types such as Hyperlinks and some Pickers are accepted.  The Button Set Section is styled with CSS to prevent the wrapping of these elements to multiple lines, instead cutting off actions that don't fit.\n\n```html\n<ids-toolbar-section type=\"buttonset\" align=\"end\">\n    <ids-button id=\"button-1\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n    <ids-button id=\"button-2\">\n        <span class=\"audible\">Settings</span>\n        <ids-icon icon=\"settings\"></ids-icon>\n    </ids-button>\n    <ids-button id=\"button-3\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n    <ids-button id=\"button-4\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n</ids-toolbar-section>\n```\n\nToolbars can also contain sections that are meant to be customized with CSS.  It's possible to create custom static sections with the `static` type, but if you want to make a custom section that fills available space, use the `fluid` type:\n\n```html\n<ids-toolbar>\n    <!-- takes up as little space as possible --->\n    <ids-toolbar-section type=\"static\">\n        <ids-button id=\"button-1\" role=\"button\">\n            <span>Button 1</span>\n        </ids-button>\n    </ids-toolbar-section>\n\n    <!-- fills the rest of the toolbar space -->\n    <ids-toolbar-section type=\"fluid\" align=\"end\">\n        <ids-button id=\"button-2\" role=\"button\">\n            <span>Button 2</span>\n        </ids-button>\n    </ids-toolbar-section>\n<ids-toolbar>\n```\n\nThe toolbar can be set as the formatter styles:\n\n```html\n<ids-toolbar type=\"formatter\">\n  <ids-toolbar-section type=\"buttonset\">\n    <ids-button id=\"button-1\" role=\"button\">\n      <span>Button 1</span>\n    </ids-button>\n    <ids-separator vertical></ids-separator>\n    <ids-button id=\"button-2\" role=\"button\">\n      <span>Button 2</span>\n    </ids-button>\n  </ids-toolbar-section>\n<ids-toolbar>\n```\n\n#### Pinned Buttons in Section\n\nA toolbar section can be set to `pinnable`. This allows all its child elements to be pinned or unpinned. A pinned element means it will show on the toolbar, while an unpinned element will not show in the toolbar.\n\nThe More Actions button will be needed to access the feature of pinning and unpinning elements.\n\n```html\n<ids-toolbar-section type=\"buttonset\" align=\"end\" pinnable>\n    <ids-button id=\"pin-1\" role=\"button\" no-padding>\n        <span>Pin 1</span>\n    </ids-button>\n    <ids-button id=\"pin-2\" role=\"button\" no-padding>\n        <span>Pin 2</span>\n    </ids-button>\n    <ids-button id=\"pin-3\" role=\"button\" no-padding>\n        <span>Pin 3</span>\n    </ids-button>\n</ids-toolbar-section>\n```\n\n### More Actions Button\n\nOptionally, toolbars can contain a \"More Actions\" Button, which is a [Menu Button]('../ids-menu-button/README.md) wrapped inside a special Toolbar Section.  This component's purpose is to provide ansulary actions that are related to your Toolbar's primary actions, but don't necessarily need to be readily available on a single click.  In responsive settings with many primary actions present, the Toolbar will collapse any actions that don't fit within its boundaries.  Optionally, the More Actions menu can display these collapsed actions at the top of its menu (also referred to as the \"overflow\" menu).\n\n#### Auto-Hiding Empty Sections\n\nToolbar sections that have no visible children are automatically hidden by adding an `empty` CSS class. This prevents empty sections from taking up space in the toolbar layout. The `empty` class is evaluated on initialization and when children are added or removed.\n\n- On initialization, if a section has no visible children, the `empty` class is added and the section is hidden.\n- When a child element is added to an empty section, the `empty` class is removed and the section becomes visible.\n- When all children are removed from a section that was initially populated, the `empty` class is not re-added.\n\n#### Persistent Sections\n\nTo prevent a section from being auto-hidden even when it has no visible children, use the `keep-visible` attribute. This is useful for sections that may be populated dynamically after initialization.\n\n```html\n<ids-toolbar-section type=\"buttonset\" keep-visible>\n    <!-- Items will be added dynamically -->\n</ids-toolbar-section>\n```\n\nSetting `keep-visible` dynamically will remove the `empty` class if present. Removing `keep-visible` will re-evaluate whether the section should be hidden based on its current children.\n\nThe Ids Toolbar More Actions component sits alongside the other toolbar sections, and contains a single slot that takes the same types of elements as a standard [Ids Popup Menu](../ids-popup-menu/README.md):\n\n```html\n<ids-toolbar-more-actions>\n    <ids-menu-group>\n        <ids-menu-item value=\"1\">Option One</ids-menu-item>\n        <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n        <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n        <ids-menu-item>More Options\n        <ids-popup-menu>\n            <ids-menu-group>\n            <ids-menu-item value=\"4\">Option Four</ids-menu-item>\n            <ids-menu-item value=\"5\">Option Five</ids-menu-item>\n            <ids-menu-item value=\"6\">Option Six</ids-menu-item>\n            </ids-menu-group>\n        </ids-popup-menu>\n        </ids-menu-item>\n    </ids-menu-group>\n</ids-toolbar-more-actions>\n```\n\nIf accompanied by a More Actions button with the `overflow` attribute set, Toolbar Actions that don't fit within their sections will be hidden in the Toolbar, but will also \"spill over\" into the More Actions menu, inside a special `IdsMenuGroup` with a `more-actions` attribute.  If a user clicks on one of the menu items that reflects a Toolbar element, the Toolbar element will also be \"clicked\".  This allows visually-hidden Toolbar actions to still remain available in responsive settings.\n\n```html\n<ids-toolbar-more-actions overflow>\n    <!--\n        Toolbar Items will be mirrored here inside a group that looks like:\n        <ids-menu-group more-actions>\n            <ids-menu-item>Text</ids-menu-item>\n            <ids-menu-item icon=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item>Text</ids-menu-item>\n            <ids-menu-item>Text</ids-menu-item>\n        </ids-menu-group>\n    --->\n    <ids-menu-group>\n        <ids-menu-item value=\"1\">Option One</ids-menu-item>\n        <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n        <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n    </ids-menu-group>\n</ids-toolbar-more-actions>\n```\n\n### API Access\n\nAt the Toolbar level, it's possible to access all Items and Sections:\n\n```js\nconst items = document.querySelector('ids-toolbar').items;\nconst sections = document.querySelector('ids-toolbar').sections;\n```\n\nWithin each section, it's possible to access the section's items:\n\n```js\nconst items = document.querySelector('ids-toolbar-section').items;\n```\n\nWhen dealing with a More Actions button, its inner components' APIs are exposed:\n\n```js\nconst moreActionsButtonEl = document.querySelector('ids-toolbar-more-actions').button;\nconst moreActionsMenuEl = document.querySelector('ids-toolbar-more-actions').menu;\n```\n\nAccess to the different More Actions menu items is also exposed:\n\n```js\n// These items are defined inside the `<ids-toolbar-more-actions>` element's default slot.\nconst predefinedMenuItems = document.querySelector('ids-toolbar-more-actions').predefinedMenuItems;\n\n// These items are generated by the More Actions menu if the `overflow` attribute is set.\n// These items mirror the regular Toolbar elements.\nconst overflowMenuItems = document.querySelector('ids-toolbar-more-actions').overflowMenuItems;\n```\n\nOverflow menu items also provide a reference to their corresponding Toolbar element:\n\n```js\nconst overflowMenuItems = document.querySelector('ids-toolbar-more-actions').overflowMenuItems;\noverflowMenuItems.forEach((item) => {\n  console.info(item.overflowTarget); // <-- Points to the Toolbar button/element/etc\n});\n```\n\n### Events\n\nAll elements inside the Toolbar will fire a `selected` event when clicked.  The `selected` event from the More Actions menu's [IdsPopupMenu]('../ids-popup-menu/README.md) is converted into a Toolbar-compatible event automatically, so only one listener at the Toolbar level is needed:\n\n```js\nconst toolbarEl = document.querySelector('#my-toolbar');\ntoolbarEl.addEventListener('selected', (e) => {\n  console.info(e.detail); // Provides data about the originating element, and overflow status, if applicable\n}\n```\n\n## Keyboard Guidelines\n\nThe IDS Button doesn't contain any interactions beyond a standard HTMLButtonElement:\n\n- <kbd>Enter</kbd> keys selects a toolbar action and executes the action.  On menu buttons, the menu is activated/hidden, and an action is not executed until one of its menu items is selected.\n- <kbd>Left/Right Arrow</kbd> keys navigate the available toolbar items.\n- <kbd>Tab</kbd> or <kbd>Shift</kbd>/<kbd>Tab<kbd> keys cause navigation to occur.  When `tabbable`, using Tab/Shift+Tab causes navigation between Toolbar items. Navigation away from the toolbar will occur to the element after/before the Toolbar respectively.\n\n## Responsive Guidelines\n\n- Try not to provide an over-abundance of Toolbar Actions.  The Toolbar's intention is to provide contextual actions for a specific workflow. Providing too many actions can cause end-user confusion.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Toolbar was implemented in v4.0.0\n- Toolbar has new markup and can be invoked with `$('#my-toolbar').toolbar();`\n- Flex Toolbar replaced/deprecated Toolbar in v4.3.0\n- Flex Toolbar has new markup and can be invoked with `$('#my-toolbar').toolbarflex();`\n\n**4.x to 5.x**\n\n- Flex Toolbar is now a custom element `<ids-toolbar></ids-toolbar>`\n- Toolbar Sections are now codified as components `<ids-toolbar-section>`\n- More Actions Buttons are now a codified components `<ids-toolbar-more-actions>`\n- Toolbars now implement `tabbable` to enable use of (Shift)/Tab keys for navigation\n- Toolbar Section behavior is now controlled by attributes (`favor`, `type`, etc) instead of CSS classes.\n- Not including a More Actions button in markup explicitly disables the menu from being displayed.\n- The More Actions button can be configured NOT to automatically show overflow items by omitting its `overflow` attribute.  This allows for pre-defined menu items to be displayed without items being spilled over to the overflow menu.\n"}},{"name":"ids-toolbar-section","description":{"kind":"markdown","value":"# ids-toolbar\n\n## Description\n\nThe Ids Toolbar is used for building highly-configurable Toolbars for sections of your application.  It displays [buttons](../ids-button/README.md), hyperlinks, and other components in different align-able sections, along with contextual information about a workflow or process.\n\nThe Ids Toolbar can also be responsive, intelligently hiding buttons that can't be shown on-screen, and displaying them in an overflow menu.\n\n## Use Cases\n\n- Provides contextual information for a workflow or process displayed on screen\n- Provides access to contextual actions for said workflow/process\n\n## Terminology\n\n- **Section** - Toolbars are divided into sections. Each of these sections has their own alignment style and \"type\" that determines how it fits within the Toolbar.\n- **Item** - Toolbar items are the actionable elements within a toolbar. In general they correspond to standard HTML Elements or other IDS Components, such as buttons, hyperlinks, checkboxes, etc.\n- **More Actions** - This optional element can be applied to Toolbars that contain a significant number of actions that cannot all be displayed on screen at one time. This element contains a menu button that will display any \"spilled-over\" contents from the Toolbar when active, once those actions are no longer visible on the Toolbar.\n\n## Settings (Attributes)\n\n### Toolbar\n\n#### Properties\n\n- `disabled` {Boolean} - Makes the entire toolbar enabled/disabled\n- `hidden` {boolean} - Hides the element from display\n- `padding` {string|number} - Sets padding to the container (in pixels)\n- `tabbable` {Boolean} - Controls toolbar navigation mode. When `true`, all toolbar items can be navigated using Tab/Shift+Tab keys. When `false` (default), uses roving tabindex where only one item is tabbable at a time and arrow keys navigate between items\n- `type` {string} - Sets the toolbar type. Can be `formatter` for formatter-style toolbars\n\n#### Read-only Properties\n\n- `focused` {HTMLElement} - Describes the currently-focused Toolbar item\n- `items` {Array<HTMLElement>} - Provides access to all Toolbar items in all sections\n- `sections` {Array<IdsToolbarSection>} - Provides access to all the Toolbar's sections\n- `separators` {Array<IdsSeparator>} - Provides access to all the Toolbar's separators\n\n### Toolbar Section\n\n- `align` {string} - Determines the alignment of the items within this section\n  - `center` - Center alignment\n  - `center-even` - Center alignment with even spacing\n  - `end` - Right side of the Toolbar in Left-to-Right setup\n  - `start` (default) - Left side of the Toolbar in Left-to-Right setup\n- `favor` {Boolean} - Determines if this section should not shrink/collapse when the size of the entire Toolbar shrinks. This causes the other Toolbar sections to become smaller first\n- `flex-grow` {string} - Controls the CSS flex-grow property of the section. Set to `'0'` to prevent the section from growing and taking up extra space. Useful for keeping sections adjacent to each other\n- `hidden` {boolean} - Hides the element from display\n- `inactive` {Boolean} - If true, makes the toolbar section inactive (takes up space, but items are not visible)\n- `pinnable` {Boolean} - If true, makes the items inside this section `pinnable`\n- `keep-visible` {Boolean} - If true, prevents the section from being auto-hidden when it has no visible children\n- `toolbar-type` {string} - Sets the toolbar type for styling purposes. Can be `formatter` for formatter-style toolbars\n- `type` {string} - Sets a pre-defined type on the toolbar section\n  - `button` - Section for a single button to maintain button's focus state\n  - `buttonset` - Section optimized for containing multiple buttons\n  - `fluid` - Section that fills available space\n  - `more` - Section type for more actions\n  - `search` - Section styled for search functionality\n  - `static` (default) - Basic section with no special styling, static sections will never go into the overflow. They take up as little space as possible and have no special styling. They're basic sections with no predefined behavior.\n  - `title` - Section styled for displaying titles and subtitles\n\n#### Section Read-only Properties\n\n- `items` {Array<Element>} - Provides access to all Toolbar items in this section\n- `pinned` {Array<Element>} - List of items that have the pinned status\n- `separators` {Array<Element>} - List of ids-separator nodes contained by the toolbar section\n- `textElems` {Array<Element>} - List of text nodes contained by the toolbar section\n- `toolbar` {HTMLElement} - Reference to this section's toolbar parent node\n\n#### Supported Item Types\n\nToolbar sections can contain various IDS components:\n\n- [IDS Button](../ids-button/README.md) - Primary action buttons\n- [IDS Checkbox](../ids-checkbox/README.md) - Toggle options\n- [IDS Dropdown](../ids-dropdown/README.md) - Selection dropdowns\n- [IDS Hyperlink](../ids-hyperlink/README.md) - Navigation links\n- [IDS Icon](../ids-icon/README.md) - Visual indicators\n- [IDS Input](../ids-input/README.md) - Text input fields\n- [IDS Separator](../ids-separator/README.md) - Visual dividers\n- [IDS Text](../ids-text/README.md) - Text content\n\n### Toolbar More Actions\n\n- `disabled` {Boolean} - Makes the More Actions menu button disabled/enabled\n- `hidden` {boolean} - Hides the element from display\n- `overflow` {Boolean} - If true, menu items that cannot be displayed in the main Toolbar area due to lack of space will be \"mirrored\" and generated as menu items in a special group inside this menu. Clicking the mirrored menu items will cause the original Toolbar action to be fired. When a [Menu Button](../ids-menu-button/README.md) component is mirrored, its attached menu is also mirrored as a submenu on its generated menu item\n- `toolbar-type` {string} - Sets the toolbar type for styling purposes. Can be `formatter` for formatter-style toolbars\n- `visible` {Boolean} - Controls whether the More Actions menu is displayed/hidden\n\n#### More Actions Read-only Properties\n\n- `button` {IdsMenuButton} - Provides access to the internal [Menu Button component](../ids-menu-button/README.md)\n- `menu` {IdsPopupMenu} - Provides access to the internal [Popup Menu component](../ids-popup-menu/README.md)\n- `menuItems` {Array<IdsMenuItem>} - Get the menu-items inside this IdsToolbarMoreActions\n- `overflowMenuItems` {Array<HTMLElement>} - List of menu items that mirror Toolbar items\n- `pinnableSection` {IdsToolbarSection} - Reference to the `pinnable` section in the toolbar\n- `predefinedMenuItems` {Array<HTMLElement>} - List of manually-defined menu items\n- `toolbar` {HTMLElement} - Reference to this section's toolbar parent node\n- `type` {string} - This component is a standalone toolbar section that always reports `more` for its type\n\n## States and Variations\n\n- **Disabled** - The entire toolbar can be disabled, preventing interaction with all contained items\n- **Tabbable** - Controls keyboard navigation behavior through toolbar items\n\nAside from the Toolbar-level disabled state, all individual Toolbar items are responsible for management of their own state. For more information on these components' states, see their respective documentation:\n\n- [IDS Button States](../ids-button/README.md)\n- [IDS Checkbox States](../ids-checkbox/README.md)\n- [IDS Dropdown States](../ids-dropdown/README.md)\n- [IDS Input States](../ids-input/README.md)\n\n## Features (With Code Examples)\n\nIds Toolbars are comprised of the Toolbar element, an indeterminate number of Toolbar sections, and an optional \"More Actions\" menu button element. Inside of the different toolbar sections, it's possible to place different Ids Components.  Below is a basic example of what an entire Ids Toolbar may look like:\n\n```html\n<ids-toolbar>\n    <ids-toolbar-section type=\"title\">\n        <ids-text type=\"h3\">My Toolbar</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"buttonset\" align=\"end\">\n        <ids-button id=\"button-1\" role=\"button\">\n            <span>Text</span>\n        </ids-button>\n        <ids-button id=\"button-2\">\n            <span class=\"audible\">Settings</span>\n            <ids-icon icon=\"settings\"></ids-icon>\n        </ids-button>\n    </ids-toolbar-section>\n    <ids-toolbar-more-actions>\n        <ids-menu-group>\n            <ids-menu-item value=\"1\">Option One</ids-menu-item>\n            <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n            <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n            <ids-menu-item>More Options\n            <ids-popup-menu>\n                <ids-menu-group>\n                <ids-menu-item value=\"4\">Option Four</ids-menu-item>\n                <ids-menu-item value=\"5\">Option Five</ids-menu-item>\n                <ids-menu-item value=\"6\">Option Six</ids-menu-item>\n                </ids-menu-group>\n            </ids-popup-menu>\n            </ids-menu-item>\n        </ids-menu-group>\n    </ids-toolbar-more-actions>\n</ids-toolbar>\n```\n\n### Sections\n\nToolbar sections can be configured with different \"types\" that can determine their look/feel/function.  By default, the sections do not fill available space and contain no padding.  These are `static` toolbar sections:\n\n```html\n<ids-toolbar-section>\n    <ids-button icon=\"menu\" role=\"button\">\n        <span class=\"audible\">Application Menu Trigger</span>\n    </ids-button>\n</ids-toolbar-section>\n```\n\nFor compatibility with 4.x components Toolbars, the IDS Toolbar also supports `title` and `buttonset` section types that act similarly.  The styling is less rigid than in previous iterations, so to make a `buttonset` section \"right\"-aligned, it's necessary to add the `align=\"end\"` attribute:\n\n```html\n<ids-toolbar-section type=\"title\">\n    <ids-text font-size=\"20\">My Toolbar</ids-text>\n    <ids-text font-size=\"14\">Subtitle</ids-text>\n</ids-toolbar-section>\n<ids-toolbar-section type=\"buttonset\" align=\"end\">\n    <ids-button id=\"button-1\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n    <ids-button id=\"button-2\">\n        <span class=\"audible\">Settings</span>\n        <ids-icon icon=\"settings\"></ids-icon>\n    </ids-button>\n</ids-toolbar-section>\n```\n\n#### Controlling Section Growth with Flex-Grow\n\nTo prevent sections from growing and maintain fixed widths, use the `flex-grow` attribute:\n\n```html\n<ids-toolbar>\n    <ids-toolbar-section>\n        <ids-button icon=\"menu\">\n            <span class=\"audible\">Menu</span>\n        </ids-button>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"title\" flex-grow=\"0\">\n        <ids-text font-size=\"20\">Dashboard</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section>\n        <ids-text>Adjacent text</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"buttonset\" align=\"end\">\n        <ids-button icon=\"settings\">Settings</ids-button>\n    </ids-toolbar-section>\n</ids-toolbar>\n```\n\nIn this example, the title section has `flex-grow=\"0\"` to prevent it from expanding and taking up extra space, keeping sections closer together.\n\nToolbar Title sections can have multiple text elements, if needed:\n\n```html\n<ids-toolbar-section type=\"title\">\n    <ids-text font-size=\"20\">My Toolbar</ids-text>\n    <ids-text font-size=\"14\">Subtitle</ids-text>\n</ids-toolbar-section>\n\n<!-- or... -->\n\n<ids-toolbar-section type=\"title\">\n    <ids-text font-size=\"20\">My Toolbar</ids-text>\n</ids-toolbar-section>\n```\n\nToolbar Button Set sections can contain an indeterminate number of components.  Generally these are [Buttons](../ids-button/README.md), but other component types such as Hyperlinks and some Pickers are accepted.  The Button Set Section is styled with CSS to prevent the wrapping of these elements to multiple lines, instead cutting off actions that don't fit.\n\n```html\n<ids-toolbar-section type=\"buttonset\" align=\"end\">\n    <ids-button id=\"button-1\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n    <ids-button id=\"button-2\">\n        <span class=\"audible\">Settings</span>\n        <ids-icon icon=\"settings\"></ids-icon>\n    </ids-button>\n    <ids-button id=\"button-3\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n    <ids-button id=\"button-4\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n</ids-toolbar-section>\n```\n\nToolbars can also contain sections that are meant to be customized with CSS.  It's possible to create custom static sections with the `static` type, but if you want to make a custom section that fills available space, use the `fluid` type:\n\n```html\n<ids-toolbar>\n    <!-- takes up as little space as possible --->\n    <ids-toolbar-section type=\"static\">\n        <ids-button id=\"button-1\" role=\"button\">\n            <span>Button 1</span>\n        </ids-button>\n    </ids-toolbar-section>\n\n    <!-- fills the rest of the toolbar space -->\n    <ids-toolbar-section type=\"fluid\" align=\"end\">\n        <ids-button id=\"button-2\" role=\"button\">\n            <span>Button 2</span>\n        </ids-button>\n    </ids-toolbar-section>\n<ids-toolbar>\n```\n\nThe toolbar can be set as the formatter styles:\n\n```html\n<ids-toolbar type=\"formatter\">\n  <ids-toolbar-section type=\"buttonset\">\n    <ids-button id=\"button-1\" role=\"button\">\n      <span>Button 1</span>\n    </ids-button>\n    <ids-separator vertical></ids-separator>\n    <ids-button id=\"button-2\" role=\"button\">\n      <span>Button 2</span>\n    </ids-button>\n  </ids-toolbar-section>\n<ids-toolbar>\n```\n\n#### Pinned Buttons in Section\n\nA toolbar section can be set to `pinnable`. This allows all its child elements to be pinned or unpinned. A pinned element means it will show on the toolbar, while an unpinned element will not show in the toolbar.\n\nThe More Actions button will be needed to access the feature of pinning and unpinning elements.\n\n```html\n<ids-toolbar-section type=\"buttonset\" align=\"end\" pinnable>\n    <ids-button id=\"pin-1\" role=\"button\" no-padding>\n        <span>Pin 1</span>\n    </ids-button>\n    <ids-button id=\"pin-2\" role=\"button\" no-padding>\n        <span>Pin 2</span>\n    </ids-button>\n    <ids-button id=\"pin-3\" role=\"button\" no-padding>\n        <span>Pin 3</span>\n    </ids-button>\n</ids-toolbar-section>\n```\n\n### More Actions Button\n\nOptionally, toolbars can contain a \"More Actions\" Button, which is a [Menu Button]('../ids-menu-button/README.md) wrapped inside a special Toolbar Section.  This component's purpose is to provide ansulary actions that are related to your Toolbar's primary actions, but don't necessarily need to be readily available on a single click.  In responsive settings with many primary actions present, the Toolbar will collapse any actions that don't fit within its boundaries.  Optionally, the More Actions menu can display these collapsed actions at the top of its menu (also referred to as the \"overflow\" menu).\n\n#### Auto-Hiding Empty Sections\n\nToolbar sections that have no visible children are automatically hidden by adding an `empty` CSS class. This prevents empty sections from taking up space in the toolbar layout. The `empty` class is evaluated on initialization and when children are added or removed.\n\n- On initialization, if a section has no visible children, the `empty` class is added and the section is hidden.\n- When a child element is added to an empty section, the `empty` class is removed and the section becomes visible.\n- When all children are removed from a section that was initially populated, the `empty` class is not re-added.\n\n#### Persistent Sections\n\nTo prevent a section from being auto-hidden even when it has no visible children, use the `keep-visible` attribute. This is useful for sections that may be populated dynamically after initialization.\n\n```html\n<ids-toolbar-section type=\"buttonset\" keep-visible>\n    <!-- Items will be added dynamically -->\n</ids-toolbar-section>\n```\n\nSetting `keep-visible` dynamically will remove the `empty` class if present. Removing `keep-visible` will re-evaluate whether the section should be hidden based on its current children.\n\nThe Ids Toolbar More Actions component sits alongside the other toolbar sections, and contains a single slot that takes the same types of elements as a standard [Ids Popup Menu](../ids-popup-menu/README.md):\n\n```html\n<ids-toolbar-more-actions>\n    <ids-menu-group>\n        <ids-menu-item value=\"1\">Option One</ids-menu-item>\n        <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n        <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n        <ids-menu-item>More Options\n        <ids-popup-menu>\n            <ids-menu-group>\n            <ids-menu-item value=\"4\">Option Four</ids-menu-item>\n            <ids-menu-item value=\"5\">Option Five</ids-menu-item>\n            <ids-menu-item value=\"6\">Option Six</ids-menu-item>\n            </ids-menu-group>\n        </ids-popup-menu>\n        </ids-menu-item>\n    </ids-menu-group>\n</ids-toolbar-more-actions>\n```\n\nIf accompanied by a More Actions button with the `overflow` attribute set, Toolbar Actions that don't fit within their sections will be hidden in the Toolbar, but will also \"spill over\" into the More Actions menu, inside a special `IdsMenuGroup` with a `more-actions` attribute.  If a user clicks on one of the menu items that reflects a Toolbar element, the Toolbar element will also be \"clicked\".  This allows visually-hidden Toolbar actions to still remain available in responsive settings.\n\n```html\n<ids-toolbar-more-actions overflow>\n    <!--\n        Toolbar Items will be mirrored here inside a group that looks like:\n        <ids-menu-group more-actions>\n            <ids-menu-item>Text</ids-menu-item>\n            <ids-menu-item icon=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item>Text</ids-menu-item>\n            <ids-menu-item>Text</ids-menu-item>\n        </ids-menu-group>\n    --->\n    <ids-menu-group>\n        <ids-menu-item value=\"1\">Option One</ids-menu-item>\n        <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n        <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n    </ids-menu-group>\n</ids-toolbar-more-actions>\n```\n\n### API Access\n\nAt the Toolbar level, it's possible to access all Items and Sections:\n\n```js\nconst items = document.querySelector('ids-toolbar').items;\nconst sections = document.querySelector('ids-toolbar').sections;\n```\n\nWithin each section, it's possible to access the section's items:\n\n```js\nconst items = document.querySelector('ids-toolbar-section').items;\n```\n\nWhen dealing with a More Actions button, its inner components' APIs are exposed:\n\n```js\nconst moreActionsButtonEl = document.querySelector('ids-toolbar-more-actions').button;\nconst moreActionsMenuEl = document.querySelector('ids-toolbar-more-actions').menu;\n```\n\nAccess to the different More Actions menu items is also exposed:\n\n```js\n// These items are defined inside the `<ids-toolbar-more-actions>` element's default slot.\nconst predefinedMenuItems = document.querySelector('ids-toolbar-more-actions').predefinedMenuItems;\n\n// These items are generated by the More Actions menu if the `overflow` attribute is set.\n// These items mirror the regular Toolbar elements.\nconst overflowMenuItems = document.querySelector('ids-toolbar-more-actions').overflowMenuItems;\n```\n\nOverflow menu items also provide a reference to their corresponding Toolbar element:\n\n```js\nconst overflowMenuItems = document.querySelector('ids-toolbar-more-actions').overflowMenuItems;\noverflowMenuItems.forEach((item) => {\n  console.info(item.overflowTarget); // <-- Points to the Toolbar button/element/etc\n});\n```\n\n### Events\n\nAll elements inside the Toolbar will fire a `selected` event when clicked.  The `selected` event from the More Actions menu's [IdsPopupMenu]('../ids-popup-menu/README.md) is converted into a Toolbar-compatible event automatically, so only one listener at the Toolbar level is needed:\n\n```js\nconst toolbarEl = document.querySelector('#my-toolbar');\ntoolbarEl.addEventListener('selected', (e) => {\n  console.info(e.detail); // Provides data about the originating element, and overflow status, if applicable\n}\n```\n\n## Keyboard Guidelines\n\nThe IDS Button doesn't contain any interactions beyond a standard HTMLButtonElement:\n\n- <kbd>Enter</kbd> keys selects a toolbar action and executes the action.  On menu buttons, the menu is activated/hidden, and an action is not executed until one of its menu items is selected.\n- <kbd>Left/Right Arrow</kbd> keys navigate the available toolbar items.\n- <kbd>Tab</kbd> or <kbd>Shift</kbd>/<kbd>Tab<kbd> keys cause navigation to occur.  When `tabbable`, using Tab/Shift+Tab causes navigation between Toolbar items. Navigation away from the toolbar will occur to the element after/before the Toolbar respectively.\n\n## Responsive Guidelines\n\n- Try not to provide an over-abundance of Toolbar Actions.  The Toolbar's intention is to provide contextual actions for a specific workflow. Providing too many actions can cause end-user confusion.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Toolbar was implemented in v4.0.0\n- Toolbar has new markup and can be invoked with `$('#my-toolbar').toolbar();`\n- Flex Toolbar replaced/deprecated Toolbar in v4.3.0\n- Flex Toolbar has new markup and can be invoked with `$('#my-toolbar').toolbarflex();`\n\n**4.x to 5.x**\n\n- Flex Toolbar is now a custom element `<ids-toolbar></ids-toolbar>`\n- Toolbar Sections are now codified as components `<ids-toolbar-section>`\n- More Actions Buttons are now a codified components `<ids-toolbar-more-actions>`\n- Toolbars now implement `tabbable` to enable use of (Shift)/Tab keys for navigation\n- Toolbar Section behavior is now controlled by attributes (`favor`, `type`, etc) instead of CSS classes.\n- Not including a More Actions button in markup explicitly disables the menu from being displayed.\n- The More Actions button can be configured NOT to automatically show overflow items by omitting its `overflow` attribute.  This allows for pre-defined menu items to be displayed without items being spilled over to the overflow menu.\n"}},{"name":"ids-toolbar","attributes":[{"name":"#resize-observer","description":"Watches for Toolbar size changes","values":[]},{"name":"#mutation-observer","description":"Watches for DOM changes in tabs","values":[]},{"name":"#is-refreshing","description":"Flag to prevent recursive calls during overflow refresh","values":[]},{"name":"disabled","description":"Set all buttons to disabled on the toolbar","values":[]},{"name":"buttons","description":"Gets the buttons in the toolbar","values":[]},{"name":"focused","values":[]},{"name":"items","values":[]},{"name":"text-elems","values":[]},{"name":"separators","values":[]},{"name":"sections","values":[]},{"name":"tabbable","description":"If true, sets the Toolbar mode to allow ALL items to have a usable tabIndex.\nDefault is false, which means one Toolbar element is focusable at a time.","values":[]},{"name":"type","description":"Set the toolbar type","values":[]},{"name":"padding","description":"If set to number the container will have padding added (in pixels)","values":[]}],"description":{"kind":"markdown","value":"# ids-toolbar\n\n## Description\n\nThe Ids Toolbar is used for building highly-configurable Toolbars for sections of your application.  It displays [buttons](../ids-button/README.md), hyperlinks, and other components in different align-able sections, along with contextual information about a workflow or process.\n\nThe Ids Toolbar can also be responsive, intelligently hiding buttons that can't be shown on-screen, and displaying them in an overflow menu.\n\n## Use Cases\n\n- Provides contextual information for a workflow or process displayed on screen\n- Provides access to contextual actions for said workflow/process\n\n## Terminology\n\n- **Section** - Toolbars are divided into sections. Each of these sections has their own alignment style and \"type\" that determines how it fits within the Toolbar.\n- **Item** - Toolbar items are the actionable elements within a toolbar. In general they correspond to standard HTML Elements or other IDS Components, such as buttons, hyperlinks, checkboxes, etc.\n- **More Actions** - This optional element can be applied to Toolbars that contain a significant number of actions that cannot all be displayed on screen at one time. This element contains a menu button that will display any \"spilled-over\" contents from the Toolbar when active, once those actions are no longer visible on the Toolbar.\n\n## Settings (Attributes)\n\n### Toolbar\n\n#### Properties\n\n- `disabled` {Boolean} - Makes the entire toolbar enabled/disabled\n- `hidden` {boolean} - Hides the element from display\n- `padding` {string|number} - Sets padding to the container (in pixels)\n- `tabbable` {Boolean} - Controls toolbar navigation mode. When `true`, all toolbar items can be navigated using Tab/Shift+Tab keys. When `false` (default), uses roving tabindex where only one item is tabbable at a time and arrow keys navigate between items\n- `type` {string} - Sets the toolbar type. Can be `formatter` for formatter-style toolbars\n\n#### Read-only Properties\n\n- `focused` {HTMLElement} - Describes the currently-focused Toolbar item\n- `items` {Array<HTMLElement>} - Provides access to all Toolbar items in all sections\n- `sections` {Array<IdsToolbarSection>} - Provides access to all the Toolbar's sections\n- `separators` {Array<IdsSeparator>} - Provides access to all the Toolbar's separators\n\n### Toolbar Section\n\n- `align` {string} - Determines the alignment of the items within this section\n  - `center` - Center alignment\n  - `center-even` - Center alignment with even spacing\n  - `end` - Right side of the Toolbar in Left-to-Right setup\n  - `start` (default) - Left side of the Toolbar in Left-to-Right setup\n- `favor` {Boolean} - Determines if this section should not shrink/collapse when the size of the entire Toolbar shrinks. This causes the other Toolbar sections to become smaller first\n- `flex-grow` {string} - Controls the CSS flex-grow property of the section. Set to `'0'` to prevent the section from growing and taking up extra space. Useful for keeping sections adjacent to each other\n- `hidden` {boolean} - Hides the element from display\n- `inactive` {Boolean} - If true, makes the toolbar section inactive (takes up space, but items are not visible)\n- `pinnable` {Boolean} - If true, makes the items inside this section `pinnable`\n- `keep-visible` {Boolean} - If true, prevents the section from being auto-hidden when it has no visible children\n- `toolbar-type` {string} - Sets the toolbar type for styling purposes. Can be `formatter` for formatter-style toolbars\n- `type` {string} - Sets a pre-defined type on the toolbar section\n  - `button` - Section for a single button to maintain button's focus state\n  - `buttonset` - Section optimized for containing multiple buttons\n  - `fluid` - Section that fills available space\n  - `more` - Section type for more actions\n  - `search` - Section styled for search functionality\n  - `static` (default) - Basic section with no special styling, static sections will never go into the overflow. They take up as little space as possible and have no special styling. They're basic sections with no predefined behavior.\n  - `title` - Section styled for displaying titles and subtitles\n\n#### Section Read-only Properties\n\n- `items` {Array<Element>} - Provides access to all Toolbar items in this section\n- `pinned` {Array<Element>} - List of items that have the pinned status\n- `separators` {Array<Element>} - List of ids-separator nodes contained by the toolbar section\n- `textElems` {Array<Element>} - List of text nodes contained by the toolbar section\n- `toolbar` {HTMLElement} - Reference to this section's toolbar parent node\n\n#### Supported Item Types\n\nToolbar sections can contain various IDS components:\n\n- [IDS Button](../ids-button/README.md) - Primary action buttons\n- [IDS Checkbox](../ids-checkbox/README.md) - Toggle options\n- [IDS Dropdown](../ids-dropdown/README.md) - Selection dropdowns\n- [IDS Hyperlink](../ids-hyperlink/README.md) - Navigation links\n- [IDS Icon](../ids-icon/README.md) - Visual indicators\n- [IDS Input](../ids-input/README.md) - Text input fields\n- [IDS Separator](../ids-separator/README.md) - Visual dividers\n- [IDS Text](../ids-text/README.md) - Text content\n\n### Toolbar More Actions\n\n- `disabled` {Boolean} - Makes the More Actions menu button disabled/enabled\n- `hidden` {boolean} - Hides the element from display\n- `overflow` {Boolean} - If true, menu items that cannot be displayed in the main Toolbar area due to lack of space will be \"mirrored\" and generated as menu items in a special group inside this menu. Clicking the mirrored menu items will cause the original Toolbar action to be fired. When a [Menu Button](../ids-menu-button/README.md) component is mirrored, its attached menu is also mirrored as a submenu on its generated menu item\n- `toolbar-type` {string} - Sets the toolbar type for styling purposes. Can be `formatter` for formatter-style toolbars\n- `visible` {Boolean} - Controls whether the More Actions menu is displayed/hidden\n\n#### More Actions Read-only Properties\n\n- `button` {IdsMenuButton} - Provides access to the internal [Menu Button component](../ids-menu-button/README.md)\n- `menu` {IdsPopupMenu} - Provides access to the internal [Popup Menu component](../ids-popup-menu/README.md)\n- `menuItems` {Array<IdsMenuItem>} - Get the menu-items inside this IdsToolbarMoreActions\n- `overflowMenuItems` {Array<HTMLElement>} - List of menu items that mirror Toolbar items\n- `pinnableSection` {IdsToolbarSection} - Reference to the `pinnable` section in the toolbar\n- `predefinedMenuItems` {Array<HTMLElement>} - List of manually-defined menu items\n- `toolbar` {HTMLElement} - Reference to this section's toolbar parent node\n- `type` {string} - This component is a standalone toolbar section that always reports `more` for its type\n\n## States and Variations\n\n- **Disabled** - The entire toolbar can be disabled, preventing interaction with all contained items\n- **Tabbable** - Controls keyboard navigation behavior through toolbar items\n\nAside from the Toolbar-level disabled state, all individual Toolbar items are responsible for management of their own state. For more information on these components' states, see their respective documentation:\n\n- [IDS Button States](../ids-button/README.md)\n- [IDS Checkbox States](../ids-checkbox/README.md)\n- [IDS Dropdown States](../ids-dropdown/README.md)\n- [IDS Input States](../ids-input/README.md)\n\n## Features (With Code Examples)\n\nIds Toolbars are comprised of the Toolbar element, an indeterminate number of Toolbar sections, and an optional \"More Actions\" menu button element. Inside of the different toolbar sections, it's possible to place different Ids Components.  Below is a basic example of what an entire Ids Toolbar may look like:\n\n```html\n<ids-toolbar>\n    <ids-toolbar-section type=\"title\">\n        <ids-text type=\"h3\">My Toolbar</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"buttonset\" align=\"end\">\n        <ids-button id=\"button-1\" role=\"button\">\n            <span>Text</span>\n        </ids-button>\n        <ids-button id=\"button-2\">\n            <span class=\"audible\">Settings</span>\n            <ids-icon icon=\"settings\"></ids-icon>\n        </ids-button>\n    </ids-toolbar-section>\n    <ids-toolbar-more-actions>\n        <ids-menu-group>\n            <ids-menu-item value=\"1\">Option One</ids-menu-item>\n            <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n            <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n            <ids-menu-item>More Options\n            <ids-popup-menu>\n                <ids-menu-group>\n                <ids-menu-item value=\"4\">Option Four</ids-menu-item>\n                <ids-menu-item value=\"5\">Option Five</ids-menu-item>\n                <ids-menu-item value=\"6\">Option Six</ids-menu-item>\n                </ids-menu-group>\n            </ids-popup-menu>\n            </ids-menu-item>\n        </ids-menu-group>\n    </ids-toolbar-more-actions>\n</ids-toolbar>\n```\n\n### Sections\n\nToolbar sections can be configured with different \"types\" that can determine their look/feel/function.  By default, the sections do not fill available space and contain no padding.  These are `static` toolbar sections:\n\n```html\n<ids-toolbar-section>\n    <ids-button icon=\"menu\" role=\"button\">\n        <span class=\"audible\">Application Menu Trigger</span>\n    </ids-button>\n</ids-toolbar-section>\n```\n\nFor compatibility with 4.x components Toolbars, the IDS Toolbar also supports `title` and `buttonset` section types that act similarly.  The styling is less rigid than in previous iterations, so to make a `buttonset` section \"right\"-aligned, it's necessary to add the `align=\"end\"` attribute:\n\n```html\n<ids-toolbar-section type=\"title\">\n    <ids-text font-size=\"20\">My Toolbar</ids-text>\n    <ids-text font-size=\"14\">Subtitle</ids-text>\n</ids-toolbar-section>\n<ids-toolbar-section type=\"buttonset\" align=\"end\">\n    <ids-button id=\"button-1\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n    <ids-button id=\"button-2\">\n        <span class=\"audible\">Settings</span>\n        <ids-icon icon=\"settings\"></ids-icon>\n    </ids-button>\n</ids-toolbar-section>\n```\n\n#### Controlling Section Growth with Flex-Grow\n\nTo prevent sections from growing and maintain fixed widths, use the `flex-grow` attribute:\n\n```html\n<ids-toolbar>\n    <ids-toolbar-section>\n        <ids-button icon=\"menu\">\n            <span class=\"audible\">Menu</span>\n        </ids-button>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"title\" flex-grow=\"0\">\n        <ids-text font-size=\"20\">Dashboard</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section>\n        <ids-text>Adjacent text</ids-text>\n    </ids-toolbar-section>\n    <ids-toolbar-section type=\"buttonset\" align=\"end\">\n        <ids-button icon=\"settings\">Settings</ids-button>\n    </ids-toolbar-section>\n</ids-toolbar>\n```\n\nIn this example, the title section has `flex-grow=\"0\"` to prevent it from expanding and taking up extra space, keeping sections closer together.\n\nToolbar Title sections can have multiple text elements, if needed:\n\n```html\n<ids-toolbar-section type=\"title\">\n    <ids-text font-size=\"20\">My Toolbar</ids-text>\n    <ids-text font-size=\"14\">Subtitle</ids-text>\n</ids-toolbar-section>\n\n<!-- or... -->\n\n<ids-toolbar-section type=\"title\">\n    <ids-text font-size=\"20\">My Toolbar</ids-text>\n</ids-toolbar-section>\n```\n\nToolbar Button Set sections can contain an indeterminate number of components.  Generally these are [Buttons](../ids-button/README.md), but other component types such as Hyperlinks and some Pickers are accepted.  The Button Set Section is styled with CSS to prevent the wrapping of these elements to multiple lines, instead cutting off actions that don't fit.\n\n```html\n<ids-toolbar-section type=\"buttonset\" align=\"end\">\n    <ids-button id=\"button-1\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n    <ids-button id=\"button-2\">\n        <span class=\"audible\">Settings</span>\n        <ids-icon icon=\"settings\"></ids-icon>\n    </ids-button>\n    <ids-button id=\"button-3\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n    <ids-button id=\"button-4\" role=\"button\">\n        <span>Text</span>\n    </ids-button>\n</ids-toolbar-section>\n```\n\nToolbars can also contain sections that are meant to be customized with CSS.  It's possible to create custom static sections with the `static` type, but if you want to make a custom section that fills available space, use the `fluid` type:\n\n```html\n<ids-toolbar>\n    <!-- takes up as little space as possible --->\n    <ids-toolbar-section type=\"static\">\n        <ids-button id=\"button-1\" role=\"button\">\n            <span>Button 1</span>\n        </ids-button>\n    </ids-toolbar-section>\n\n    <!-- fills the rest of the toolbar space -->\n    <ids-toolbar-section type=\"fluid\" align=\"end\">\n        <ids-button id=\"button-2\" role=\"button\">\n            <span>Button 2</span>\n        </ids-button>\n    </ids-toolbar-section>\n<ids-toolbar>\n```\n\nThe toolbar can be set as the formatter styles:\n\n```html\n<ids-toolbar type=\"formatter\">\n  <ids-toolbar-section type=\"buttonset\">\n    <ids-button id=\"button-1\" role=\"button\">\n      <span>Button 1</span>\n    </ids-button>\n    <ids-separator vertical></ids-separator>\n    <ids-button id=\"button-2\" role=\"button\">\n      <span>Button 2</span>\n    </ids-button>\n  </ids-toolbar-section>\n<ids-toolbar>\n```\n\n#### Pinned Buttons in Section\n\nA toolbar section can be set to `pinnable`. This allows all its child elements to be pinned or unpinned. A pinned element means it will show on the toolbar, while an unpinned element will not show in the toolbar.\n\nThe More Actions button will be needed to access the feature of pinning and unpinning elements.\n\n```html\n<ids-toolbar-section type=\"buttonset\" align=\"end\" pinnable>\n    <ids-button id=\"pin-1\" role=\"button\" no-padding>\n        <span>Pin 1</span>\n    </ids-button>\n    <ids-button id=\"pin-2\" role=\"button\" no-padding>\n        <span>Pin 2</span>\n    </ids-button>\n    <ids-button id=\"pin-3\" role=\"button\" no-padding>\n        <span>Pin 3</span>\n    </ids-button>\n</ids-toolbar-section>\n```\n\n### More Actions Button\n\nOptionally, toolbars can contain a \"More Actions\" Button, which is a [Menu Button]('../ids-menu-button/README.md) wrapped inside a special Toolbar Section.  This component's purpose is to provide ansulary actions that are related to your Toolbar's primary actions, but don't necessarily need to be readily available on a single click.  In responsive settings with many primary actions present, the Toolbar will collapse any actions that don't fit within its boundaries.  Optionally, the More Actions menu can display these collapsed actions at the top of its menu (also referred to as the \"overflow\" menu).\n\n#### Auto-Hiding Empty Sections\n\nToolbar sections that have no visible children are automatically hidden by adding an `empty` CSS class. This prevents empty sections from taking up space in the toolbar layout. The `empty` class is evaluated on initialization and when children are added or removed.\n\n- On initialization, if a section has no visible children, the `empty` class is added and the section is hidden.\n- When a child element is added to an empty section, the `empty` class is removed and the section becomes visible.\n- When all children are removed from a section that was initially populated, the `empty` class is not re-added.\n\n#### Persistent Sections\n\nTo prevent a section from being auto-hidden even when it has no visible children, use the `keep-visible` attribute. This is useful for sections that may be populated dynamically after initialization.\n\n```html\n<ids-toolbar-section type=\"buttonset\" keep-visible>\n    <!-- Items will be added dynamically -->\n</ids-toolbar-section>\n```\n\nSetting `keep-visible` dynamically will remove the `empty` class if present. Removing `keep-visible` will re-evaluate whether the section should be hidden based on its current children.\n\nThe Ids Toolbar More Actions component sits alongside the other toolbar sections, and contains a single slot that takes the same types of elements as a standard [Ids Popup Menu](../ids-popup-menu/README.md):\n\n```html\n<ids-toolbar-more-actions>\n    <ids-menu-group>\n        <ids-menu-item value=\"1\">Option One</ids-menu-item>\n        <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n        <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n        <ids-menu-item>More Options\n        <ids-popup-menu>\n            <ids-menu-group>\n            <ids-menu-item value=\"4\">Option Four</ids-menu-item>\n            <ids-menu-item value=\"5\">Option Five</ids-menu-item>\n            <ids-menu-item value=\"6\">Option Six</ids-menu-item>\n            </ids-menu-group>\n        </ids-popup-menu>\n        </ids-menu-item>\n    </ids-menu-group>\n</ids-toolbar-more-actions>\n```\n\nIf accompanied by a More Actions button with the `overflow` attribute set, Toolbar Actions that don't fit within their sections will be hidden in the Toolbar, but will also \"spill over\" into the More Actions menu, inside a special `IdsMenuGroup` with a `more-actions` attribute.  If a user clicks on one of the menu items that reflects a Toolbar element, the Toolbar element will also be \"clicked\".  This allows visually-hidden Toolbar actions to still remain available in responsive settings.\n\n```html\n<ids-toolbar-more-actions overflow>\n    <!--\n        Toolbar Items will be mirrored here inside a group that looks like:\n        <ids-menu-group more-actions>\n            <ids-menu-item>Text</ids-menu-item>\n            <ids-menu-item icon=\"settings\">Settings</ids-menu-item>\n            <ids-menu-item>Text</ids-menu-item>\n            <ids-menu-item>Text</ids-menu-item>\n        </ids-menu-group>\n    --->\n    <ids-menu-group>\n        <ids-menu-item value=\"1\">Option One</ids-menu-item>\n        <ids-menu-item value=\"2\">Option Two</ids-menu-item>\n        <ids-menu-item value=\"3\">Option Three</ids-menu-item>\n    </ids-menu-group>\n</ids-toolbar-more-actions>\n```\n\n### API Access\n\nAt the Toolbar level, it's possible to access all Items and Sections:\n\n```js\nconst items = document.querySelector('ids-toolbar').items;\nconst sections = document.querySelector('ids-toolbar').sections;\n```\n\nWithin each section, it's possible to access the section's items:\n\n```js\nconst items = document.querySelector('ids-toolbar-section').items;\n```\n\nWhen dealing with a More Actions button, its inner components' APIs are exposed:\n\n```js\nconst moreActionsButtonEl = document.querySelector('ids-toolbar-more-actions').button;\nconst moreActionsMenuEl = document.querySelector('ids-toolbar-more-actions').menu;\n```\n\nAccess to the different More Actions menu items is also exposed:\n\n```js\n// These items are defined inside the `<ids-toolbar-more-actions>` element's default slot.\nconst predefinedMenuItems = document.querySelector('ids-toolbar-more-actions').predefinedMenuItems;\n\n// These items are generated by the More Actions menu if the `overflow` attribute is set.\n// These items mirror the regular Toolbar elements.\nconst overflowMenuItems = document.querySelector('ids-toolbar-more-actions').overflowMenuItems;\n```\n\nOverflow menu items also provide a reference to their corresponding Toolbar element:\n\n```js\nconst overflowMenuItems = document.querySelector('ids-toolbar-more-actions').overflowMenuItems;\noverflowMenuItems.forEach((item) => {\n  console.info(item.overflowTarget); // <-- Points to the Toolbar button/element/etc\n});\n```\n\n### Events\n\nAll elements inside the Toolbar will fire a `selected` event when clicked.  The `selected` event from the More Actions menu's [IdsPopupMenu]('../ids-popup-menu/README.md) is converted into a Toolbar-compatible event automatically, so only one listener at the Toolbar level is needed:\n\n```js\nconst toolbarEl = document.querySelector('#my-toolbar');\ntoolbarEl.addEventListener('selected', (e) => {\n  console.info(e.detail); // Provides data about the originating element, and overflow status, if applicable\n}\n```\n\n## Keyboard Guidelines\n\nThe IDS Button doesn't contain any interactions beyond a standard HTMLButtonElement:\n\n- <kbd>Enter</kbd> keys selects a toolbar action and executes the action.  On menu buttons, the menu is activated/hidden, and an action is not executed until one of its menu items is selected.\n- <kbd>Left/Right Arrow</kbd> keys navigate the available toolbar items.\n- <kbd>Tab</kbd> or <kbd>Shift</kbd>/<kbd>Tab<kbd> keys cause navigation to occur.  When `tabbable`, using Tab/Shift+Tab causes navigation between Toolbar items. Navigation away from the toolbar will occur to the element after/before the Toolbar respectively.\n\n## Responsive Guidelines\n\n- Try not to provide an over-abundance of Toolbar Actions.  The Toolbar's intention is to provide contextual actions for a specific workflow. Providing too many actions can cause end-user confusion.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Toolbar was implemented in v4.0.0\n- Toolbar has new markup and can be invoked with `$('#my-toolbar').toolbar();`\n- Flex Toolbar replaced/deprecated Toolbar in v4.3.0\n- Flex Toolbar has new markup and can be invoked with `$('#my-toolbar').toolbarflex();`\n\n**4.x to 5.x**\n\n- Flex Toolbar is now a custom element `<ids-toolbar></ids-toolbar>`\n- Toolbar Sections are now codified as components `<ids-toolbar-section>`\n- More Actions Buttons are now a codified components `<ids-toolbar-more-actions>`\n- Toolbars now implement `tabbable` to enable use of (Shift)/Tab keys for navigation\n- Toolbar Section behavior is now controlled by attributes (`favor`, `type`, etc) instead of CSS classes.\n- Not including a More Actions button in markup explicitly disables the menu from being displayed.\n- The More Actions button can be configured NOT to automatically show overflow items by omitting its `overflow` attribute.  This allows for pre-defined menu items to be displayed without items being spilled over to the overflow menu.\n"}},{"name":"ids-tooltip","attributes":[{"name":"popup","values":[]},{"name":"before-show","description":"Get the before show function","values":[]},{"name":"delay","description":"Set how long after hover you should delay before showing","values":[]},{"name":"placement","description":"Sets the tooltip placement between left, right, top, bottom, center","values":[]},{"name":"target","description":"Set the target element for the tooltip","values":[]},{"name":"trigger","description":"Set trigger agains the target between hover, click and focus","values":[]},{"name":"show-on-focus","description":"Set show behavior on focus event","values":[]},{"name":"min-width","description":"Set the minimum width of the tooltip","values":[]},{"name":"max-width","description":"Set the maximum width of the tooltip","values":[]},{"name":"offset-container","description":"Gets offset container if any","values":[]},{"name":"visible","description":"Set tooltip immediately to visible/invisible","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-tooltip\n\n## Description\n\nTooltips are a component thats used in conjunction with other components to show additional information and non critical information related to an element such as a button or field. A tooltip will displays information on either hover, tab and/or focus. In this version we have separated the tooltip from popups.\n\n## Use Cases\n\n- Displays additional non critical information thats not discernible from the interface/design.\n\n## Terminology\n\n- **Popup**: Any thing that popups up and positions use the ids-popup component\n- **Tooltip**: A message which appears when a cursor is positioned over an icon, image, hyperlink, or other element in a graphical user interface.\n\n## Features (With Code Examples)\n\nA normal tooltip used as a web component attached to a button.\n\n```html\n<ids-button id=\"button-1\">Example Button</ids-button>\n<ids-tooltip target=\"button-1\" placement=\"top\">Additional Information</ids-tooltip>\n```\n\nA tooltip can also be used more conveniently for text only tooltips on inputs and buttons as a mixin.\n\n```html\n<ids-button id=\"button-1\" tooltip=\"Additional Information\">Example Button</ids-button>\n```\n\nA tooltips content can be set in a synchronous way with the textContent attribute.\n\n```js\ndocument.querySelector('#button-1').textContent = 'New Content';\n```\n\nA tooltips content can be set in an synchronous way with the beforeShow property.\n\n```js\nconst dropdownAsync = document.querySelector('#dropdown-7');\n\ndropdownAsync.beforeShow = async function beforeShow() {\n  const url = '/data/bikes.json';\n  const res = await fetch(url);\n  const data = await res.json();\n  return data[1].manufacturerName;\n};\n```\n\nA tooltips can be manually set to visible, but it still needs an alignment target to do so.\n\n```js\ndocument.querySelector('#button-1').visible = true;\n```\n\nA tooltips can set the minimum and maximum width of a tooltip using `min-width` and `max-width` attributes. This allows you to control the size of the tooltip to better fit your design requirements. You can use pixels or percentage values for these settings.\n\nIn this example, the tooltip will have a minimum width of 150px and a maximum width of 300px.\n\n```html\n<ids-button id=\"button-2\">Example Button with Width Constraints</ids-button>\n<ids-tooltip target=\"button-2\" placement=\"top\" min-width=\"150px\" max-width=\"300px\">\n  Additional Information with Width Constraints\n</ids-tooltip>\n```\n\nYou can also set the `min-width` and `max-width` properties programmatically.\n\n```js\nconst tooltip = document.querySelector('ids-tooltip');\ntooltip.minWidth = '150px';\ntooltip.maxWidth = '300px';\n```\n\n## Usage Guidance\n\n- Do not show critical information in a tooltip or use it for functionality, it should be strictly for supplemental information\n- Write concise tooltip text. Imagine someone on a small screen or with high zoom needing to pan around just to read the tooltip.\n- Avoid rich content. Formatting such as bold text, italics, headings, icons, etc. will not be conveyed through `aria-describedby` or `aria-labelledby`.\n- No interactive content. Any interactive content such as links or buttons should not be placed within a tooltip.\n\n## Settings and Attributes\n\n- `delay` {string | number} Set how long after hover you should delay before showing\n- `placement` {string} Sets the tooltip placement between left, right, top, bottom\n- `target` {string | HTMLElement} Set the target element via a css selector or HTMLElement\n- `trigger` {string} Set trigger agains the target between hover, click and focus\n- `visible` {string | boolean} Set tooltip immediately to visible/invisible\n- `min-width` {string} Set the minimum width of the tooltip in pixels or percentage\n- `max-width` {string} Set the maximum width of the tooltip in pixels or percentage\n\n## Events\n\n- `beforeshow` Fires just before the tooltip is shown (veto-able if returning false from the detail event)\n- `show` Fires at the time the ids-tooltip is shown\n- `aftershow` Fires after the tooltip is fully shown\n- `hide` Fires at the time the ids-tooltip is trying  to hide\n- `afterhide` Fires after the tooltip is fully hidden\n\n## Callbacks\n\n- `onHide` Fires when the tooltip is hidden\n\n## Themeable Parts\n\n- `popup` allows you to further style the popup container element\n- `tooltip` allows you to further style the tooltip element\n\n## States and Variations (With Code Examples)\n\n- Color\n- Open\n- Closed\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: If the element tooltip is showing on focus then this will cause the tooltip to appear.\n\n## Responsive Guidelines\n\n- Tooltips do not work well in mobile or in responsive situations and should be avoided. But the tooltip will attempt to adjust to fit the page as the popup menu allows.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tooltips were implemented in v4.0.0\n- Tooltips have all new markup and classes, and can be invoked with `$('#my-element').tooltip()`.\n\n**4.x to 5.x**\n\n- Tooltip is now a custom element `<ids-tooltip></ids-tooltip>`\n- There is no longer a \"KeepOpen\" setting, instead add a component to the page and use `visible=true`\n- Tooltip can be used as a mixin or standalone component\n- Tooltip is no longer shared with popups so all options related to that are removed\n- Error Tooltips are removed/not needed at this time\n- attachToBody option is removed/not needed at this time\n- Content can now be set with `tooltipElem.textContent`\n- Instead of open and close use `tooltipElem.visible=true`\n- `aftershow` event was not needed as its the same as `show`, so this has been removed\n- `showOnKeyboardFocus` is now `trigger=\"focus\"`\n\n## Accessibility Guidelines\n\nFor a good article on making the tooltip accessible see [Tooltips WCAG 2.1](https://sarahmhigley.com/writing/tooltips-in-wcag-21/)\n\nTo make the tooltip accessible we do the following:\n\nWe use `aria-describedby` or `aria-labelledby` to associate the UI control with the tooltip. Do not put essential information in tooltips.\n\nThe following general rules apply:\n\n- Do not add interactive content (buttons/links ect) in a hyperlink\n- Only interactive elements should trigger tooltips. While disabled tooltips do work on hover they do not work on focus so are not accessible and should be avoided.- Tooltip text is purely supplemental, and should not override the existing accessible name for a control.\n\n## Regional Considerations\n\nTooltips should be localized in the current language. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-tree-node","attributes":[{"name":"children-tree-nodes","values":[]},{"name":"#tree","values":[]},{"name":"original-data","values":[]},{"name":"node-container","values":[]},{"name":"group-nodes-el","values":[]},{"name":"checkbox-elem","values":[]},{"name":"text-elem","values":[]},{"name":"elem","values":[]},{"name":"icon-element","values":[]},{"name":"has-children","values":[]},{"name":"is-async-parent","values":[]},{"name":"is-group","values":[]},{"name":"slotted-tree-nodes","values":[]},{"name":"data","values":[]},{"name":"tree-elem","values":[]},{"name":"is-multi-select","values":[]},{"name":"level","values":[]},{"name":"setsize","values":[]},{"name":"posinset","values":[]},{"name":"selected","description":"Sets the tree node to be selected","values":[]},{"name":"expanded","description":"Sets the tree group to be expanded","values":[]},{"name":"is-indeterminate","values":[]},{"name":"node-icon","description":"Gets the current node icon or expand/collapse icon","values":[]},{"name":"is-selected","description":"Gets the current state is selected or not","values":[]},{"name":"checkbox","values":[]},{"name":"disabled","description":"Sets the tree node to disabled","values":[]},{"name":"collapse-icon","description":"Sets the tree group collapse icon","values":[]},{"name":"expand-icon","description":"Sets the tree group expand icon","values":[]},{"name":"expand-collapse-icon","values":[]},{"name":"toggle-expand-icon","values":[]},{"name":"toggle-collapse-icon","values":[]},{"name":"toggle-expand-collapse-icon","values":[]},{"name":"show-expand-and-toggle-icons","values":[]},{"name":"icon","description":"Sets the tree node icon","values":[]},{"name":"label","description":"Set the node label text","values":[]},{"name":"selectable","description":"Sets the tree node to be selectable 'single', 'multiple', 'none'","values":[]},{"name":"expand-target","description":"Sets the trees expand target between clicking the whole node or just the icon","values":[]},{"name":"sortable","values":[]},{"name":"draggable","description":"Sets the tree node to be sortable (draggable)","values":[]}],"description":{"kind":"markdown","value":"# ids-tree\n\n## Description\n\nA tree is a structure that is hierarchical in structure. The tree consists of categories, subcategories and is vertical in format.\nTrees present a hierarchically structured list. Each node in the hierarchy may have child nodes, and nodes that have children may be expanded or collapsed to show or hide the children.\n\nFor example, in a file system that uses tree to display folders and files, a node representing a folder can be expanded to reveal the contents of the folder, which may be files, folders, or both. Tree node depth visualized by indentation in a list.\n\n## Use Cases\n\n- Tree component use to display hierarchically structured tree list.\n- To select node out of a set of hierarchically structured tree nodes.\n\n## Terminology\n\n**Tree:** A hierarchical collection of labeled nodes, each represented by a TreeNode.\n**TreeNode:** A node can be expanded to reveal nodes, if any exist, and collapsed to hide nodes.\n**Text:** The label/text to represent each tree node.\n**Icon:** An icon to represent the node type tree node.\n**Badge:** Tree nodes can optionally display badges to visualize more data.\n\n## Features (With Code Examples)\n\nA normal tree used as a web component.\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\">\n  <ids-tree-node id=\"home\">Home</ids-tree-node>\n  <ids-tree-node id=\"public-folders\" label=\"Public Folders\">\n    <ids-tree-node id=\"leadership\">Leadership</ids-tree-node>\n  </ids-tree-node>\n</ids-tree>\n```\n\nA tree built as using data/datasource\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst treeDemo = document.querySelector('#tree-demo');\nif (treeDemo) {\n  (async function init() {\n    const url = '/data/tree-basic.json';\n    const res = await fetch(url);\n    const data = await res.json();\n    treeDemo.data = data;\n  }());\n}\n```\n\nA tree with expand or collapse group nodes\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"selected\": \"true\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"expanded\": \"true\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}, {\n  \"id\": \"icons\",\n  \"text\": \"Icons\",\n  \"expanded\": \"false\",\n  \"children\": [{\n    \"id\": \"audio\",\n    \"text\": \"Audio\",\n    \"icon\": \"tree-audio\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n```\n\nA tree with pre selected value thru data\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"selected\": \"true\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n```\n\nA tree using expand target setting\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.expandTarget = 'icon'; // will expand when clicking the icon only\ntreeDemo?.data = dataset;\n```\n\nA tree using expand target setting with No icon rotation (animation)\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.toggleIconRotate = false;\ntreeDemo?.expandTarget = 'icon';\ntreeDemo?.data = dataset;\n```\n\nA tree with Custom Icons\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.expandTarget = 'icon';\ntreeDemo?.toggleIconRotate = false;\ntreeDemo?.collapseIcon = 'user-folder-closed';\ntreeDemo?.expandIcon = 'user-folder-open';\ntreeDemo?.toggleCollapseIcon = 'chevron-right';\ntreeDemo?.toggleExpandIcon = 'chevron-down';\ntreeDemo?.icon = 'tree-doc';\ntreeDemo?.data = dataset;\n```\n\nA tree with Badges\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"badge\": {\n    \"text\": \"5\",\n    \"shape\": \"round\"\n  }\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n```\n\nLoading child data dynamically\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"badge\": {\n    \"text\": \"5\",\n    \"shape\": \"round\"\n  }\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": []\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n\ntreeDemo!.beforeExpanded = async function beforeShow() {\n  const url = treeJSON;\n  const res2 = await fetch(url);\n  const data2 = await res2.json();\n\n  // Reuse the same API but change the data\n  data2[0].text = `New Dynamic Node`;\n  delete data2[0].children;\n\n  // Takes an array\n  return [data2[0]];\n};\n```\n\nUpdating tree node\n\n```html\n  <ids-tree id=\"tree-demo\">\n    <ids-tree-node id=\"home\">Home</ids-tree-node>\n  </ids-tree>\n```\n\n```javascript\nconst treeElem = document.querySelector('#tree-demo');\nconst NODE_DATA: IdsTreeNodeData = {\n  id: 'newc',\n  text: 'New node 2',\n  expanded: false,\n  children: [\n    {\n      id: 'newd',\n      text: 'New node 2.1'\n    },\n    {\n      id: 'newe',\n      text: 'New node 2.1'\n    }\n  ]\n}\n\ntreeElem.updateNode('#home', NODE_DATA);\n```\n\n## Settings and Attributes (Tree)\n\n- `collapseIcon` {string} Sets the tree group collapse icon (main icon that represents the collapsed state)\n- `data` {array} Set the data array for tree\n- `disabled` {boolean} Sets the tree to disabled state\n- `expandIcon` {string} Sets the tree group expand icon (main icon that represents the expanded state)\n- `expanded` {boolean} Sets the tree to be expanded\n- `icon` {string} Sets the tree node icon\n- `label` {string} Set the overall tree aria label text\n- `selectable` {string} Sets the tree node to be selectable. Accepted options are `multiple`, `single`, `none`.\n- `showExpandAndToggleIcons` {boolean} When true, displays both the main icon (expandIcon/collapseIcon) and a secondary toggle icon\n- `sortable` {boolean} Sets the tree to be sortable (enables drag and drop sorting)\n- `toggleCollapseIcon` {string} Sets the secondary toggle icon for collapsed state (only visible when showExpandAndToggleIcons is true)\n- `toggleExpandIcon` {string} Sets the secondary toggle icon for expanded state (only visible when showExpandAndToggleIcons is true)\n- `toggleIconRotate` {boolean} Sets the tree to use toggle icon rotate\n- `expandTarget` {'node' | 'icon'} Sets the trees expand target between `node` (the whole tree item) and just the `icon`\n\n### Icon Attributes Explained\n\nThe tree supports two icon display modes:\n\n**Single Icon Mode (default):**\n- Uses `expandIcon` and `collapseIcon` to show one icon that changes based on the node's state\n- Example: A folder icon that switches between open and closed states\n\n**Dual Icon Mode (when `showExpandAndToggleIcons` is true):**\n- Shows both the main icon (`expandIcon`/`collapseIcon`) AND a secondary toggle icon (`toggleExpandIcon`/`toggleCollapseIcon`)\n- The main icon represents the node type (e.g., folder)\n- The toggle icon indicates expand/collapse state (e.g., chevron or arrow)\n- Example: A folder icon with a separate chevron icon next to it\n\n## Settings and Attributes (Tree Node)\n\n- `collapseIcon` {string} Sets the tree group collapse icon (main icon for collapsed state)\n- `disabled` {boolean} Sets the tree node to disabled\n- `expandIcon` {string} Sets the tree group expand icon (main icon for expanded state)\n- `expanded` {boolean} Sets the tree group to be expanded\n- `icon` {string} Sets the tree node icon\n- `label` {string} Set the node label text, this can also be done via the innerText but this is more tricky with parent nodes so a label is provided.\n- `selectable` {string} Sets the tree node to be selectable\n- `selected` {boolean} Sets the tree node to be selected\n- `showExpandAndToggleIcons` {boolean} When true, displays both main and toggle icons\n- `tabbable` {boolean} Set if the node is tabbable\n- `toggleCollapseIcon` {string} Sets the secondary toggle icon for collapsed state\n- `toggleExpandIcon` {string} Sets the secondary toggle icon for expanded state\n- `expandTarget` {'node' | 'icon'} Sets the trees expand target between `node` (the whole tree item) and just the `icon`\n\n## Themeable Parts (Tree)\n\n- `tree` allows you to further style the tree element\n\n## Themeable Parts (Tree Node)\n\n- `group-node` allows you to further style the group node element\n- `node` allows you to further style the node element\n- `node-container` allows you to further style the node container element\n- `icon` allows you to further style the icon element\n- `toggle-icon` allows you to further style the toggle icon element\n- `text` allows you to further style the text element\n\n## Events (Tree)\n\n- `beforeselected` Fires before the tree node/group get selected, you can return false in the response to veto\n- `selected` Fires after the tree node/group get selected\n- `beforeunselected` Fires before the tree node/group get unselected, you can return false in the response to veto\n- `unselected` Fires after the tree node/group get unselected\n- `beforecollapsed` Fires before the tree group get collapsed, you can return false in the response to veto.\n- `collapsed` Fires after the tree group get collapsed\n- `beforeexpanded` Fires before the tree group get expanded, you can return false in the response to veto\n- `expanded` Fires after the tree group get expanded\n\n## Methods (Tree)\n\n- `collapseAll(): void` Collapse all attached nodes to the tree\n- `expandAll(): void` Expand all attached nodes to the tree\n- `collapse(selector: string): void` Collapse a tree node by given CSS selector\n- `expand(selector: string): void` Expand a tree node by given CSS selector\n- `toggle(selector: string): void` Toggle a tree node by given CSS selector\n- `select(selector: string): void` Selects a tree node by given CSS selector\n- `unselect(selector: string): void` UnSelects a tree node by given CSS selector\n- `isSelected(selector: string): boolean` Check if related node is selected or not, by given CSS selector\n- `getNode(selector: string): object` Get a tree node by given CSS selector\n- `addNodes(nodeData: Array<IdsTreeData>, location?: 'bottom' | 'top' | 'before' | 'after' | 'child', node?: HTMLElement): void` Loops through an array with one or more nodes and adds them to the tree. Location can be 'bottom', 'top', 'before' or 'after' or as a 'child'. Before / after / child are used with a node reference. May use getNode() to find the node you want to add next to. In order to add child nodes specify the parent option in the dataset\n- `removeNode(selector: string): object` Remove tree node by given CSS selector\n- `updateNode(selector: string, data: IdsTreeNodeData): object` Gets node by given css selector and updates node with given IdsTreeNodeData object\n\n## Methods (Tree Node)\n\n- `setFocus()` Set focus to node container\n- `getNode(selector: string)` Get a node given a css selector\n\n## Callbacks (functions)\n\n- `beforeExpanded = () =>` Fires a callback function before expanding a node with children, this function will wait synchronously for a result. If the result is to be vetoed return false. Otherwise can either use the callback as an event or return an array of tree node data items that will be loaded in as children of the node you expanded. `addNodes` will only be called the first time, if the children are empty. Otherwise just the callback will fire and any return data will be ignored.\n- `afterExpanded = () =>` Fires a callback function after expanding a node with children.\n\n## States and Variations (With Code Examples)\n\n- Badges: Ability to show some extra content\n- Custom Icons: End user can set custom icons to each node\n- Data/Datasource: Tree use the data array to set nodes\n- Disabled: Disabled nodes cannot be clicked, hovered, focused or selected\n- Expand or Collapse: Tree can display show/hide child nodes thru its parent/group node\n- Selection (single): Tree supports the single node selection\n- Expand Target: Provides an option to expand by clicking either the node or on just on the icon\n- Tree by Markup: Tree can set thru the markup only\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the tree.\n- <kbd>Enter or Space</kbd>: Performs the default action (select and toggle node) as on click event for the focused node.\n- <kbd>Down Arrow</kbd>: Moves focus to the next node that is focusable without opening or closing a node. If focus is on the last node, it does nothing.\n- <kbd>Up Arrow</kbd>: Moves focus to the previous node that is focusable without opening or closing a node. If focus is on the first node, it does nothing.\n- <kbd>Right Arrow</kbd>: When focus is on a closed node, it opens the node and focus does not move. When focus is on a open node, it moves focus to the first child node. When focus is on an end node, it does nothing.\n- <kbd>Left Arrow</kbd>: When focus is on an open node, it closes the node. When focus is on a child node that is also either node or a closed group node, it moves focus to its parent node. When focus is on a root node that is also either node or a closed group node, it does nothing.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/ri2Knf3KchdfdzRAeds0Ab/IDS-Mobility-v4.6?node-id=1%3A5740)\n\n## Accessibility Guidelines\n\n- Tree component contained in the element has a `role=\"tree\"` and `aria-label`\n- Each node element contains with `role=\"treeitem\"`\n- Each node element contains its current state with a `boolean` value as `aria-disabled`, `aria-selected`  and if it's a parent/group node `aria-expanded`\n- Each node element contains its current position with a `number` value as `aria-level`, `aria-setsize`, `aria-posinset`\n- Each parent/group node element contains with `role=\"group\"`\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tree was introduced in v4.2.0\n- Tree is comprised of new HTML markup and classes, and is invoked with `$('#my-element').tree()`.\n\n**4.x to 5.x**\n\n- Tree is now a custom element. `<ids-tree></ids-tree>`\n- Individual Tree nodes are now also custom elements. `<ids-tree-node></ids-tree-node>`\n- Tree nodes can contain other tree nodes (nesting).\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles.\n- `addNode` is now `addNodes` as it can accept one or more nodes at once\n"}},{"name":"ids-tree-shared","description":{"kind":"markdown","value":"# ids-tree\n\n## Description\n\nA tree is a structure that is hierarchical in structure. The tree consists of categories, subcategories and is vertical in format.\nTrees present a hierarchically structured list. Each node in the hierarchy may have child nodes, and nodes that have children may be expanded or collapsed to show or hide the children.\n\nFor example, in a file system that uses tree to display folders and files, a node representing a folder can be expanded to reveal the contents of the folder, which may be files, folders, or both. Tree node depth visualized by indentation in a list.\n\n## Use Cases\n\n- Tree component use to display hierarchically structured tree list.\n- To select node out of a set of hierarchically structured tree nodes.\n\n## Terminology\n\n**Tree:** A hierarchical collection of labeled nodes, each represented by a TreeNode.\n**TreeNode:** A node can be expanded to reveal nodes, if any exist, and collapsed to hide nodes.\n**Text:** The label/text to represent each tree node.\n**Icon:** An icon to represent the node type tree node.\n**Badge:** Tree nodes can optionally display badges to visualize more data.\n\n## Features (With Code Examples)\n\nA normal tree used as a web component.\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\">\n  <ids-tree-node id=\"home\">Home</ids-tree-node>\n  <ids-tree-node id=\"public-folders\" label=\"Public Folders\">\n    <ids-tree-node id=\"leadership\">Leadership</ids-tree-node>\n  </ids-tree-node>\n</ids-tree>\n```\n\nA tree built as using data/datasource\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst treeDemo = document.querySelector('#tree-demo');\nif (treeDemo) {\n  (async function init() {\n    const url = '/data/tree-basic.json';\n    const res = await fetch(url);\n    const data = await res.json();\n    treeDemo.data = data;\n  }());\n}\n```\n\nA tree with expand or collapse group nodes\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"selected\": \"true\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"expanded\": \"true\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}, {\n  \"id\": \"icons\",\n  \"text\": \"Icons\",\n  \"expanded\": \"false\",\n  \"children\": [{\n    \"id\": \"audio\",\n    \"text\": \"Audio\",\n    \"icon\": \"tree-audio\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n```\n\nA tree with pre selected value thru data\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"selected\": \"true\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n```\n\nA tree using expand target setting\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.expandTarget = 'icon'; // will expand when clicking the icon only\ntreeDemo?.data = dataset;\n```\n\nA tree using expand target setting with No icon rotation (animation)\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.toggleIconRotate = false;\ntreeDemo?.expandTarget = 'icon';\ntreeDemo?.data = dataset;\n```\n\nA tree with Custom Icons\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.expandTarget = 'icon';\ntreeDemo?.toggleIconRotate = false;\ntreeDemo?.collapseIcon = 'user-folder-closed';\ntreeDemo?.expandIcon = 'user-folder-open';\ntreeDemo?.toggleCollapseIcon = 'chevron-right';\ntreeDemo?.toggleExpandIcon = 'chevron-down';\ntreeDemo?.icon = 'tree-doc';\ntreeDemo?.data = dataset;\n```\n\nA tree with Badges\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"badge\": {\n    \"text\": \"5\",\n    \"shape\": \"round\"\n  }\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n```\n\nLoading child data dynamically\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"badge\": {\n    \"text\": \"5\",\n    \"shape\": \"round\"\n  }\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": []\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n\ntreeDemo!.beforeExpanded = async function beforeShow() {\n  const url = treeJSON;\n  const res2 = await fetch(url);\n  const data2 = await res2.json();\n\n  // Reuse the same API but change the data\n  data2[0].text = `New Dynamic Node`;\n  delete data2[0].children;\n\n  // Takes an array\n  return [data2[0]];\n};\n```\n\nUpdating tree node\n\n```html\n  <ids-tree id=\"tree-demo\">\n    <ids-tree-node id=\"home\">Home</ids-tree-node>\n  </ids-tree>\n```\n\n```javascript\nconst treeElem = document.querySelector('#tree-demo');\nconst NODE_DATA: IdsTreeNodeData = {\n  id: 'newc',\n  text: 'New node 2',\n  expanded: false,\n  children: [\n    {\n      id: 'newd',\n      text: 'New node 2.1'\n    },\n    {\n      id: 'newe',\n      text: 'New node 2.1'\n    }\n  ]\n}\n\ntreeElem.updateNode('#home', NODE_DATA);\n```\n\n## Settings and Attributes (Tree)\n\n- `collapseIcon` {string} Sets the tree group collapse icon (main icon that represents the collapsed state)\n- `data` {array} Set the data array for tree\n- `disabled` {boolean} Sets the tree to disabled state\n- `expandIcon` {string} Sets the tree group expand icon (main icon that represents the expanded state)\n- `expanded` {boolean} Sets the tree to be expanded\n- `icon` {string} Sets the tree node icon\n- `label` {string} Set the overall tree aria label text\n- `selectable` {string} Sets the tree node to be selectable. Accepted options are `multiple`, `single`, `none`.\n- `showExpandAndToggleIcons` {boolean} When true, displays both the main icon (expandIcon/collapseIcon) and a secondary toggle icon\n- `sortable` {boolean} Sets the tree to be sortable (enables drag and drop sorting)\n- `toggleCollapseIcon` {string} Sets the secondary toggle icon for collapsed state (only visible when showExpandAndToggleIcons is true)\n- `toggleExpandIcon` {string} Sets the secondary toggle icon for expanded state (only visible when showExpandAndToggleIcons is true)\n- `toggleIconRotate` {boolean} Sets the tree to use toggle icon rotate\n- `expandTarget` {'node' | 'icon'} Sets the trees expand target between `node` (the whole tree item) and just the `icon`\n\n### Icon Attributes Explained\n\nThe tree supports two icon display modes:\n\n**Single Icon Mode (default):**\n- Uses `expandIcon` and `collapseIcon` to show one icon that changes based on the node's state\n- Example: A folder icon that switches between open and closed states\n\n**Dual Icon Mode (when `showExpandAndToggleIcons` is true):**\n- Shows both the main icon (`expandIcon`/`collapseIcon`) AND a secondary toggle icon (`toggleExpandIcon`/`toggleCollapseIcon`)\n- The main icon represents the node type (e.g., folder)\n- The toggle icon indicates expand/collapse state (e.g., chevron or arrow)\n- Example: A folder icon with a separate chevron icon next to it\n\n## Settings and Attributes (Tree Node)\n\n- `collapseIcon` {string} Sets the tree group collapse icon (main icon for collapsed state)\n- `disabled` {boolean} Sets the tree node to disabled\n- `expandIcon` {string} Sets the tree group expand icon (main icon for expanded state)\n- `expanded` {boolean} Sets the tree group to be expanded\n- `icon` {string} Sets the tree node icon\n- `label` {string} Set the node label text, this can also be done via the innerText but this is more tricky with parent nodes so a label is provided.\n- `selectable` {string} Sets the tree node to be selectable\n- `selected` {boolean} Sets the tree node to be selected\n- `showExpandAndToggleIcons` {boolean} When true, displays both main and toggle icons\n- `tabbable` {boolean} Set if the node is tabbable\n- `toggleCollapseIcon` {string} Sets the secondary toggle icon for collapsed state\n- `toggleExpandIcon` {string} Sets the secondary toggle icon for expanded state\n- `expandTarget` {'node' | 'icon'} Sets the trees expand target between `node` (the whole tree item) and just the `icon`\n\n## Themeable Parts (Tree)\n\n- `tree` allows you to further style the tree element\n\n## Themeable Parts (Tree Node)\n\n- `group-node` allows you to further style the group node element\n- `node` allows you to further style the node element\n- `node-container` allows you to further style the node container element\n- `icon` allows you to further style the icon element\n- `toggle-icon` allows you to further style the toggle icon element\n- `text` allows you to further style the text element\n\n## Events (Tree)\n\n- `beforeselected` Fires before the tree node/group get selected, you can return false in the response to veto\n- `selected` Fires after the tree node/group get selected\n- `beforeunselected` Fires before the tree node/group get unselected, you can return false in the response to veto\n- `unselected` Fires after the tree node/group get unselected\n- `beforecollapsed` Fires before the tree group get collapsed, you can return false in the response to veto.\n- `collapsed` Fires after the tree group get collapsed\n- `beforeexpanded` Fires before the tree group get expanded, you can return false in the response to veto\n- `expanded` Fires after the tree group get expanded\n\n## Methods (Tree)\n\n- `collapseAll(): void` Collapse all attached nodes to the tree\n- `expandAll(): void` Expand all attached nodes to the tree\n- `collapse(selector: string): void` Collapse a tree node by given CSS selector\n- `expand(selector: string): void` Expand a tree node by given CSS selector\n- `toggle(selector: string): void` Toggle a tree node by given CSS selector\n- `select(selector: string): void` Selects a tree node by given CSS selector\n- `unselect(selector: string): void` UnSelects a tree node by given CSS selector\n- `isSelected(selector: string): boolean` Check if related node is selected or not, by given CSS selector\n- `getNode(selector: string): object` Get a tree node by given CSS selector\n- `addNodes(nodeData: Array<IdsTreeData>, location?: 'bottom' | 'top' | 'before' | 'after' | 'child', node?: HTMLElement): void` Loops through an array with one or more nodes and adds them to the tree. Location can be 'bottom', 'top', 'before' or 'after' or as a 'child'. Before / after / child are used with a node reference. May use getNode() to find the node you want to add next to. In order to add child nodes specify the parent option in the dataset\n- `removeNode(selector: string): object` Remove tree node by given CSS selector\n- `updateNode(selector: string, data: IdsTreeNodeData): object` Gets node by given css selector and updates node with given IdsTreeNodeData object\n\n## Methods (Tree Node)\n\n- `setFocus()` Set focus to node container\n- `getNode(selector: string)` Get a node given a css selector\n\n## Callbacks (functions)\n\n- `beforeExpanded = () =>` Fires a callback function before expanding a node with children, this function will wait synchronously for a result. If the result is to be vetoed return false. Otherwise can either use the callback as an event or return an array of tree node data items that will be loaded in as children of the node you expanded. `addNodes` will only be called the first time, if the children are empty. Otherwise just the callback will fire and any return data will be ignored.\n- `afterExpanded = () =>` Fires a callback function after expanding a node with children.\n\n## States and Variations (With Code Examples)\n\n- Badges: Ability to show some extra content\n- Custom Icons: End user can set custom icons to each node\n- Data/Datasource: Tree use the data array to set nodes\n- Disabled: Disabled nodes cannot be clicked, hovered, focused or selected\n- Expand or Collapse: Tree can display show/hide child nodes thru its parent/group node\n- Selection (single): Tree supports the single node selection\n- Expand Target: Provides an option to expand by clicking either the node or on just on the icon\n- Tree by Markup: Tree can set thru the markup only\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the tree.\n- <kbd>Enter or Space</kbd>: Performs the default action (select and toggle node) as on click event for the focused node.\n- <kbd>Down Arrow</kbd>: Moves focus to the next node that is focusable without opening or closing a node. If focus is on the last node, it does nothing.\n- <kbd>Up Arrow</kbd>: Moves focus to the previous node that is focusable without opening or closing a node. If focus is on the first node, it does nothing.\n- <kbd>Right Arrow</kbd>: When focus is on a closed node, it opens the node and focus does not move. When focus is on a open node, it moves focus to the first child node. When focus is on an end node, it does nothing.\n- <kbd>Left Arrow</kbd>: When focus is on an open node, it closes the node. When focus is on a child node that is also either node or a closed group node, it moves focus to its parent node. When focus is on a root node that is also either node or a closed group node, it does nothing.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/ri2Knf3KchdfdzRAeds0Ab/IDS-Mobility-v4.6?node-id=1%3A5740)\n\n## Accessibility Guidelines\n\n- Tree component contained in the element has a `role=\"tree\"` and `aria-label`\n- Each node element contains with `role=\"treeitem\"`\n- Each node element contains its current state with a `boolean` value as `aria-disabled`, `aria-selected`  and if it's a parent/group node `aria-expanded`\n- Each node element contains its current position with a `number` value as `aria-level`, `aria-setsize`, `aria-posinset`\n- Each parent/group node element contains with `role=\"group\"`\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tree was introduced in v4.2.0\n- Tree is comprised of new HTML markup and classes, and is invoked with `$('#my-element').tree()`.\n\n**4.x to 5.x**\n\n- Tree is now a custom element. `<ids-tree></ids-tree>`\n- Individual Tree nodes are now also custom elements. `<ids-tree-node></ids-tree-node>`\n- Tree nodes can contain other tree nodes (nesting).\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles.\n- `addNode` is now `addNodes` as it can accept one or more nodes at once\n"}},{"name":"ids-tree","attributes":[{"name":"#active","description":"Active node elements.","values":[]},{"name":"#nodes","description":"List of node elements attached to tree.","values":[]},{"name":"#redraw-slot-change-flag","values":[]},{"name":"data","description":"Get the data array of the tree","values":[]},{"name":"expanded","description":"Get whether the tree is expanded","values":[]},{"name":"selectable","description":"Get the selectable mode","values":[]},{"name":"icon","description":"Get the tree node icon","values":[]},{"name":"collapse-icon","description":"Get the tree group collapse icon","values":[]},{"name":"expand-target","description":"Get the tree's expand target","values":[]},{"name":"expand-icon","description":"Get the tree group expand icon","values":[]},{"name":"disabled","description":"Get whether the tree is disabled","values":[]},{"name":"root-nodes","description":"Get all root level tree nodes","values":[]},{"name":"tree-nodes","description":"Get all tree nodes","values":[]},{"name":"nodes-data","description":"Get all tree nodes data","values":[]},{"name":"label","description":"Get the tree aria label text","values":[]},{"name":"is-multi-select","description":"Get whether the tree is in multi-select mode","values":[]},{"name":"show-expand-and-toggle-icons","description":"Get whether to show expand and collapse icons","values":[]},{"name":"toggle-collapse-icon","description":"Get the tree group toggle collapse icon","values":[]},{"name":"toggle-expand-icon","description":"Get the tree group toggle expand icon","values":[]},{"name":"toggle-icon-rotate","description":"Get whether to use toggle icon rotate","values":[]},{"name":"sortable","description":"Get whether the tree is sortable (draggable)","values":[]},{"name":"selected","description":"Get the currently selected node(s)","values":[]},{"name":"before-expanded","description":"Get the async function that fires as the node is expanding","values":[]},{"name":"after-expanded","description":"Get the async function that fires after the node was expanded","values":[]},{"name":"state","values":[]}],"description":{"kind":"markdown","value":"# ids-tree\n\n## Description\n\nA tree is a structure that is hierarchical in structure. The tree consists of categories, subcategories and is vertical in format.\nTrees present a hierarchically structured list. Each node in the hierarchy may have child nodes, and nodes that have children may be expanded or collapsed to show or hide the children.\n\nFor example, in a file system that uses tree to display folders and files, a node representing a folder can be expanded to reveal the contents of the folder, which may be files, folders, or both. Tree node depth visualized by indentation in a list.\n\n## Use Cases\n\n- Tree component use to display hierarchically structured tree list.\n- To select node out of a set of hierarchically structured tree nodes.\n\n## Terminology\n\n**Tree:** A hierarchical collection of labeled nodes, each represented by a TreeNode.\n**TreeNode:** A node can be expanded to reveal nodes, if any exist, and collapsed to hide nodes.\n**Text:** The label/text to represent each tree node.\n**Icon:** An icon to represent the node type tree node.\n**Badge:** Tree nodes can optionally display badges to visualize more data.\n\n## Features (With Code Examples)\n\nA normal tree used as a web component.\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\">\n  <ids-tree-node id=\"home\">Home</ids-tree-node>\n  <ids-tree-node id=\"public-folders\" label=\"Public Folders\">\n    <ids-tree-node id=\"leadership\">Leadership</ids-tree-node>\n  </ids-tree-node>\n</ids-tree>\n```\n\nA tree built as using data/datasource\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst treeDemo = document.querySelector('#tree-demo');\nif (treeDemo) {\n  (async function init() {\n    const url = '/data/tree-basic.json';\n    const res = await fetch(url);\n    const data = await res.json();\n    treeDemo.data = data;\n  }());\n}\n```\n\nA tree with expand or collapse group nodes\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"selected\": \"true\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"expanded\": \"true\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}, {\n  \"id\": \"icons\",\n  \"text\": \"Icons\",\n  \"expanded\": \"false\",\n  \"children\": [{\n    \"id\": \"audio\",\n    \"text\": \"Audio\",\n    \"icon\": \"tree-audio\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n```\n\nA tree with pre selected value thru data\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"selected\": \"true\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n```\n\nA tree using expand target setting\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.expandTarget = 'icon'; // will expand when clicking the icon only\ntreeDemo?.data = dataset;\n```\n\nA tree using expand target setting with No icon rotation (animation)\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.toggleIconRotate = false;\ntreeDemo?.expandTarget = 'icon';\ntreeDemo?.data = dataset;\n```\n\nA tree with Custom Icons\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\"\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.expandTarget = 'icon';\ntreeDemo?.toggleIconRotate = false;\ntreeDemo?.collapseIcon = 'user-folder-closed';\ntreeDemo?.expandIcon = 'user-folder-open';\ntreeDemo?.toggleCollapseIcon = 'chevron-right';\ntreeDemo?.toggleExpandIcon = 'chevron-down';\ntreeDemo?.icon = 'tree-doc';\ntreeDemo?.data = dataset;\n```\n\nA tree with Badges\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"badge\": {\n    \"text\": \"5\",\n    \"shape\": \"round\"\n  }\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": [{\n    \"id\": \"leadership\",\n    \"text\": \"Leadership\"\n  }]\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n```\n\nLoading child data dynamically\n\n```html\n<ids-tree id=\"tree-demo\" label=\"Demo Tree\"></ids-tree>\n```\n\n```javascript\nconst dataset = [{\n  \"id\": \"home\",\n  \"text\": \"Home\",\n  \"badge\": {\n    \"text\": \"5\",\n    \"shape\": \"round\"\n  }\n}, {\n  \"id\": \"public-folders\",\n  \"text\": \"Public Folders\",\n  \"children\": []\n}];\nconst treeDemo = document.querySelector('#tree-demo');\ntreeDemo?.data = dataset;\n\ntreeDemo!.beforeExpanded = async function beforeShow() {\n  const url = treeJSON;\n  const res2 = await fetch(url);\n  const data2 = await res2.json();\n\n  // Reuse the same API but change the data\n  data2[0].text = `New Dynamic Node`;\n  delete data2[0].children;\n\n  // Takes an array\n  return [data2[0]];\n};\n```\n\nUpdating tree node\n\n```html\n  <ids-tree id=\"tree-demo\">\n    <ids-tree-node id=\"home\">Home</ids-tree-node>\n  </ids-tree>\n```\n\n```javascript\nconst treeElem = document.querySelector('#tree-demo');\nconst NODE_DATA: IdsTreeNodeData = {\n  id: 'newc',\n  text: 'New node 2',\n  expanded: false,\n  children: [\n    {\n      id: 'newd',\n      text: 'New node 2.1'\n    },\n    {\n      id: 'newe',\n      text: 'New node 2.1'\n    }\n  ]\n}\n\ntreeElem.updateNode('#home', NODE_DATA);\n```\n\n## Settings and Attributes (Tree)\n\n- `collapseIcon` {string} Sets the tree group collapse icon (main icon that represents the collapsed state)\n- `data` {array} Set the data array for tree\n- `disabled` {boolean} Sets the tree to disabled state\n- `expandIcon` {string} Sets the tree group expand icon (main icon that represents the expanded state)\n- `expanded` {boolean} Sets the tree to be expanded\n- `icon` {string} Sets the tree node icon\n- `label` {string} Set the overall tree aria label text\n- `selectable` {string} Sets the tree node to be selectable. Accepted options are `multiple`, `single`, `none`.\n- `showExpandAndToggleIcons` {boolean} When true, displays both the main icon (expandIcon/collapseIcon) and a secondary toggle icon\n- `sortable` {boolean} Sets the tree to be sortable (enables drag and drop sorting)\n- `toggleCollapseIcon` {string} Sets the secondary toggle icon for collapsed state (only visible when showExpandAndToggleIcons is true)\n- `toggleExpandIcon` {string} Sets the secondary toggle icon for expanded state (only visible when showExpandAndToggleIcons is true)\n- `toggleIconRotate` {boolean} Sets the tree to use toggle icon rotate\n- `expandTarget` {'node' | 'icon'} Sets the trees expand target between `node` (the whole tree item) and just the `icon`\n\n### Icon Attributes Explained\n\nThe tree supports two icon display modes:\n\n**Single Icon Mode (default):**\n- Uses `expandIcon` and `collapseIcon` to show one icon that changes based on the node's state\n- Example: A folder icon that switches between open and closed states\n\n**Dual Icon Mode (when `showExpandAndToggleIcons` is true):**\n- Shows both the main icon (`expandIcon`/`collapseIcon`) AND a secondary toggle icon (`toggleExpandIcon`/`toggleCollapseIcon`)\n- The main icon represents the node type (e.g., folder)\n- The toggle icon indicates expand/collapse state (e.g., chevron or arrow)\n- Example: A folder icon with a separate chevron icon next to it\n\n## Settings and Attributes (Tree Node)\n\n- `collapseIcon` {string} Sets the tree group collapse icon (main icon for collapsed state)\n- `disabled` {boolean} Sets the tree node to disabled\n- `expandIcon` {string} Sets the tree group expand icon (main icon for expanded state)\n- `expanded` {boolean} Sets the tree group to be expanded\n- `icon` {string} Sets the tree node icon\n- `label` {string} Set the node label text, this can also be done via the innerText but this is more tricky with parent nodes so a label is provided.\n- `selectable` {string} Sets the tree node to be selectable\n- `selected` {boolean} Sets the tree node to be selected\n- `showExpandAndToggleIcons` {boolean} When true, displays both main and toggle icons\n- `tabbable` {boolean} Set if the node is tabbable\n- `toggleCollapseIcon` {string} Sets the secondary toggle icon for collapsed state\n- `toggleExpandIcon` {string} Sets the secondary toggle icon for expanded state\n- `expandTarget` {'node' | 'icon'} Sets the trees expand target between `node` (the whole tree item) and just the `icon`\n\n## Themeable Parts (Tree)\n\n- `tree` allows you to further style the tree element\n\n## Themeable Parts (Tree Node)\n\n- `group-node` allows you to further style the group node element\n- `node` allows you to further style the node element\n- `node-container` allows you to further style the node container element\n- `icon` allows you to further style the icon element\n- `toggle-icon` allows you to further style the toggle icon element\n- `text` allows you to further style the text element\n\n## Events (Tree)\n\n- `beforeselected` Fires before the tree node/group get selected, you can return false in the response to veto\n- `selected` Fires after the tree node/group get selected\n- `beforeunselected` Fires before the tree node/group get unselected, you can return false in the response to veto\n- `unselected` Fires after the tree node/group get unselected\n- `beforecollapsed` Fires before the tree group get collapsed, you can return false in the response to veto.\n- `collapsed` Fires after the tree group get collapsed\n- `beforeexpanded` Fires before the tree group get expanded, you can return false in the response to veto\n- `expanded` Fires after the tree group get expanded\n\n## Methods (Tree)\n\n- `collapseAll(): void` Collapse all attached nodes to the tree\n- `expandAll(): void` Expand all attached nodes to the tree\n- `collapse(selector: string): void` Collapse a tree node by given CSS selector\n- `expand(selector: string): void` Expand a tree node by given CSS selector\n- `toggle(selector: string): void` Toggle a tree node by given CSS selector\n- `select(selector: string): void` Selects a tree node by given CSS selector\n- `unselect(selector: string): void` UnSelects a tree node by given CSS selector\n- `isSelected(selector: string): boolean` Check if related node is selected or not, by given CSS selector\n- `getNode(selector: string): object` Get a tree node by given CSS selector\n- `addNodes(nodeData: Array<IdsTreeData>, location?: 'bottom' | 'top' | 'before' | 'after' | 'child', node?: HTMLElement): void` Loops through an array with one or more nodes and adds them to the tree. Location can be 'bottom', 'top', 'before' or 'after' or as a 'child'. Before / after / child are used with a node reference. May use getNode() to find the node you want to add next to. In order to add child nodes specify the parent option in the dataset\n- `removeNode(selector: string): object` Remove tree node by given CSS selector\n- `updateNode(selector: string, data: IdsTreeNodeData): object` Gets node by given css selector and updates node with given IdsTreeNodeData object\n\n## Methods (Tree Node)\n\n- `setFocus()` Set focus to node container\n- `getNode(selector: string)` Get a node given a css selector\n\n## Callbacks (functions)\n\n- `beforeExpanded = () =>` Fires a callback function before expanding a node with children, this function will wait synchronously for a result. If the result is to be vetoed return false. Otherwise can either use the callback as an event or return an array of tree node data items that will be loaded in as children of the node you expanded. `addNodes` will only be called the first time, if the children are empty. Otherwise just the callback will fire and any return data will be ignored.\n- `afterExpanded = () =>` Fires a callback function after expanding a node with children.\n\n## States and Variations (With Code Examples)\n\n- Badges: Ability to show some extra content\n- Custom Icons: End user can set custom icons to each node\n- Data/Datasource: Tree use the data array to set nodes\n- Disabled: Disabled nodes cannot be clicked, hovered, focused or selected\n- Expand or Collapse: Tree can display show/hide child nodes thru its parent/group node\n- Selection (single): Tree supports the single node selection\n- Expand Target: Provides an option to expand by clicking either the node or on just on the icon\n- Tree by Markup: Tree can set thru the markup only\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift + Tab</kbd>: This will focus or unfocus the tree.\n- <kbd>Enter or Space</kbd>: Performs the default action (select and toggle node) as on click event for the focused node.\n- <kbd>Down Arrow</kbd>: Moves focus to the next node that is focusable without opening or closing a node. If focus is on the last node, it does nothing.\n- <kbd>Up Arrow</kbd>: Moves focus to the previous node that is focusable without opening or closing a node. If focus is on the first node, it does nothing.\n- <kbd>Right Arrow</kbd>: When focus is on a closed node, it opens the node and focus does not move. When focus is on a open node, it moves focus to the first child node. When focus is on an end node, it does nothing.\n- <kbd>Left Arrow</kbd>: When focus is on an open node, it closes the node. When focus is on a child node that is also either node or a closed group node, it moves focus to its parent node. When focus is on a root node that is also either node or a closed group node, it does nothing.\n\n## Responsive Guidelines\n\n- Flows with padding and margin within the width and height of the parent container.\n\n## Designs\n\n[Design Specs](https://www.figma.com/file/ri2Knf3KchdfdzRAeds0Ab/IDS-Mobility-v4.6?node-id=1%3A5740)\n\n## Accessibility Guidelines\n\n- Tree component contained in the element has a `role=\"tree\"` and `aria-label`\n- Each node element contains with `role=\"treeitem\"`\n- Each node element contains its current state with a `boolean` value as `aria-disabled`, `aria-selected`  and if it's a parent/group node `aria-expanded`\n- Each node element contains its current position with a `number` value as `aria-level`, `aria-setsize`, `aria-posinset`\n- Each parent/group node element contains with `role=\"group\"`\n\n## Regional Considerations\n\nIn Right To Left Languages the icons, text and alignment will flow to the other side. Labels should be localized in the current language.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Tree was introduced in v4.2.0\n- Tree is comprised of new HTML markup and classes, and is invoked with `$('#my-element').tree()`.\n\n**4.x to 5.x**\n\n- Tree is now a custom element. `<ids-tree></ids-tree>`\n- Individual Tree nodes are now also custom elements. `<ids-tree-node></ids-tree-node>`\n- Tree nodes can contain other tree nodes (nesting).\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles.\n- `addNode` is now `addNodes` as it can accept one or more nodes at once\n"}},{"name":"ids-treemap","attributes":[{"name":"d","values":[]},{"name":"height","values":[]},{"name":"width","values":[]},{"name":"rectangle","values":[]},{"name":"initial-data","values":[]},{"name":"data","description":"Get the data attribute","values":[]},{"name":"#get-maximum","description":"Get max number","values":[]},{"name":"#get-minimum","description":"Get min number","values":[]},{"name":"#sum-reducer","description":"Sum Reducer","values":[]},{"name":"#round-value","description":"Round Value and preserve 2 decimals","values":[]},{"name":"#validate-arguments","description":"Validate the treemap object.","values":[]},{"name":"#worst-ratio","description":"Calculate worst ratio","values":[]},{"name":"#get-min-width","description":"Get the min width","values":[]},{"name":"#layout-row","description":"Layout Row","values":[]},{"name":"#layout-last-row","description":"Layout last row","values":[]},{"name":"#squarify","description":"Squarify","values":[]},{"name":"on-locale-change","description":"Handle Locale (and language) change","values":[]}],"description":{"kind":"markdown","value":"# ids-treemap\n\n## Description\n\nTreemaps are used to display hierarchical data. This is useful when space is constrained and you need to see an overview of a large amount of hierarchical data. Treemaps should primarily be used with values that can be aggregated. Treemaps are economical in that they can be used within a limited space and yet display a large number of items simultaneously. When there is a correlation between color and size in the tree structure, you are able to see patterns that would be difficult to spot in other ways, for example, when a certain color is particularly relevant.\n\nTreemaps are not good when there is a big difference in the magnitude of the measure values. Nor is a treemap the right choice when mixing absolute and relative values. Negative values cannot be displayed in treemaps.\n\n## Terminology\n**result** This is a property / attr where the treemap data object gets stored.\n**title** This is an attribute where the treemap title is stored.\n\n## Features (With Code Examples)\n\n```html\n    <ids-treemap title=\"Storage Utilization (78 GB)\"></ids-treemap>\n```\n\n```js\nconst treeMapEl = document.querySelector('ids-treemap');\n\n  treeMapEl.result = treeMapEl.treeMap({\n    data: [\n      {\n        value: 28,\n        color: '#003876',\n        text: 'JSON',\n        label: '28%'\n      },\n      {\n        value: 18,\n        color: '#004A99',\n        text: 'PDF',\n        label: '18%'\n      },\n      {\n        value: 8,\n        color: '#0054B1',\n        text: 'BOD',\n        label: '8%'\n      },\n      {\n        value: 8,\n        color: '#0066D4',\n        text: 'TXT',\n        label: '8%'\n      },\n      {\n        value: 17,\n        color: '#0072ED',\n        text: 'CSV',\n        label: '17%'\n      },\n      {\n        value: 7,\n        color: '#1C86EF',\n        text: 'Assets',\n        label: '7%'\n      },\n      {\n        value: 14,\n        color: '#55A3F3',\n        text: 'Others',\n        label: '14%'\n      },\n    ],\n    width: 1000, // Optional. By default takes the width of the container.\n    height: 300\n  });\n```\n\n## Accessibility Guidelines\n\nThe contrast and actual colors can be a concern for visibility impaired and color blind people. However, you can customize the color by passing different contrast colors in the color option.\n\n## Usage Guidance\n\n- **data** Required. The data format should be as follows:\n```js\n{\n    data: [{\n        value: 28,\n        color: '#003876',\n        text: 'JSON',\n        label: '28%'\n      },\n      {\n        value: 18,\n        color: '#004A99',\n        text: 'PDF',\n        label: '18%'\n      }\n    ],\n    height: 300\n}\n```\n\n- **width** By default the treemap takes on the width of the container. The treemap will resize as the screen size changes.\n= **height** Required. You will need to set the height for the treemap.\n\n## Keyboard Shortcuts\n\nThis chart has no keyboard functionality\n\n## Responsive Information\n\nAs you resize the chart will redraw with in the width of the container width. The nodes in the treemap are sized in proportion.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Treemap was a new component created in v4.6.0\n\n**4.x to 5.x**\n\n- Treemap is now a custom element `<ids-treemap></ids-treemap>`\n"}},{"name":"ids-trigger-button","attributes":[{"name":"proto-classes","description":"Figure out the classes","values":[]},{"name":"tabbable","description":"Set if the trigger field is tabbable","values":[]},{"name":"readonly","description":"Set the trigger button to readonly color","values":[]},{"name":"inline-css-class","values":[]},{"name":"inline","values":[]},{"name":"inherit-color","values":[]}],"description":{"kind":"markdown","value":"# ids-trigger-field\n\n## Description\n\nWe include a trigger field component that helps layout an input next to a button (the trigger button). This component can be used on its own, but its generally used to make other internal components (date picker, time picker ect).\n\n## Class Hierarchy\n\n- IdsTriggerField\n  - IdsInput\n    - IdsElement\n- Mixins\n  IdsDirtyTrackerMixin\n  IdsColorVariantMixin\n  IdsClearableMixin\n  IdsEventsMixin\n  IdsKeyboardMixin\n  IdsMaskMixin\n  IdsTooltipMixin\n  IdsValidationMixin\n\n## Use Cases\n\n- When you want an input with a trigger button/buttons that opens some kind of selection dialog that works with the field.\n\n## Terminology\n\n- **Trigger**: The button next to the input element\n- **Input**: The input element\n\n## Features (With Code Examples)\n\nAdd an IdsTriggerField to the page and inside its slot add one or more ids-trigger-buttons.  The `slot` attribute can be applied the IdsTriggerButton to control its placement, but by default they will appear at the \"end\" side of the trigger field:\n\n```html\n<ids-trigger-field size=\"sm\" label=\"Date Field\">\n  <ids-trigger-button slot=\"end\">\n    <ids-text audible=\"true\">Date Field trigger</ids-text>\n    <ids-icon icon=\"schedule\"></ids-icon>\n  </ids-trigger-button>\n</ids-trigger-field>\n```\n\nExample usage with buttons on both sides of input.\n\n```html\n<ids-trigger-field\n    id=\"trigger-field-1\"\n    label=\"Trigger field label\"\n>\n  <ids-trigger-button slot=\"start\">\n    <ids-icon class=\"ids-settings\" icon=\"settings\" size=\"medium\"></ids-icon>\n    <ids-text audible=\"true\">Call to action Button</ids-text>\n  </ids-trigger-button>\n  <ids-trigger-button slot=\"end\">\n    <ids-text audible=\"true\">Popup Activator Button</ids-text>\n    <ids-icon class=\"ids-dropdown\" icon=\"dropdown\" size=\"medium\"></ids-icon>\n  </ids-trigger-button>\n</ids-trigger-field>\n```\n\nThe `inline` attribute can be applied the IdsTriggerButton to alter the size of the field when the field height changes. Since trigger buttons are \"square\", they will respect the settings and fit the size of the field.\n\nExample usage with `inline` attribute enabled in ids-trigger-buttons.\n\n```html\n<ids-trigger-field size=\"sm\" label=\"Select an option\">\n  <ids-trigger-button slot=\"trigger-end\" inline>\n    <ids-text>Show options</ids-text>\n    <ids-icon icon=\"dropdown\"></ids-icon>\n  </ids-trigger-button>\n</ids-trigger-field>\n```\n\n## Settings and Attributes\n\n**Ids Trigger Field Component**\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `disabled` {boolean} set disabled state.\n- `label` {string} This adds a label to the trigger field\n- `size` {string} set the input size, it will set `md` as defaults\n- `tabbable` {boolean} When set to `true`, allows the trigger buttons to be included in the tab order. By default, trigger buttons are not tabbable, but for accessibility reasons they can be made tabbable when needed.\n- `delimiter` {string} The delimiter to use when multiple values are selected.\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n\n**Ids Trigger Button Component**\n\n- `inline` {boolean} when some components alter the trigger button style to enable `inline`, it will:\n  - Set one visible border on the trigger button:\n    - left side if slotted with \"trigger-end\"\n    - right side if slotted with \"trigger-start\"\n  - Alter the size of the trigger button to fit the size of the field if `field-height` or `compact` are set on IdsTriggerField.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- No separate Trigger Field component is present in 4.x\n\n**4.x to 5.x**\n\n- IdsTriggerField is a new component for 5.x\n\n## Regional Considerations\n\nIn Right To Left Languages the trigger field and alignment will flow to the other side.\n"}},{"name":"ids-trigger-field","attributes":[{"name":"elements","description":"Get a list of element dependencies for this component","values":[]},{"name":"#buttons","values":[]},{"name":"buttons","values":[]},{"name":"tabbable","values":[]},{"name":"disabled","description":"Sets the disabled attribute","values":[]},{"name":"readonly","description":"Sets the readonly attribute","values":[]},{"name":"id","description":"Sets the id internally and externally","values":[]},{"name":"format","description":"Return format","values":[]},{"name":"#input-focus-handler","values":[]},{"name":"#input-blur-handler","values":[]},{"name":"#input-keydown-handler","values":[]},{"name":"#button-focus-handlers","values":[]},{"name":"#button-blur-handlers","values":[]},{"name":"triggered-by-change","values":[]},{"name":"is-form-component","values":[]},{"name":"color-variants","description":"Inherited from `IdsColorVariantMixin`","values":[]},{"name":"is-password-visible","description":"Check if this is a password field and the password should be shown as plain text","values":[]},{"name":"collapsible","description":"Get the collapsible state","values":[]},{"name":"input","description":"Get the inner input element","values":[]},{"name":"form-input","description":"Get the inner input element (for form input mixin)","values":[]},{"name":"caps-lock-icon","description":"Get the caps lock indicator icon","values":[]},{"name":"field-container","description":"Get the field container element","values":[]},{"name":"label-text-el","description":"Get the inner ids-text element which contains the label text","values":[]},{"name":"label-el","description":"Get the inner label element","values":[]},{"name":"reveal-on-edit","description":"Sets whether reveal on edit is enabled (shows button only when editing)","values":[]},{"name":"revealable-password","description":"sets whether password reveal functionality is available","values":[]},{"name":"caps-lock","description":"sets whether capslock indicatoris enabled or disabled","values":[]},{"name":"password-visible","description":"sets whether the password is currently visible","values":[]},{"name":"square","description":"Get whether the input has square corners","values":[]},{"name":"disable-tooltip","description":"Get whether tooltip is disabled","values":[]},{"name":"#native-event-handler","values":[]},{"name":"#input-event-handler","values":[]},{"name":"active","description":"Get the active state","values":[]},{"name":"bg-transparent","description":"Get the background transparent state","values":[]},{"name":"browser-autocomplete","description":"Get the browser autocomplete setting","values":[]},{"name":"text-ellipsis","description":"Get the text ellipsis state","values":[]},{"name":"#label-el","description":"internal reference to a label element a user provides","values":[]},{"name":"placeholder","description":"Get the placeholder text","values":[]},{"name":"readonly-background","description":"Get whether readonly background is enabled","values":[]},{"name":"label-wrap","description":"Get the label wrap setting","values":[]},{"name":"size","description":"Get the size","values":[]},{"name":"text-align","description":"Get the text alignment","values":[]},{"name":"type","description":"Get the input type","values":[]},{"name":"value","description":"Get the input value","values":[]},{"name":"cursor","description":"Get the cursor style","values":[]},{"name":"maxlength","description":"Get the max length","values":[]},{"name":"uppercase","description":"Get the uppercase state","values":[]},{"name":"lowercase","description":"Get the lowercase state","values":[]},{"name":"margin-block-end","description":"Gets the margin-block-end token key","values":[]},{"name":"no-margins","description":"Get the no margins state","values":[]},{"name":"padding","description":"Get the inner padding","values":[]},{"name":"overflow","description":"Get how content overflows","values":[]}],"description":{"kind":"markdown","value":"# ids-trigger-field\n\n## Description\n\nWe include a trigger field component that helps layout an input next to a button (the trigger button). This component can be used on its own, but its generally used to make other internal components (date picker, time picker ect).\n\n## Class Hierarchy\n\n- IdsTriggerField\n  - IdsInput\n    - IdsElement\n- Mixins\n  IdsDirtyTrackerMixin\n  IdsColorVariantMixin\n  IdsClearableMixin\n  IdsEventsMixin\n  IdsKeyboardMixin\n  IdsMaskMixin\n  IdsTooltipMixin\n  IdsValidationMixin\n\n## Use Cases\n\n- When you want an input with a trigger button/buttons that opens some kind of selection dialog that works with the field.\n\n## Terminology\n\n- **Trigger**: The button next to the input element\n- **Input**: The input element\n\n## Features (With Code Examples)\n\nAdd an IdsTriggerField to the page and inside its slot add one or more ids-trigger-buttons.  The `slot` attribute can be applied the IdsTriggerButton to control its placement, but by default they will appear at the \"end\" side of the trigger field:\n\n```html\n<ids-trigger-field size=\"sm\" label=\"Date Field\">\n  <ids-trigger-button slot=\"end\">\n    <ids-text audible=\"true\">Date Field trigger</ids-text>\n    <ids-icon icon=\"schedule\"></ids-icon>\n  </ids-trigger-button>\n</ids-trigger-field>\n```\n\nExample usage with buttons on both sides of input.\n\n```html\n<ids-trigger-field\n    id=\"trigger-field-1\"\n    label=\"Trigger field label\"\n>\n  <ids-trigger-button slot=\"start\">\n    <ids-icon class=\"ids-settings\" icon=\"settings\" size=\"medium\"></ids-icon>\n    <ids-text audible=\"true\">Call to action Button</ids-text>\n  </ids-trigger-button>\n  <ids-trigger-button slot=\"end\">\n    <ids-text audible=\"true\">Popup Activator Button</ids-text>\n    <ids-icon class=\"ids-dropdown\" icon=\"dropdown\" size=\"medium\"></ids-icon>\n  </ids-trigger-button>\n</ids-trigger-field>\n```\n\nThe `inline` attribute can be applied the IdsTriggerButton to alter the size of the field when the field height changes. Since trigger buttons are \"square\", they will respect the settings and fit the size of the field.\n\nExample usage with `inline` attribute enabled in ids-trigger-buttons.\n\n```html\n<ids-trigger-field size=\"sm\" label=\"Select an option\">\n  <ids-trigger-button slot=\"trigger-end\" inline>\n    <ids-text>Show options</ids-text>\n    <ids-icon icon=\"dropdown\"></ids-icon>\n  </ids-trigger-button>\n</ids-trigger-field>\n```\n\n## Settings and Attributes\n\n**Ids Trigger Field Component**\n\n- `autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `disabled` {boolean} set disabled state.\n- `label` {string} This adds a label to the trigger field\n- `size` {string} set the input size, it will set `md` as defaults\n- `tabbable` {boolean} When set to `true`, allows the trigger buttons to be included in the tab order. By default, trigger buttons are not tabbable, but for accessibility reasons they can be made tabbable when needed.\n- `delimiter` {string} The delimiter to use when multiple values are selected.\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n\n**Ids Trigger Button Component**\n\n- `inline` {boolean} when some components alter the trigger button style to enable `inline`, it will:\n  - Set one visible border on the trigger button:\n    - left side if slotted with \"trigger-end\"\n    - right side if slotted with \"trigger-start\"\n  - Alter the size of the trigger button to fit the size of the field if `field-height` or `compact` are set on IdsTriggerField.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- No separate Trigger Field component is present in 4.x\n\n**4.x to 5.x**\n\n- IdsTriggerField is a new component for 5.x\n\n## Regional Considerations\n\nIn Right To Left Languages the trigger field and alignment will flow to the other side.\n"}},{"name":"ids-upload","attributes":[{"name":"is-form-component","values":[]},{"name":"is-file-picker-opened","values":[]},{"name":"trigger","values":[]},{"name":"file-input","values":[]},{"name":"files","values":[]},{"name":"color-variants","description":"List of available color variants for this component","values":[]},{"name":"input","description":"Get the trigger field input element","values":[]},{"name":"text-input","description":"Get trigger field element as textInput","values":[]},{"name":"label-filetype-default","description":"Get default label for filetype","values":[]},{"name":"trigger-label-default","description":"Get default label for trigger button","values":[]},{"name":"validation-events-default","description":"Get default validation events","values":[]},{"name":"has-access","description":"Check if has access to use, if not disabled or readonly","values":[]},{"name":"accept","description":"Get the accept attribute","values":[]},{"name":"disabled","description":"Get whether the upload is disabled","values":[]},{"name":"label-filetype","description":"Get the label for filetype","values":[]},{"name":"multiple","description":"Get whether multiple files can be selected","values":[]},{"name":"no-margins","description":"Get whether margins are disabled","values":[]},{"name":"text-ellipsis","description":"Get whether text ellipsis is enabled","values":[]},{"name":"placeholder","description":"Get the placeholder text","values":[]},{"name":"readonly","description":"Get whether the upload is readonly","values":[]},{"name":"size","description":"Get the size of input","values":[]},{"name":"tabbable","description":"Get whether the upload is tabbable","values":[]},{"name":"trigger-label","description":"Get the label for trigger button","values":[]},{"name":"validate","description":"Get the validate attribute","values":[]},{"name":"validation-events","description":"Get the validation events","values":[]},{"name":"value","description":"Get the value for text input and file input","values":[]}],"description":{"kind":"markdown","value":"# ids-upload\n\n## Description\n\nA form element that allows users to choose a file they want to upload. A user can prompt a system menu to select one or more file to upload.\n\n## Use Cases\n\n- Used for allowing users to select files from a local system to be uploaded to a server or application.\n\n## Terminology\n\n**Input Type File:** A standard basic input element with type as file.\n**Label:** HTMLLabelElement to keep matching with HTMLInputElement. Make sure the label has a meaningful relative.\n**Drag and Drop:** File/s can be drag from finder/explorer window and drop into upload field.\n\n## Features (With Code Samples)\n\nA standard single upload field:\n\n```html\n<ids-upload label=\"Upload a File\"></ids-upload>\n```\n\nA field that allows multiple files to be uploaded\n\n```html\n<ids-upload label=\"Multiple Files\" multiple=\"true\"></ids-upload>\n```\n\nOption to limit the file types to be uploaded\n\n```html\n<ids-upload label=\"Upload a File (.cvs,.xls,.xlsx)\" accept=\".cvs,.xls,.xlsx\"></ids-upload>\n```\n\nReadonly upload field\n\n```html\n<ids-upload label=\"Readonly\" readonly=\"true\"></ids-upload>\n```\n\nDisabled upload field\n\n```html\n<ids-upload label=\"Disabled\" disabled=\"true\"></ids-upload>\n```\n\nUpload field with dirty tracker\n\n```html\n<ids-upload label=\"Dirty Tracker\" dirty-tracker=\"true\"></ids-upload>\n```\n\nUpload field with required validation\n\n```html\n<ids-upload label=\"Required\" validate=\"required\"></ids-upload>\n```\n\nUpload field as tabbable\n\n```html\n<ids-upload label=\"Tabbable\" tabbable></ids-upload>\n```\n\nUpload field with hidden label state\n\n```html\n<ids-upload label=\"Label State (hidden)\" label-state=\"hidden\"></ids-upload>\n```\n\nUpload field with collapsed label state\n\n```html\n<ids-upload label=\"Label State (collapsed)\" label-state=\"collapsed\"></ids-upload>\n```\n\nUpload field as compact mode\n\n```html\n<ids-upload label=\"Compact\" compact=\"true\"></ids-upload>\n```\n\nUpload field with types of field heights\n\n```html\n<ids-upload field-height=\"xs\" label=\"Extra Small (compact)\"></ids-upload>\n<ids-upload field-height=\"sm\" label=\"Small\"></ids-upload>\n<ids-upload field-height=\"md\" label=\"Medium (default)\"></ids-upload>\n<ids-upload field-height=\"lg\" label=\"Large\"></ids-upload>\n```\n\nUpload field with types of sizes\n\n```html\n<ids-upload size=\"xs\" label=\"Extra Small\"></ids-upload>\n<ids-upload size=\"sm\" label=\"Small\"></ids-upload>\n<ids-upload size=\"mm\" label=\"Small - Medium\"></ids-upload>\n<ids-upload size=\"md\" label=\"Medium (default)\"></ids-upload>\n<ids-upload size=\"lg\" label=\"Large\"></ids-upload>\n<ids-upload size=\"full\" label=\"Full\"></ids-upload>\n```\n\n## Settings (Attributes)\n\n-`autoselect` {boolean} Set the text to auto select on focus. For more info see [ids-autoselect-mixin/README.md](../../mixins/ids-autoselect-mixin/README.md).\n- `accept` {string} sets limit the file types to be uploaded.\n- `colorVariant` {string} set the current color variant.\n- `compact` {boolean} sets the component to be compact mode.\n- `dirty-tracker` {boolean} sets the dirty tracking feature on to indicate a changed field. See [Ids Dirty Tracker Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-dirty-tracker-mixin/README.md) for more information.\n- `disabled` {boolean} sets to disabled state.\n- `fieldHeight` {string} defines the field height. See [Ids Field Height Mixin](https://oxford.awsdev.infor.com/infor-design/enterprise-wc/-/tree/main//src/mixins/ids-field-height-mixin/README.md) for more information.\n- `label` {string} sets the label text for text input.\n- `labelFiletype` {string} sets the label text for file input.\n- `language` {string} Sets the language for RTL and inner labels\n- `labelRequired` {boolean} Sets the validation required indicator on label text, it's default to `true`\n- `labelState` {string} indicates that a label is hidden (note that for accessibility reasons, `label` should still\n- `multiple` {boolean} sets to allows multiple files to be uploaded.\n- `noMargins` {boolean} sets whether or not no-margins around the component.\n- `textEllipsis` {boolean} sets ellipsis to be shown on text input.\n- `placeholder` {string} sets the input placeholder text.\n- `size` {'sm '|'md'|'lg'|'full'|string} sets the size (width) of input, it will set `md` as defaults.\n- `readonly` {boolean} sets to readonly state.\n- `tabbable` {boolean} When set to `true`, allows the trigger button to be included in the tab order. By default, the trigger button is not tabbable, but for accessibility reasons it can be made tabbable when needed.\n- `triggerLabel` {string} sets the label text for trigger button.\n- `validate` {string} sets text input validation rules, use `space` to add multiple validation rules.\n- `validationEvents` {string} sets text input validation events, use `space` to add multiple validation rules, it will set `blur change` as defaults.\n- `value` {string} sets text input value.\n- `label-position` {string} Controls the position of the label relative to the input field. Options are:\n  - `top` (default): Label appears above the input field\n  - `inline-start`: Label appears at the start of the input (left in LTR, right in RTL)\n  - `inline-end`: Label appears at the end of the input (right in LTR, left in RTL)\n- `label-width` {string} Sets the width of the label when using inline positioning. Can be any valid CSS width value (e.g., '120px', '10rem', 'auto'). Default is '140px' when not specified.\n- `label-align-y` {string} Controls the vertical alignment of the label when using inline positioning. Options are:\n  - `baseline` (default): Aligns the text baseline of the label with the input\n  - `center`: Centers the label vertically relative to the input\n  - `flex-start`: Aligns the label to the top of the input\n  - `flex-end`: Aligns the label to the bottom of the input\n  - `stretch`: Stretches the label to match the height of the input\n\n## Keyboard Guidelines\n\n- <kbd>Tab</kbd> and <kbd>Shift Tab</kbd> moves focus into the input field to/from the next focusable item in the tab order.\n- <kbd>Enter</kbd>, <kbd>Space</kbd> Open the file upload dialog box.\n- <kbd>Backspace</kbd> Clear the selected value.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Replace any calls to `inforFileField()` with `.fileupload()`\n- Replace class `inforLabel` with `label`\n- Replace class `inforFileField` with `fileupload`\n- Make sure the `<label>` wraps the `<input>` element\n\n**4.x to 5.x**\n\n- Markup has changed to a custom element `<ids-upload></ids-upload>`\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles\n- Shows percent progress on file\n\n```html\n<!-- 4.x fileupload example -->\n<div class=\"field\">\n  <label for=\"fileupload\">Upload a File</label>\n  <input type=\"file\" class=\"fileupload\" id=\"fileupload\" name=\"fileupload\"/>\n</div>\n\n<!-- this is the same using the WebComponent -->\n<ids-upload label=\"Upload a File\"></ids-upload>\n```\n"}},{"name":"ids-upload-advanced-file","attributes":[{"name":"loaded","description":"Get the bytes of the file is uploaded","values":[]},{"name":"loaded-formatted","description":"Get the bytes loaded value formatted (for example 10M)","values":[]},{"name":"size-formatted","description":"Get formatted size value","values":[]},{"name":"close-button-text","description":"Get text for close button","values":[]},{"name":"start-button-text","description":"Get text for start button","values":[]},{"name":"progress-label-text","description":"Get text for progress label","values":[]},{"name":"error-html","description":"Get error html","values":[]},{"name":"disabled","description":"Sets the whole file element to disabled","values":[]},{"name":"error","description":"Sets the file state to show there was an error during the file operations","values":[]},{"name":"file-name","description":"Sets the file name","values":[]},{"name":"size","description":"Sets the file size in bytes","values":[]},{"name":"status","description":"Sets the file status","values":[]},{"name":"value","description":"Sets the progress bar value","values":[]}],"description":{"kind":"markdown","value":"# ids-upload-advanced\n\n## Description\n\nThe IDS Upload Advanced component is a web component that contains an API that makes it easy to set functionality such as limit the file types, max file size, max number of files to be uploaded. It shows currently uploading files with a progress indicator. It l contains functionality to display the file status, error, progress and other functionality.\n\n## Use Cases\n\n- Upload files to a server with drag and drop or use browse file link to select a file\n- Displays the progress of the file upload process\n- Allows to aborted uploading files and manage upload files\n\n## Terminology\n\n**Drop Area:** An html element that display as drag and drop files target area.\n**Browse File Link:** A link to open the browse file window in lieu of drag drop\n\n## Features (With Code Samples)\n\nA standard upload advanced element:\n\n```html\n<ids-upload-advanced></ids-upload-advanced>\n```\n\nSet the whole upload advanced element to disabled. Note that making the component `disabled` while currently in the process of uploading, will not stop uploading.\n\n```html\n<ids-upload-advanced disabled=\"true\"></ids-upload-advanced>\n```\n\nSet to hide the browse link:\n\n```html\n<ids-upload-advanced show-browse-link=\"false\"></ids-upload-advanced>\n```\n\nSet to not allow automatic start of upload after files have been dropped or added via browser.\n\n```html\n<ids-upload-advanced auto-start=\"false\"></ids-upload-advanced>\n```\n\nSet custom icon in main drop area:\n\n```html\n<ids-upload-advanced icon=\"cloud\"></ids-upload-advanced>\n```\n\nAdd limit the file types (.png, .jpg):\n\n```html\n<ids-upload-advanced accept=\".png, .jpg\"></ids-upload-advanced>\n```\n\nSet max file size (in bytes), can be uploaded. An error will be shown if the file is over the limit.\n\n```html\n<ids-upload-advanced max-file-size=\"2097152\"></ids-upload-advanced>\n```\n\nSet max number of files in total, that can be uploaded:\n\n```html\n<ids-upload-advanced max-files=\"5\"></ids-upload-advanced>\n```\n\nSet max files can be in process uploading at one time.\n\n```html\n<ids-upload-advanced max-files-in-process=\"2\"></ids-upload-advanced>\n```\n\nSet custom param name, that might be used to read data from a server API.\n\n```html\n<ids-upload-advanced param-name=\"someCustomParamName\"></ids-upload-advanced>\n```\n\nSet the custom text strings using the named slots.\n\n```html\n<ids-upload-advanced>\n  <span slot=\"text-btn-cancel\">Cancel</span>\n  <span slot=\"text-btn-close-error\">Close</span>\n  <span slot=\"text-btn-remove\">Remove</span>\n  <span slot=\"text-droparea\">Drag and Drop Here</span>\n  <span slot=\"text-droparea-with-browse\">Drag/Drop here or Click {browseLink} to Browse.</span>\n  <span slot=\"text-droparea-with-browse-link\">here</span>\n  <span slot=\"text-progress-label\">{percent}% ({loaded}) loaded form total {size} - {file-name}</span>\n</ids-upload-advanced>\n```\n\nSet the custom error strings this way:\n\n```html\n<ids-upload-advanced accept=\".png\" max-files=\"5\" max-files-in-process=\"2\" max-file-size=\"1000000\">\n  <span slot=\"error-max-files\">Max files error</span>\n  <span slot=\"error-max-files-in-process\">Max files in process error</span>\n  <span slot=\"error-accept-file-type\">Limit file types error</span>\n  <span slot=\"error-max-file-size\">Max file size error</span>\n  <span slot=\"error-url\">Required URL error</span>\n  <span slot=\"error-xhr-headers\">XHRHeaders error</span>\n</ids-upload-advanced>\n```\n\nSet extra headers to send with XHR, when use component `XMLHttpRequest` to send files. XHR Headers must be a valid JSON string contains array of name/value objects.\n\n```html\n<ids-upload-advanced>\n  <span slot=\"xhr-headers\">[{ \"name\": \"header1\", \"value\": \"header1-value\" }]</span>\n</ids-upload-advanced>\n```\n\nSet the url to use component `XMLHttpRequest` to send files:\n\n```html\n<ids-upload-advanced url=\"http://somedomain.com/upload\"></ids-upload-advanced>\n```\n\nSet the method, when use component `XMLHttpRequest` method to send files. The default is set `POST`, it can be set to `PUT`.\n\n```html\n<ids-upload-advanced method=\"PUT\"></ids-upload-advanced>\n```\n\nYou can also set the custom `Send()` method with the JS api.\n\n```html\n<ids-upload-advanced id=\"some-id\"></ids-upload-advanced>\n```\n\n```javascript\n// Custom send method\nfunction customSendMethodXhr(formData, uiElem) {\n  const xhr = new XMLHttpRequest();\n  // attach ui method to set updates\n  xhr.upload.addEventListener('progress', uiElem.progressHandler.bind(uiElem), false);\n  xhr.addEventListener('load', uiElem.completeHandler.bind(uiElem), false);\n  xhr.addEventListener('error', uiElem.errorHandler.bind(uiElem), false);\n  xhr.addEventListener('abort', uiElem.abortHandler.bind(uiElem), false);\n\n  xhr.open('POST', 'http://somedomain/upload'); // Using post method\n  xhr.send(formData);\n\n  // File abort\n  uiElem?.addEventListener('abort', () => {\n    xhr.abort();\n  });\n}\n\n// Attach this custom send method, to upload element.\ndocument.addEventListener('DOMContentLoaded', () => {\n  const uploadEl = document.querySelector('#some-id');\n  uploadEl.send = customSendMethodXhr;\n});\n```\n\nSet an arbitrary error message.\n\n```html\n<ids-button id=\"error-btn\" appearance=\"secondary\">\n  <span>Set Error</span>\n</ids-button>\n<ids-upload-advanced id=\"error-el\"></ids-upload-advanced>\n```\n\n```javascript\nconst errorBtn = document.querySelector('#error-btn');\nconst errorEl = document.querySelector('#error-el');\nerrorBtn?.addEventListener('click', () => {\n  errorEl.setError({ message: 'Arbitrary error message' });\n});\n```\n\nSet an arbitrary error message on each file.\n-Add file/s to upload before apply error. It can only be apply before `completed` state.\n\n```html\n<ids-button id=\"error-files-btn\" appearance=\"secondary\">\n  <span>Set Error on each file</span>\n</ids-button>\n<ids-upload-advanced id=\"error-files-el\"></ids-upload-advanced>\n```\n\n```javascript\nconst errorFilesBtn = document.querySelector('#error-files-btn');\nconst errorFilesEl = document.querySelector('#error-files-el');\nerrorFilesBtn?.addEventListener('click', () => {\n  // fileNodes: can be use `all`, `notStarted`, `inProcess`\n  const fileNodes: any[] = errorFilesEl.all;\n  if (fileNodes.length) {\n    errorFilesEl.setError({ message: 'File arbitrary error message', fileNodes });\n  }\n});\n```\n\n## Settings (Attributes)\n\n### IDS Upload Advanced attributes and properties\n\n- `accept` {string} sets a limit on the file types that can be uploaded.\n- `auto-start` {boolean|string} allow automatic start upload, after files have been dropped or added.\n- `disabled` {boolean|string} sets the whole upload advanced element to disabled.\n- `icon` {string} sets the icon to be use in main drop area.\n- `icon-size` {string} sets the icon size to be use in main drop area.\n- `max-file-size` {number|string} sets the max file size in bytes.\n- `max-files` {number|string} sets the max number of files can be uploaded.\n- `max-files-in-process` {number|string} sets the max number of files can be uploaded while in process.\n- `method` {string} sets the method when use component `XMLHttpRequest` method to send files.\n- `param-name` {string} sets the variable name to read from server.\n- `show-browse-link` {boolean|string} sets a link to browse files to upload.\n- `url` {string} sets the url to use component `XMLHttpRequest` to send files.\n\n### IDS Upload Advanced File (file-component)\n\n- `disabled` {boolean} set the whole file element to disabled.\n- `error` {string} set the file state to show there was an error during the file operations.\n- `file-name` {string} set the file name.\n- `size` {number|string} set the file size in bytes.\n- `status` {string} set the file status.\n- `value` {number|string} set the progress bar value.\n\n## Text strings (use with slot)\n\n- `text-btn-cancel` Text for `x-close` button, while file in process.\n- `text-btn-cancel-all` Text for `cancel-all` button, when file status not-started.\n- `text-btn-close-error` Text for `x-close` button, when file gets error.\n- `text-btn-remove` Text for `x-close` button, when file complete uploading.\n- `text-btn-start` Text for `start` button, when file status not-started.\n- `text-btn-start-all` Text for `start-all` button, when file status not-started.\n- `text-droparea` Text to show in drop area.\n- `text-droparea-with-browse` Text to show in drop area when `show-browse-link` set to true.\n- `text-droparea-with-browse-link` Text for `browse` link, when `show-browse-link` set to true.\n- `text-progress-label` Text to set the label on progress component.\n\n## Error strings (use with slot)\n\n- `error-max-files` Error text to show when exceeded maximum number of files.\n- `error-max-files-in-process` Error text to show when exceeded maximum number of files in process.\n- `error-accept-file-type` Error text for limit the file types to be uploaded.\n- `error-max-file-size` Error text to show when exceeded maximum file size.\n- `error-url` Error text to show when url attribute not set.\n- `error-xhr-headers` Error text to show when given value not a valid JSON array of key/value objects.\n\n## Themeable Parts\n\n- `container` allows you to further style the main container element\n- `label` allows you to further style the label element\n- `link` allows you to further style the hyperlink element\n\n## Extra headers JSON array of key/value (use slot)\n\n- `xhr-headers` sets the HTTP headers to be send along if used component's `XMLHttpRequest` method. (*XHR Headers must be a valid JSON string contains array of name/value objects*)\n\n## Get current attached files from API (updated files data)\n\n- `all` List of all the files added.\n- `notStarted` List of files which not start uploading yet.\n- `inProcess` List of files in-process.\n- `aborted` List of files aborted.\n- `errored` List of all the files had error.\n- `completed` List of all completed files.\n\n## Clearing/Removing Files\n\nTo clear all files:\n\n```javascript\nconst uploadEl = document.querySelector('ids-upload-advanced');\nuploadEl.all.forEach(file => file.elem.remove());\n```\n\nTo clear specific files by status:\n\n```javascript\nconst uploadEl = document.querySelector('ids-upload-advanced');\n// Clear completed files only\nuploadEl.completed.forEach(file => file.elem.remove());\n// Clear errored files only\nuploadEl.errored.forEach(file => file.elem.remove());\n```\n\n## Events that triggered\n\n### Triggered on IdsUploadAdvanced\n\n- `filesdragenter` Triggered when files enter to drag area.\n- `filesdrop` Triggered when files dropped in to drag area.\n- `notstartedupload` Triggered when file sent to not-started status.\n- `beginupload` Triggered when each file sent to in-process.\n- `abort` Triggered when each file get abort.\n- `error` Triggered when each file get error.\n- `complete` Triggered when each file complete uploading.\n- `closebuttonclick` Triggered when clicked on close button in each file ui-element.\n\n### Triggered on IdsUploadAdvancedFile (file-component)\n\n- `notstartedupload` Triggered when file sent to not-started status.\n- `beginupload` Triggered when file sent to in-process.\n- `abort` Triggered when file get abort.\n- `error` Triggered when file get error.\n- `complete` Triggered when file complete uploading.\n- `closebuttonclick` Triggered when clicked on close button.\n\n## Keyboard Guidelines\n\nThe Ids Upload Advanced doesn't contain any interactions beyond a standard keys:\n\n- <kbd>Tab</kbd> and <kbd>Shift Tab</kbd> moves focus into the edit field to/from the next focusable item in the tab order.\n- <kbd>Space</kbd> and <kbd>Enter</kbd> open files browse window if on file browse link and behave as clicked on each buttons for example close button.\n\n## Responsive Guidelines\n\n- Its set as `block` element with `100%` width, so set the desired width on parent container in order to set the width.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- FileUploadAdvanced was a new component created in v4.2.0\n\n**4.x to 5.x**\n\n- Markup has changed to a custom element `<ids-upload-advanced></ids-upload-advanced>`\n- Each file's UI sections are represented by their own custom elements `<ids-upload-advanced-file></ids-upload-advanced-file>`\n- Each file's status can be observed by simple component properties, like `value`, `error`, or `size`.\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles.\n\n```html\n<!-- 4.x fileupload-advanced example -->\n<div class=\"field\">\n  <div class=\"fileupload-advanced\" data-options=\"{allowedTypes: 'jpg|png|gif'}\">\n</div>\n\n<!-- This is the same upload-advanced using a WebComponent -->\n<ids-upload-advanced accept=\".jpg, .png, .gif\"></ids-upload-advanced>\n```\n"}},{"name":"ids-upload-advanced-shared","description":{"kind":"markdown","value":"# ids-upload-advanced\n\n## Description\n\nThe IDS Upload Advanced component is a web component that contains an API that makes it easy to set functionality such as limit the file types, max file size, max number of files to be uploaded. It shows currently uploading files with a progress indicator. It l contains functionality to display the file status, error, progress and other functionality.\n\n## Use Cases\n\n- Upload files to a server with drag and drop or use browse file link to select a file\n- Displays the progress of the file upload process\n- Allows to aborted uploading files and manage upload files\n\n## Terminology\n\n**Drop Area:** An html element that display as drag and drop files target area.\n**Browse File Link:** A link to open the browse file window in lieu of drag drop\n\n## Features (With Code Samples)\n\nA standard upload advanced element:\n\n```html\n<ids-upload-advanced></ids-upload-advanced>\n```\n\nSet the whole upload advanced element to disabled. Note that making the component `disabled` while currently in the process of uploading, will not stop uploading.\n\n```html\n<ids-upload-advanced disabled=\"true\"></ids-upload-advanced>\n```\n\nSet to hide the browse link:\n\n```html\n<ids-upload-advanced show-browse-link=\"false\"></ids-upload-advanced>\n```\n\nSet to not allow automatic start of upload after files have been dropped or added via browser.\n\n```html\n<ids-upload-advanced auto-start=\"false\"></ids-upload-advanced>\n```\n\nSet custom icon in main drop area:\n\n```html\n<ids-upload-advanced icon=\"cloud\"></ids-upload-advanced>\n```\n\nAdd limit the file types (.png, .jpg):\n\n```html\n<ids-upload-advanced accept=\".png, .jpg\"></ids-upload-advanced>\n```\n\nSet max file size (in bytes), can be uploaded. An error will be shown if the file is over the limit.\n\n```html\n<ids-upload-advanced max-file-size=\"2097152\"></ids-upload-advanced>\n```\n\nSet max number of files in total, that can be uploaded:\n\n```html\n<ids-upload-advanced max-files=\"5\"></ids-upload-advanced>\n```\n\nSet max files can be in process uploading at one time.\n\n```html\n<ids-upload-advanced max-files-in-process=\"2\"></ids-upload-advanced>\n```\n\nSet custom param name, that might be used to read data from a server API.\n\n```html\n<ids-upload-advanced param-name=\"someCustomParamName\"></ids-upload-advanced>\n```\n\nSet the custom text strings using the named slots.\n\n```html\n<ids-upload-advanced>\n  <span slot=\"text-btn-cancel\">Cancel</span>\n  <span slot=\"text-btn-close-error\">Close</span>\n  <span slot=\"text-btn-remove\">Remove</span>\n  <span slot=\"text-droparea\">Drag and Drop Here</span>\n  <span slot=\"text-droparea-with-browse\">Drag/Drop here or Click {browseLink} to Browse.</span>\n  <span slot=\"text-droparea-with-browse-link\">here</span>\n  <span slot=\"text-progress-label\">{percent}% ({loaded}) loaded form total {size} - {file-name}</span>\n</ids-upload-advanced>\n```\n\nSet the custom error strings this way:\n\n```html\n<ids-upload-advanced accept=\".png\" max-files=\"5\" max-files-in-process=\"2\" max-file-size=\"1000000\">\n  <span slot=\"error-max-files\">Max files error</span>\n  <span slot=\"error-max-files-in-process\">Max files in process error</span>\n  <span slot=\"error-accept-file-type\">Limit file types error</span>\n  <span slot=\"error-max-file-size\">Max file size error</span>\n  <span slot=\"error-url\">Required URL error</span>\n  <span slot=\"error-xhr-headers\">XHRHeaders error</span>\n</ids-upload-advanced>\n```\n\nSet extra headers to send with XHR, when use component `XMLHttpRequest` to send files. XHR Headers must be a valid JSON string contains array of name/value objects.\n\n```html\n<ids-upload-advanced>\n  <span slot=\"xhr-headers\">[{ \"name\": \"header1\", \"value\": \"header1-value\" }]</span>\n</ids-upload-advanced>\n```\n\nSet the url to use component `XMLHttpRequest` to send files:\n\n```html\n<ids-upload-advanced url=\"http://somedomain.com/upload\"></ids-upload-advanced>\n```\n\nSet the method, when use component `XMLHttpRequest` method to send files. The default is set `POST`, it can be set to `PUT`.\n\n```html\n<ids-upload-advanced method=\"PUT\"></ids-upload-advanced>\n```\n\nYou can also set the custom `Send()` method with the JS api.\n\n```html\n<ids-upload-advanced id=\"some-id\"></ids-upload-advanced>\n```\n\n```javascript\n// Custom send method\nfunction customSendMethodXhr(formData, uiElem) {\n  const xhr = new XMLHttpRequest();\n  // attach ui method to set updates\n  xhr.upload.addEventListener('progress', uiElem.progressHandler.bind(uiElem), false);\n  xhr.addEventListener('load', uiElem.completeHandler.bind(uiElem), false);\n  xhr.addEventListener('error', uiElem.errorHandler.bind(uiElem), false);\n  xhr.addEventListener('abort', uiElem.abortHandler.bind(uiElem), false);\n\n  xhr.open('POST', 'http://somedomain/upload'); // Using post method\n  xhr.send(formData);\n\n  // File abort\n  uiElem?.addEventListener('abort', () => {\n    xhr.abort();\n  });\n}\n\n// Attach this custom send method, to upload element.\ndocument.addEventListener('DOMContentLoaded', () => {\n  const uploadEl = document.querySelector('#some-id');\n  uploadEl.send = customSendMethodXhr;\n});\n```\n\nSet an arbitrary error message.\n\n```html\n<ids-button id=\"error-btn\" appearance=\"secondary\">\n  <span>Set Error</span>\n</ids-button>\n<ids-upload-advanced id=\"error-el\"></ids-upload-advanced>\n```\n\n```javascript\nconst errorBtn = document.querySelector('#error-btn');\nconst errorEl = document.querySelector('#error-el');\nerrorBtn?.addEventListener('click', () => {\n  errorEl.setError({ message: 'Arbitrary error message' });\n});\n```\n\nSet an arbitrary error message on each file.\n-Add file/s to upload before apply error. It can only be apply before `completed` state.\n\n```html\n<ids-button id=\"error-files-btn\" appearance=\"secondary\">\n  <span>Set Error on each file</span>\n</ids-button>\n<ids-upload-advanced id=\"error-files-el\"></ids-upload-advanced>\n```\n\n```javascript\nconst errorFilesBtn = document.querySelector('#error-files-btn');\nconst errorFilesEl = document.querySelector('#error-files-el');\nerrorFilesBtn?.addEventListener('click', () => {\n  // fileNodes: can be use `all`, `notStarted`, `inProcess`\n  const fileNodes: any[] = errorFilesEl.all;\n  if (fileNodes.length) {\n    errorFilesEl.setError({ message: 'File arbitrary error message', fileNodes });\n  }\n});\n```\n\n## Settings (Attributes)\n\n### IDS Upload Advanced attributes and properties\n\n- `accept` {string} sets a limit on the file types that can be uploaded.\n- `auto-start` {boolean|string} allow automatic start upload, after files have been dropped or added.\n- `disabled` {boolean|string} sets the whole upload advanced element to disabled.\n- `icon` {string} sets the icon to be use in main drop area.\n- `icon-size` {string} sets the icon size to be use in main drop area.\n- `max-file-size` {number|string} sets the max file size in bytes.\n- `max-files` {number|string} sets the max number of files can be uploaded.\n- `max-files-in-process` {number|string} sets the max number of files can be uploaded while in process.\n- `method` {string} sets the method when use component `XMLHttpRequest` method to send files.\n- `param-name` {string} sets the variable name to read from server.\n- `show-browse-link` {boolean|string} sets a link to browse files to upload.\n- `url` {string} sets the url to use component `XMLHttpRequest` to send files.\n\n### IDS Upload Advanced File (file-component)\n\n- `disabled` {boolean} set the whole file element to disabled.\n- `error` {string} set the file state to show there was an error during the file operations.\n- `file-name` {string} set the file name.\n- `size` {number|string} set the file size in bytes.\n- `status` {string} set the file status.\n- `value` {number|string} set the progress bar value.\n\n## Text strings (use with slot)\n\n- `text-btn-cancel` Text for `x-close` button, while file in process.\n- `text-btn-cancel-all` Text for `cancel-all` button, when file status not-started.\n- `text-btn-close-error` Text for `x-close` button, when file gets error.\n- `text-btn-remove` Text for `x-close` button, when file complete uploading.\n- `text-btn-start` Text for `start` button, when file status not-started.\n- `text-btn-start-all` Text for `start-all` button, when file status not-started.\n- `text-droparea` Text to show in drop area.\n- `text-droparea-with-browse` Text to show in drop area when `show-browse-link` set to true.\n- `text-droparea-with-browse-link` Text for `browse` link, when `show-browse-link` set to true.\n- `text-progress-label` Text to set the label on progress component.\n\n## Error strings (use with slot)\n\n- `error-max-files` Error text to show when exceeded maximum number of files.\n- `error-max-files-in-process` Error text to show when exceeded maximum number of files in process.\n- `error-accept-file-type` Error text for limit the file types to be uploaded.\n- `error-max-file-size` Error text to show when exceeded maximum file size.\n- `error-url` Error text to show when url attribute not set.\n- `error-xhr-headers` Error text to show when given value not a valid JSON array of key/value objects.\n\n## Themeable Parts\n\n- `container` allows you to further style the main container element\n- `label` allows you to further style the label element\n- `link` allows you to further style the hyperlink element\n\n## Extra headers JSON array of key/value (use slot)\n\n- `xhr-headers` sets the HTTP headers to be send along if used component's `XMLHttpRequest` method. (*XHR Headers must be a valid JSON string contains array of name/value objects*)\n\n## Get current attached files from API (updated files data)\n\n- `all` List of all the files added.\n- `notStarted` List of files which not start uploading yet.\n- `inProcess` List of files in-process.\n- `aborted` List of files aborted.\n- `errored` List of all the files had error.\n- `completed` List of all completed files.\n\n## Clearing/Removing Files\n\nTo clear all files:\n\n```javascript\nconst uploadEl = document.querySelector('ids-upload-advanced');\nuploadEl.all.forEach(file => file.elem.remove());\n```\n\nTo clear specific files by status:\n\n```javascript\nconst uploadEl = document.querySelector('ids-upload-advanced');\n// Clear completed files only\nuploadEl.completed.forEach(file => file.elem.remove());\n// Clear errored files only\nuploadEl.errored.forEach(file => file.elem.remove());\n```\n\n## Events that triggered\n\n### Triggered on IdsUploadAdvanced\n\n- `filesdragenter` Triggered when files enter to drag area.\n- `filesdrop` Triggered when files dropped in to drag area.\n- `notstartedupload` Triggered when file sent to not-started status.\n- `beginupload` Triggered when each file sent to in-process.\n- `abort` Triggered when each file get abort.\n- `error` Triggered when each file get error.\n- `complete` Triggered when each file complete uploading.\n- `closebuttonclick` Triggered when clicked on close button in each file ui-element.\n\n### Triggered on IdsUploadAdvancedFile (file-component)\n\n- `notstartedupload` Triggered when file sent to not-started status.\n- `beginupload` Triggered when file sent to in-process.\n- `abort` Triggered when file get abort.\n- `error` Triggered when file get error.\n- `complete` Triggered when file complete uploading.\n- `closebuttonclick` Triggered when clicked on close button.\n\n## Keyboard Guidelines\n\nThe Ids Upload Advanced doesn't contain any interactions beyond a standard keys:\n\n- <kbd>Tab</kbd> and <kbd>Shift Tab</kbd> moves focus into the edit field to/from the next focusable item in the tab order.\n- <kbd>Space</kbd> and <kbd>Enter</kbd> open files browse window if on file browse link and behave as clicked on each buttons for example close button.\n\n## Responsive Guidelines\n\n- Its set as `block` element with `100%` width, so set the desired width on parent container in order to set the width.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- FileUploadAdvanced was a new component created in v4.2.0\n\n**4.x to 5.x**\n\n- Markup has changed to a custom element `<ids-upload-advanced></ids-upload-advanced>`\n- Each file's UI sections are represented by their own custom elements `<ids-upload-advanced-file></ids-upload-advanced-file>`\n- Each file's status can be observed by simple component properties, like `value`, `error`, or `size`.\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles.\n\n```html\n<!-- 4.x fileupload-advanced example -->\n<div class=\"field\">\n  <div class=\"fileupload-advanced\" data-options=\"{allowedTypes: 'jpg|png|gif'}\">\n</div>\n\n<!-- This is the same upload-advanced using a WebComponent -->\n<ids-upload-advanced accept=\".jpg, .png, .gif\"></ids-upload-advanced>\n```\n"}},{"name":"ids-upload-advanced","attributes":[{"name":"files","values":[]},{"name":"xhr-headers","values":[]},{"name":"send","values":[]},{"name":"file-input","values":[]},{"name":"droparea","values":[]},{"name":"filesarea","values":[]},{"name":"all","description":"Get list of all added files","values":[]},{"name":"not-started","description":"Get list of not started files","values":[]},{"name":"in-process","description":"Get list of in process files","values":[]},{"name":"aborted","description":"Get list of aborted files","values":[]},{"name":"errored","description":"Get list of errored files","values":[]},{"name":"completed","description":"Get list of completed files","values":[]},{"name":"file-slots-template","description":"Get template for current slots to use in file element","values":[]},{"name":"file-template","description":"Get template for file element","values":[]},{"name":"toolbar-template","description":"Get template for toolbar element","values":[]},{"name":"error-max-files-val","description":"Get error max files value","values":[]},{"name":"show-browse-link-val","description":"Get show browse link value","values":[]},{"name":"accept","description":"Sets limit the file types to be uploaded","values":[]},{"name":"auto-start","description":"Allow automatic start upload, after files have been dropped or added","values":[]},{"name":"disabled","description":"Sets the whole element to disabled","values":[]},{"name":"icon","description":"Sets the icon to be use in main drop area","values":[]},{"name":"icon-size","description":"Sets the icon size to be use in main drop area","values":[]},{"name":"max-file-size","description":"Sets the max file size in bytes","values":[]},{"name":"max-files","description":"Sets the max number of files can be uploaded","values":[]},{"name":"max-files-in-process","description":"Sets the max number of files can be uploaded while in process","values":[]},{"name":"method","description":"Sets the method to use component XMLHttpRequest method to send files","values":[]},{"name":"param-name","description":"Sets the variable name to read from server","values":[]},{"name":"show-browse-link","description":"Sets a link to browse files to upload","values":[]},{"name":"url","description":"Sets the url to use component XMLHttpRequest method to send files","values":[]}],"description":{"kind":"markdown","value":"# ids-upload-advanced\n\n## Description\n\nThe IDS Upload Advanced component is a web component that contains an API that makes it easy to set functionality such as limit the file types, max file size, max number of files to be uploaded. It shows currently uploading files with a progress indicator. It l contains functionality to display the file status, error, progress and other functionality.\n\n## Use Cases\n\n- Upload files to a server with drag and drop or use browse file link to select a file\n- Displays the progress of the file upload process\n- Allows to aborted uploading files and manage upload files\n\n## Terminology\n\n**Drop Area:** An html element that display as drag and drop files target area.\n**Browse File Link:** A link to open the browse file window in lieu of drag drop\n\n## Features (With Code Samples)\n\nA standard upload advanced element:\n\n```html\n<ids-upload-advanced></ids-upload-advanced>\n```\n\nSet the whole upload advanced element to disabled. Note that making the component `disabled` while currently in the process of uploading, will not stop uploading.\n\n```html\n<ids-upload-advanced disabled=\"true\"></ids-upload-advanced>\n```\n\nSet to hide the browse link:\n\n```html\n<ids-upload-advanced show-browse-link=\"false\"></ids-upload-advanced>\n```\n\nSet to not allow automatic start of upload after files have been dropped or added via browser.\n\n```html\n<ids-upload-advanced auto-start=\"false\"></ids-upload-advanced>\n```\n\nSet custom icon in main drop area:\n\n```html\n<ids-upload-advanced icon=\"cloud\"></ids-upload-advanced>\n```\n\nAdd limit the file types (.png, .jpg):\n\n```html\n<ids-upload-advanced accept=\".png, .jpg\"></ids-upload-advanced>\n```\n\nSet max file size (in bytes), can be uploaded. An error will be shown if the file is over the limit.\n\n```html\n<ids-upload-advanced max-file-size=\"2097152\"></ids-upload-advanced>\n```\n\nSet max number of files in total, that can be uploaded:\n\n```html\n<ids-upload-advanced max-files=\"5\"></ids-upload-advanced>\n```\n\nSet max files can be in process uploading at one time.\n\n```html\n<ids-upload-advanced max-files-in-process=\"2\"></ids-upload-advanced>\n```\n\nSet custom param name, that might be used to read data from a server API.\n\n```html\n<ids-upload-advanced param-name=\"someCustomParamName\"></ids-upload-advanced>\n```\n\nSet the custom text strings using the named slots.\n\n```html\n<ids-upload-advanced>\n  <span slot=\"text-btn-cancel\">Cancel</span>\n  <span slot=\"text-btn-close-error\">Close</span>\n  <span slot=\"text-btn-remove\">Remove</span>\n  <span slot=\"text-droparea\">Drag and Drop Here</span>\n  <span slot=\"text-droparea-with-browse\">Drag/Drop here or Click {browseLink} to Browse.</span>\n  <span slot=\"text-droparea-with-browse-link\">here</span>\n  <span slot=\"text-progress-label\">{percent}% ({loaded}) loaded form total {size} - {file-name}</span>\n</ids-upload-advanced>\n```\n\nSet the custom error strings this way:\n\n```html\n<ids-upload-advanced accept=\".png\" max-files=\"5\" max-files-in-process=\"2\" max-file-size=\"1000000\">\n  <span slot=\"error-max-files\">Max files error</span>\n  <span slot=\"error-max-files-in-process\">Max files in process error</span>\n  <span slot=\"error-accept-file-type\">Limit file types error</span>\n  <span slot=\"error-max-file-size\">Max file size error</span>\n  <span slot=\"error-url\">Required URL error</span>\n  <span slot=\"error-xhr-headers\">XHRHeaders error</span>\n</ids-upload-advanced>\n```\n\nSet extra headers to send with XHR, when use component `XMLHttpRequest` to send files. XHR Headers must be a valid JSON string contains array of name/value objects.\n\n```html\n<ids-upload-advanced>\n  <span slot=\"xhr-headers\">[{ \"name\": \"header1\", \"value\": \"header1-value\" }]</span>\n</ids-upload-advanced>\n```\n\nSet the url to use component `XMLHttpRequest` to send files:\n\n```html\n<ids-upload-advanced url=\"http://somedomain.com/upload\"></ids-upload-advanced>\n```\n\nSet the method, when use component `XMLHttpRequest` method to send files. The default is set `POST`, it can be set to `PUT`.\n\n```html\n<ids-upload-advanced method=\"PUT\"></ids-upload-advanced>\n```\n\nYou can also set the custom `Send()` method with the JS api.\n\n```html\n<ids-upload-advanced id=\"some-id\"></ids-upload-advanced>\n```\n\n```javascript\n// Custom send method\nfunction customSendMethodXhr(formData, uiElem) {\n  const xhr = new XMLHttpRequest();\n  // attach ui method to set updates\n  xhr.upload.addEventListener('progress', uiElem.progressHandler.bind(uiElem), false);\n  xhr.addEventListener('load', uiElem.completeHandler.bind(uiElem), false);\n  xhr.addEventListener('error', uiElem.errorHandler.bind(uiElem), false);\n  xhr.addEventListener('abort', uiElem.abortHandler.bind(uiElem), false);\n\n  xhr.open('POST', 'http://somedomain/upload'); // Using post method\n  xhr.send(formData);\n\n  // File abort\n  uiElem?.addEventListener('abort', () => {\n    xhr.abort();\n  });\n}\n\n// Attach this custom send method, to upload element.\ndocument.addEventListener('DOMContentLoaded', () => {\n  const uploadEl = document.querySelector('#some-id');\n  uploadEl.send = customSendMethodXhr;\n});\n```\n\nSet an arbitrary error message.\n\n```html\n<ids-button id=\"error-btn\" appearance=\"secondary\">\n  <span>Set Error</span>\n</ids-button>\n<ids-upload-advanced id=\"error-el\"></ids-upload-advanced>\n```\n\n```javascript\nconst errorBtn = document.querySelector('#error-btn');\nconst errorEl = document.querySelector('#error-el');\nerrorBtn?.addEventListener('click', () => {\n  errorEl.setError({ message: 'Arbitrary error message' });\n});\n```\n\nSet an arbitrary error message on each file.\n-Add file/s to upload before apply error. It can only be apply before `completed` state.\n\n```html\n<ids-button id=\"error-files-btn\" appearance=\"secondary\">\n  <span>Set Error on each file</span>\n</ids-button>\n<ids-upload-advanced id=\"error-files-el\"></ids-upload-advanced>\n```\n\n```javascript\nconst errorFilesBtn = document.querySelector('#error-files-btn');\nconst errorFilesEl = document.querySelector('#error-files-el');\nerrorFilesBtn?.addEventListener('click', () => {\n  // fileNodes: can be use `all`, `notStarted`, `inProcess`\n  const fileNodes: any[] = errorFilesEl.all;\n  if (fileNodes.length) {\n    errorFilesEl.setError({ message: 'File arbitrary error message', fileNodes });\n  }\n});\n```\n\n## Settings (Attributes)\n\n### IDS Upload Advanced attributes and properties\n\n- `accept` {string} sets a limit on the file types that can be uploaded.\n- `auto-start` {boolean|string} allow automatic start upload, after files have been dropped or added.\n- `disabled` {boolean|string} sets the whole upload advanced element to disabled.\n- `icon` {string} sets the icon to be use in main drop area.\n- `icon-size` {string} sets the icon size to be use in main drop area.\n- `max-file-size` {number|string} sets the max file size in bytes.\n- `max-files` {number|string} sets the max number of files can be uploaded.\n- `max-files-in-process` {number|string} sets the max number of files can be uploaded while in process.\n- `method` {string} sets the method when use component `XMLHttpRequest` method to send files.\n- `param-name` {string} sets the variable name to read from server.\n- `show-browse-link` {boolean|string} sets a link to browse files to upload.\n- `url` {string} sets the url to use component `XMLHttpRequest` to send files.\n\n### IDS Upload Advanced File (file-component)\n\n- `disabled` {boolean} set the whole file element to disabled.\n- `error` {string} set the file state to show there was an error during the file operations.\n- `file-name` {string} set the file name.\n- `size` {number|string} set the file size in bytes.\n- `status` {string} set the file status.\n- `value` {number|string} set the progress bar value.\n\n## Text strings (use with slot)\n\n- `text-btn-cancel` Text for `x-close` button, while file in process.\n- `text-btn-cancel-all` Text for `cancel-all` button, when file status not-started.\n- `text-btn-close-error` Text for `x-close` button, when file gets error.\n- `text-btn-remove` Text for `x-close` button, when file complete uploading.\n- `text-btn-start` Text for `start` button, when file status not-started.\n- `text-btn-start-all` Text for `start-all` button, when file status not-started.\n- `text-droparea` Text to show in drop area.\n- `text-droparea-with-browse` Text to show in drop area when `show-browse-link` set to true.\n- `text-droparea-with-browse-link` Text for `browse` link, when `show-browse-link` set to true.\n- `text-progress-label` Text to set the label on progress component.\n\n## Error strings (use with slot)\n\n- `error-max-files` Error text to show when exceeded maximum number of files.\n- `error-max-files-in-process` Error text to show when exceeded maximum number of files in process.\n- `error-accept-file-type` Error text for limit the file types to be uploaded.\n- `error-max-file-size` Error text to show when exceeded maximum file size.\n- `error-url` Error text to show when url attribute not set.\n- `error-xhr-headers` Error text to show when given value not a valid JSON array of key/value objects.\n\n## Themeable Parts\n\n- `container` allows you to further style the main container element\n- `label` allows you to further style the label element\n- `link` allows you to further style the hyperlink element\n\n## Extra headers JSON array of key/value (use slot)\n\n- `xhr-headers` sets the HTTP headers to be send along if used component's `XMLHttpRequest` method. (*XHR Headers must be a valid JSON string contains array of name/value objects*)\n\n## Get current attached files from API (updated files data)\n\n- `all` List of all the files added.\n- `notStarted` List of files which not start uploading yet.\n- `inProcess` List of files in-process.\n- `aborted` List of files aborted.\n- `errored` List of all the files had error.\n- `completed` List of all completed files.\n\n## Clearing/Removing Files\n\nTo clear all files:\n\n```javascript\nconst uploadEl = document.querySelector('ids-upload-advanced');\nuploadEl.all.forEach(file => file.elem.remove());\n```\n\nTo clear specific files by status:\n\n```javascript\nconst uploadEl = document.querySelector('ids-upload-advanced');\n// Clear completed files only\nuploadEl.completed.forEach(file => file.elem.remove());\n// Clear errored files only\nuploadEl.errored.forEach(file => file.elem.remove());\n```\n\n## Events that triggered\n\n### Triggered on IdsUploadAdvanced\n\n- `filesdragenter` Triggered when files enter to drag area.\n- `filesdrop` Triggered when files dropped in to drag area.\n- `notstartedupload` Triggered when file sent to not-started status.\n- `beginupload` Triggered when each file sent to in-process.\n- `abort` Triggered when each file get abort.\n- `error` Triggered when each file get error.\n- `complete` Triggered when each file complete uploading.\n- `closebuttonclick` Triggered when clicked on close button in each file ui-element.\n\n### Triggered on IdsUploadAdvancedFile (file-component)\n\n- `notstartedupload` Triggered when file sent to not-started status.\n- `beginupload` Triggered when file sent to in-process.\n- `abort` Triggered when file get abort.\n- `error` Triggered when file get error.\n- `complete` Triggered when file complete uploading.\n- `closebuttonclick` Triggered when clicked on close button.\n\n## Keyboard Guidelines\n\nThe Ids Upload Advanced doesn't contain any interactions beyond a standard keys:\n\n- <kbd>Tab</kbd> and <kbd>Shift Tab</kbd> moves focus into the edit field to/from the next focusable item in the tab order.\n- <kbd>Space</kbd> and <kbd>Enter</kbd> open files browse window if on file browse link and behave as clicked on each buttons for example close button.\n\n## Responsive Guidelines\n\n- Its set as `block` element with `100%` width, so set the desired width on parent container in order to set the width.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- FileUploadAdvanced was a new component created in v4.2.0\n\n**4.x to 5.x**\n\n- Markup has changed to a custom element `<ids-upload-advanced></ids-upload-advanced>`\n- Each file's UI sections are represented by their own custom elements `<ids-upload-advanced-file></ids-upload-advanced-file>`\n- Each file's status can be observed by simple component properties, like `value`, `error`, or `size`.\n- If using events, events are now plain JS events.\n- Can now be imported as a single JS file and used with encapsulated styles.\n\n```html\n<!-- 4.x fileupload-advanced example -->\n<div class=\"field\">\n  <div class=\"fileupload-advanced\" data-options=\"{allowedTypes: 'jpg|png|gif'}\">\n</div>\n\n<!-- This is the same upload-advanced using a WebComponent -->\n<ids-upload-advanced accept=\".jpg, .png, .gif\"></ids-upload-advanced>\n```\n"}},{"name":"ids-virtual-scroll","attributes":[{"name":"datasource","values":[]},{"name":"timeout","values":[]},{"name":"initialized","values":[]},{"name":"last-start","values":[]},{"name":"last-end","values":[]},{"name":"event-target","values":[]},{"name":"on-after-virtual-scroll","values":[]},{"name":"string-template","values":[]},{"name":"height","description":"The height of the virtual scroll container","values":[]},{"name":"item-height","description":"The height of each item in the scroller. TODO: support dynamic heights","values":[]},{"name":"buffer-size","description":"Extra padding at the top and bottom so that the data transition smoothly","values":[]},{"name":"#scroll-top","description":"Set the scroll top position and scroll down to that location","values":[]},{"name":"content-height","description":"The height of the content behind the viewport","values":[]},{"name":"item-count","values":[]},{"name":"offset-y","values":[]},{"name":"start-index","values":[]},{"name":"data","description":"Set the data array of the listview","values":[]},{"name":"scroll-target","description":"Set the scroll target to a external parent","values":[]}],"description":{"kind":"markdown","value":"# ids-virtual-scroll\n\n## Description\n\nVirtual scrolling shows up the visible DOM elements to the user, as the user scrolls, the next list is displayed. This gives faster experience as the full list is not loaded at one go and only loaded as per the visibility on the screen.\n\nFor this to work items must be fixed height. We set the item count and item template and then attach a dataset that will be used to render the templates plus a buffer of elements as we scroll up and down in the list.\n\n## Use Cases\n\n- For a data grid or list with thousands of elements that do not all need to be loaded at one time\n- For a feed similar to a twitter or facebook feed\n\n## Terminology\n\n- **Template**: The html markup to render for each item\n- **Viewport**: The visible scroll area that may not equal all the visible elements\n- **Classification**: How tags are labelled with colors and text\n- **Disabled**: Tag can be disabled so it cannot be followed or clicked.\n\n## Features (With Code Examples)\n\nSet up a ids-virtual-scroll container and properties like height, item-height and item-count. Then inside the ids-virtual-scroll element we setup a structure to render where one element is `part=\"contents\"` this is the place where the item template will be rendered with the calculations.\n\n```html\n<ids-virtual-scroll id=\"virtual-scroll-1\" height=\"308\" item-height=\"20\" item-count=\"1000\">\n  <div class=\"ids-list-view\" part=\"contents\"></div>\n</ids-virtual-scroll>\n```\n\n```js\nconst virtualScroll = document.querySelector('#virtual-scroll-1');\nvirtualScrollUl.itemTemplate = (item) => `<li class=\"ids-virtual-scroll-item\" part=\"list-item\">${item.productName}</li>`;\nvirtualScrollUl.data = dataset;\n```\n\n## Settings and Attributes\n\n- `itemTemplate` {Function | string} Set the internal element template markup for a single element\n- `data` {Array<Object>} Attach a dataset that matches the list template and render.\n- `scrollTarget` {HTMLElement} Set internal element that will be the scrollable area.\n- `scrollTop` {number} Set the scroll top position and scroll down to that location.\n- `height` {number} The height in pixels we want the scroll area to be.\n- `itemHeight` {number} The height of each item in the list, must be fixed size.\n- `itemCount` {number} The number of elements in the dataset. This is also set internally when attaching data.\n- `bufferSize' {number} The number of extra elements to render to improve or tweak the scroll experience. This needs more research.\n\n## Keyboard Guidelines\n\n- <kbd>Up/Down Arrow</kbd>: If the scroll area is focused using the arrow keys will activate the scrolling.\n- <kbd>Home/End</kbd>: If the scroll area is focused using the arrow keys will scrolling to the start or end of the list\n\n## Responsive Guidelines\n\n- The width is responsive to the parent\n- The height is responsive to the screen size by default, but can also be specified a fixed `height` i.e. `height=\"500px\"`\n\n## Converting from Previous Versions\n\nNew Component for 5.0\n\n## Accessibility Guidelines\n\nThe use of this component is not recommended for Accessibility since the lack of elements in the page may pose issues for screen reader and other assistive technology. Consider a way to disable this functionality.\n"}},{"name":"ids-week-view","attributes":[{"name":"day-map","values":[]},{"name":"vetoable-event-types","values":[]},{"name":"ro","values":[]},{"name":"#tooltip-settings","values":[]},{"name":"on-locale-change","description":"Respond to locale changes","values":[]},{"name":"on-language-change","description":"Respond to language changes","values":[]},{"name":"#timeline-position-interval","description":"Stored interval used to control timeline position","values":[]},{"name":"show-today","description":"Set whether or not the today button should be shown","values":[]},{"name":"start-date","description":"Set start of the week to show","values":[]},{"name":"end-date","description":"Set end of the week to show","values":[]},{"name":"start-hour","description":"Set start hour of the day (0-24)","values":[]},{"name":"end-hour","description":"Set end hour of the day (0-24)","values":[]},{"name":"show-timeline","description":"Set whether or not to show a bar across the current time","values":[]},{"name":"timeline-interval","description":"Set how often timeline should update it's position (in milliseconds)","values":[]},{"name":"tooltip-settings","description":"sets the tooltip settings","values":[]},{"name":"slide-selection","description":"Sets whether slide selection is enabled","values":[]},{"name":"display-time","description":"Gets displayTime setting value","values":[]},{"name":"group-events","description":"Gets groupEvents setting value","values":[]},{"name":"display-comments","description":"Gets displayComments setting value","values":[]}],"description":{"kind":"markdown","value":"# ids-week-view\n\n## Description\nThe `ids-week-view` component is a web component that provides calendar view that displays weeks and days\nwith navigation and current time indicator\n\n## Use Cases\n- Display one day calendar in selected dates\n- Display a week calendar in selected dates\n- Display multiple weeks calendar in selected dates\n- Display current time indicator\n\n## Settings (Attributes)\n- `start-date` `{string|null}` - Specifies start of the week as a string date format\nFirst day of the week from current date will be set if not valid date or no specified. Examples of the format:\n  - Tue Nov 16 2021\n  - 2021-11-10T22:00:00.000Z\n  - 11/17/2021\n- `end-date` `{string|null}` - Specifies end of the week as a string date format. Last day of the week from current date will be set if not valid date or no specified. See `start-date` for examples of the format\n- `start-hour` `{string|number|null}` - Specifies the hour to start on each day from 0 to 24 range. Defaults to 7 if no specified or out of the range\n- `end-hour` `{string|number|null}` - Specifies the hour to end on each day from 0 to 24 range. Defaults to 19 if no specified or out of the range\n- `first-day-of-week` `{string|number|null}` - Specifies first day of the week from 0 to 6 range. 0 is Sunday, 1 is Monday. Defaults to 0 if no specified or out of the range. The setting is used if no `start-date` or `end-date` specified and when Today button is clicked\n- `show-today` `{true|false}` - Whether or not to show the today button in the toolbar\n- `show-timeline` `{true|false}` - Whether or not to show current time indicator\n- `timeline-interval` {string|number|null} - Specifies how often timeline should update it's position (in milliseconds). Defaults to 30000 (30 seconds)\n\n## Settings (Properties)\n- `eventsData` `{Array<CalendarEventData>}` - Array of calendar event data to populate the week view\n- `eventTypesData` `{Array<CalendarEventTypeData>}` - Array of calendar event types used to categorize calendar events\n\n## Events\n\n- `beforeeventrendered` Fires for each event rendered (full day or in day) before the element is added to the DOM\n- `aftereventrendered` Fires for each event rendered (full day or in day) after the element is added to the DOM\n- `beforeweekrendered` Fires before a week view is rendered\n- `aftereweekrendered` Fires after a week view is rendered\n\n## Features (With Code Examples)\n\nWith no settings. Regular week 7 days to show. First day of the week is Sunday, last day of the week is Saturday. 7 AM - 7 PM hours.\nToday button doesn't appear in the toolbar. Current time indicator appears if the time is in range of 7 AM - 7 PM hours. Today's day is highlighted\n\n```html\n<ids-week-view></ids-week-view>\n```\n\nWith `first-day-of-week` setting. Regular week 7 days to show. First day of the week is Monday, last day of the week is Sunday. 7 AM - 7 PM hours.\nToday button doesn't appear in the toolbar. Current time indicator appears if the time is in range of 7 AM - 7 PM hours. Today's day is highlighted\n\n```html\n<ids-week-view first-day-of-week=\"1\"></ids-week-view>\n```\n\nOne day calendar. Start date is equal to end date. 7 AM - 7 PM hours. Today button appears. Current time indicator doesn't appear\n\n```html\n<ids-week-view\n  start-date=\"11/11/2021\"\n  end-date=\"11/11/2021\"\n  show-today=\"true\"\n  show-timeline=\"false\"\n></ids-week-view>\n```\n\nMultiple week calendar with start/end hours settings. Start hour is `10` - 10 AM. End hour is `15` - 3 PM\n\n```html\n<ids-week-view\n  start-date=\"11/01/2021\"\n  end-date=\"11/14/2021\"\n  start-hour=\"10\"\n  end-hour=\"15\"\n></ids-week-view>\n```\n\nThe component can be controlled dynamically\n\n```js\nconst weekView = document.querySelector('ids-week-view');\n\n// Changing start/end date\nweekView.startDate = 'Tue Nov 16 2021';\nweekView.endDate = '11/17/2021';\n\n// Changing start/end hours\nweekView.startHour = 6;\nweekView.endHour = 21;\n\n// Set current date week with Sunday first day of the week\nweekView.startDate = null;\nweekView.endDate = null;\nweekView.firstDayOfWeek = 0;\n\n// Remove today button from the toolbar\nweekView.showToday = false;\n\n// Remove timeline\nweekView.showTimeline = false;\n\n// Change timeline interval to 1 second\nweekView.timelineInterval = 1000;\n```\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Week View was a new component created in v4.23.0\n\n**4.x to 5.x**\n\n- Week View is now a custom element `<ids-week-view></ids-week-view>`\n- Most settings that were previously jQuery-based are now attributes (for example, `first-day-of-week` or `end-hour`)\n"}},{"name":"ids-widget","attributes":[{"name":"borderless","description":"Set the widget to have no borders and no background color","values":[]},{"name":"overflow","description":"Set how the container overflows, can be hidden or auto (default)","values":[]},{"name":"height","description":"Set a height and center the widget","values":[]},{"name":"rowspan","description":"Gets the rowspan value of the widget. Defaults to 1 if not set.","values":[]},{"name":"colspan","description":"Gets the colspan value of the widget. Defaults to 1 if not set.","values":[]},{"name":"no-header","description":"Set to true to hide the header and reclaim the space","values":[]},{"name":"padding-x","description":"Get the x axis padding","values":[]},{"name":"padding-y","description":"Get the x axis padding","values":[]},{"name":"size","description":"Get the current size of the widget","values":[]}],"description":{"kind":"markdown","value":"# ids-widget\n\n## Description\n\nWidgets are specialized cards that are use primarily in the home page layout. They have a series of features that are useful to widget developers and features that allow the end user to interact with the widget and its content.\n\n## Use Cases\n\n- Use when you want to display content in widget in a home page layout\n- Use when you want to display content in a card-like format with a header, body and footer\n\n## Dos and Don'ts\n\n- Overcrowd your content with widgets full of information, so people can see the items clearly\n- Try to succinctly capture the information by role\n\n## Terminology\n\n- **Widget**: Element of a graphical user interface that displays information or provides a specific way for a user to interact with\n- **System Button**: A button provided by the portal thats not a part of the widget contents. For example the actions button.\n\n## Features (With Code Examples)\n\nA simple bordered widget.\n\n```html\n<ids-home-page>\n  <ids-widget slot=\"widget\">\n    <div slot=\"widget-header\">\n      <ids-toolbar>\n        <ids-toolbar-section type=\"title\" favor>\n          <ids-text font-size=\"20\">Bordered</ids-text>\n        </ids-toolbar-section>\n        <ids-toolbar-section type=\"buttonset\" align=\"end\">\n          <ids-menu-button menu=\"icon-actions\" id=\"actions-button\" system-button>\n            <ids-icon icon=\"vertical-ellipsis\"></ids-icon>\n            <span class=\"audible\">Actions</span>\n          </ids-menu-button>\n          <ids-popup-menu id=\"icon-actions\" target=\"#actions-button\">\n            <ids-menu-group>\n              <ids-menu-item>Action one</ids-menu-item>\n              <ids-menu-item>Action two</ids-menu-item>\n            </ids-menu-group>\n          </ids-popup-menu>\n        </ids-toolbar-section>\n      </ids-toolbar>\n    </div>\n    <div slot=\"widget-content\"></div>\n  </ids-widget>\n</ids-home-page>\n```\n\nTo use system buttons in your widget, add the system-button attribute on the button element. The rule is that if there is just one system button it should be hidden. But if there is other actions it should not be hidden. In that case remove the system-button attribute.\n\nTo create a quarter sized widget, set the size attribute to quarter. The data may optionally be centered. And the widget should have padding in most cases.\n\n```html\n<ids-widget size=\"quarter\" padding-x=\"16\" padding-y=\"16\">\n  <div slot=\"widget-content\" centered>\n    <!-- Content goes here -->\n  </div>\n</ids-widget>\n```\n\nTo create a half sized widget, set the size attribute to half.\n\n```html\n<ids-widget size=\"half\" padding-x=\"16\" padding-y=\"16\">\n  <div slot=\"widget-content\" centered>\n    <!-- Content goes here -->\n  </div>\n</ids-widget>\n```\n\nTo add an system button to the half or quarter sized widget, add the button insider the `slot=\"widget-actions\"` element.\n\n```html\n<ids-widget size=\"quarter\" padding-x=\"16\" padding-y=\"16\">\n  <div slot=\"widget-actions\">\n    <ids-menu-button menu=\"icon-actions-1\" id=\"actions-button-1\" system-button hidden>\n      <ids-icon icon=\"vertical-ellipsis\"></ids-icon>\n      <span class=\"audible\">Actions</span>\n    </ids-menu-button>\n    <ids-popup-menu id=\"icon-actions-1\" target=\"#actions-button-1\">\n      <ids-menu-group>\n        <ids-menu-item>Action one</ids-menu-item>\n        <ids-menu-item>Action two</ids-menu-item>\n      </ids-menu-group>\n    </ids-popup-menu>\n  </div>\n  <div slot=\"widget-content\" centered>\n    <!-- Content goes here -->\n  </div>\n</ids-widget>\n```\n\n## Class Hierarchy\n\n- IdsWidget\n  - IdsBox\n    - IdsElement\n- Mixins\n  IdsEventsMixin\n  IdsScrollEffectMixin\n\n## Settings (Attributes)\n\n- `system-button` {boolean} Makes any button a system button that is hidden unless hovering the widget\n- `borderless` {boolean} Set the widget to have no borders and no background color\n- `height` {boolean} Set a specific height and center the widget\n- `noHeader` {boolean} Set to true to hide the header and reclaim the space\n- `overflow` {string} Set how the container overflows, can be hidden or auto (default\n- `paddingX` {string} Set the x axis padding on the widget contents (in pixels)\n- `paddingY` {string} Set the y axis padding on the widget contents (in pixels)\n- `size` {string} Set the size to quarter or half, defaults to home page decided size aka full size.\n\n## Themeable Parts\n\n- `body` allows you to further style the widget body element\n- `widget` allows you to further style the whole widget input element\n- `header` allows you to further style the widget header element\n- `search` allows you to further style the widget search element in the header\n- `content` allows you to further style the widget content area\n\n## States and Variations\n\n- Color\n- Disabled\n- Hover\n- Focus\n- Size\n- System Actions\n\n## Keyboard Guidelines\n\n- <kbd>Tab/Shift+Tab</kbd>: Will tab you into the widget and then into the content area.\n- <kbd>Enter</kbd>: If widget item is clickable then this will follow activate the click.\n\n## Responsive Guidelines\n\n- Responsive is entirely controlled by the home page component, the widgets are fixed size and will follow its rules for sizing.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**4.x to 5.x**\n\n- Widgets are now custom elements `<ids-widget></ids-widget>`\n- If using properties/settings these are now attributes: `size`, `overflow`, `padding` ect.\n- Can now be imported as a single JS file and used with encapsulated styles\n- Widgets replace cards but have only the features needed for widgets. See `ids-card` for some features.\n\n## Accessibility Guidelines\n\n- 1.4.1 Use of Color - Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Ensure the color tags that indicate state like OK, cancel, ect have other ways to indicate that information. This is failing.\n- 1.4.3 Contrast (Minimum) - The visual presentation of text and images of text has a contrast ratio of at least 4.5:1. Ensure the color tags pass contrast.\n\n## Regional Considerations\n\nLabels should be localized in the current language. The close and actions or other buttons will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai).\n"}},{"name":"ids-wizard-step","description":{"kind":"markdown","value":"# ids-wizard\n\n## Description\n\nDisplays feedback about a current process. A user can view a depiction of their current status within a process, and may optionally navigate between points. Best for displaying progress relative to the start and finish of a user workflow.\n\n## Use Cases\n\n- displaying a list of steps that have to be fulfilled in a given/pre-determined order.\n- optionally allowing a user to traverse a set of, or part of a set of steps.\n\n## Terminology\n\n- **Wizard**: the overall flow/process\n- **Step**: an individual step in the IdsWizard component; represented here by `IdsWizardStep`/`<ids-wizard-step>`\n\n## Themeable Parts\n- `wizard` allows you to style the overall wizard.\n- `step` allows you to style the step (markers + labels).\n- `path-segment` allows you to further style the line segments between markers.\n\n## Features (With Code Examples)\n\nA wizard is created by using the custom `ids-wizard` element. It's sub-components/steps are represented by `<ids-wizard-step>`.\n\nContent within the `<ids-wizard-step>` instances will be the text displayed in the label at each of these steps.\n\nThe current step number a wizard is showing has been traversed is denoted now only with the `step-number` attribute on `ids-wizard`.\n\n```html\n<ids-wizard step-number=1>\n  <ids-wizard-step>Step One<ids-wizard-step>\n  <ids-wizard-step> Step Two</ids-wizard-step>\n</ids-wizard>\n```\n\n## Settings and Attributes\n\n- `clickable` `{boolean}` If set, a user can click each step. Note that this is also settable within the `ids-wizard-step` children components to only enable specific step(s) to be clickable.\n- `disabled` `{boolean}` `ids-wizard-step` attribute makes the step disabled\n- `step-number` the current step number.\n\n## Keyboard Guidelines\n\n- TAB should move to next step and/or label.\n- SHIFT + TAB should move to previous step and/or label.\n- ENTER key should select the focused label/step as well as change the page URL hash.\n\n## Responsive Guidelines\n\n- The wizard component's width should not exceed the width of the page.\n- The labels chosen and number of steps should fit within the page; or at least be obvious enough that a user can discern what labels achieve what function.\n\n## Designs\n\n## Accessibility Guidelines\n\n- 1.4.3 Contrast (Minimum) - there should be enough contrast on the background which the wizard resides on in the page.\n\n## Regional Considerations\n\nLabel text should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Wizard was a new component created in v4.0.0\n\n**4.x to 5.x**\n\n- Wizard is now a custom element `<ids-wizard></ids-wizard>`\n- \"Ticks\" are now called \"Steps\", and are codified as custom elements `<ids-wizard-step>MY-LABEL</ids-wizard-step>`\n- Setting the step number is done via `ids-wizard`'s `step-number` attribute.\n- `clickable` property is available on both any `ids-wizard-step` and `ids-wizard` overall.\n"}},{"name":"ids-wizard","attributes":[{"name":"resize-observer","values":[]},{"name":"marker-template","values":[]},{"name":"step-number","description":"Set the step number","values":[]},{"name":"clickable","description":"Get whether steps are clickable by default","values":[]}],"description":{"kind":"markdown","value":"# ids-wizard\n\n## Description\n\nDisplays feedback about a current process. A user can view a depiction of their current status within a process, and may optionally navigate between points. Best for displaying progress relative to the start and finish of a user workflow.\n\n## Use Cases\n\n- displaying a list of steps that have to be fulfilled in a given/pre-determined order.\n- optionally allowing a user to traverse a set of, or part of a set of steps.\n\n## Terminology\n\n- **Wizard**: the overall flow/process\n- **Step**: an individual step in the IdsWizard component; represented here by `IdsWizardStep`/`<ids-wizard-step>`\n\n## Themeable Parts\n- `wizard` allows you to style the overall wizard.\n- `step` allows you to style the step (markers + labels).\n- `path-segment` allows you to further style the line segments between markers.\n\n## Features (With Code Examples)\n\nA wizard is created by using the custom `ids-wizard` element. It's sub-components/steps are represented by `<ids-wizard-step>`.\n\nContent within the `<ids-wizard-step>` instances will be the text displayed in the label at each of these steps.\n\nThe current step number a wizard is showing has been traversed is denoted now only with the `step-number` attribute on `ids-wizard`.\n\n```html\n<ids-wizard step-number=1>\n  <ids-wizard-step>Step One<ids-wizard-step>\n  <ids-wizard-step> Step Two</ids-wizard-step>\n</ids-wizard>\n```\n\n## Settings and Attributes\n\n- `clickable` `{boolean}` If set, a user can click each step. Note that this is also settable within the `ids-wizard-step` children components to only enable specific step(s) to be clickable.\n- `disabled` `{boolean}` `ids-wizard-step` attribute makes the step disabled\n- `step-number` the current step number.\n\n## Keyboard Guidelines\n\n- TAB should move to next step and/or label.\n- SHIFT + TAB should move to previous step and/or label.\n- ENTER key should select the focused label/step as well as change the page URL hash.\n\n## Responsive Guidelines\n\n- The wizard component's width should not exceed the width of the page.\n- The labels chosen and number of steps should fit within the page; or at least be obvious enough that a user can discern what labels achieve what function.\n\n## Designs\n\n## Accessibility Guidelines\n\n- 1.4.3 Contrast (Minimum) - there should be enough contrast on the background which the wizard resides on in the page.\n\n## Regional Considerations\n\nLabel text should be localized in the current language. All elements will flip to the alternate side in Right To Left mode. Consider that in some languages text may be a lot longer (German). And in some cases it cant be wrapped (Thai). For some of these cases text-ellipsis is supported.\n\n## Converting from Previous Versions (Breaking Changes)\n\n**3.x to 4.x**\n\n- Wizard was a new component created in v4.0.0\n\n**4.x to 5.x**\n\n- Wizard is now a custom element `<ids-wizard></ids-wizard>`\n- \"Ticks\" are now called \"Steps\", and are codified as custom elements `<ids-wizard-step>MY-LABEL</ids-wizard-step>`\n- Setting the step number is done via `ids-wizard`'s `step-number` attribute.\n- `clickable` property is available on both any `ids-wizard-step` and `ids-wizard` overall.\n"}}]}