@nvidia-elements/core 2.8.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/accordion/accordion.examples.json +9 -9
- package/dist/accordion/accordion2.js +4 -4
- package/dist/alert/alert-group2.js +1 -1
- package/dist/alert/alert.examples.json +3 -3
- package/dist/alert/alert2.js +1 -1
- package/dist/avatar/avatar-group2.js +1 -1
- package/dist/avatar/avatar2.js +1 -1
- package/dist/badge/badge.examples.json +2 -2
- package/dist/badge/badge2.js +1 -1
- package/dist/breadcrumb/breadcrumb.examples.json +1 -1
- package/dist/breadcrumb/breadcrumb2.js +1 -1
- package/dist/bundle.d.ts +2 -0
- package/dist/bundles/index.d.ts +211 -0
- package/dist/bundles/index.js +6 -6
- package/dist/button/button.examples.json +3 -3
- package/dist/button/button2.js +1 -1
- package/dist/button-group/button-group2.js +1 -1
- package/dist/card/card.examples.json +2 -2
- package/dist/card/card2.js +4 -4
- package/dist/chat-message/chat-message.examples.json +4 -4
- package/dist/chat-message/chat-message2.js +1 -1
- package/dist/checkbox/checkbox-group2.js +1 -1
- package/dist/checkbox/checkbox2.js +1 -1
- package/dist/color/color2.js +1 -1
- package/dist/combobox/combobox.examples.json +5 -5
- package/dist/combobox/combobox2.js +1 -1
- package/dist/copy-button/copy-button.examples.json +2 -2
- package/dist/copy-button/copy-button2.js +1 -1
- package/dist/custom-elements-jsx.d.ts +112 -1
- package/dist/custom-elements-vue.d.ts +110 -1
- package/dist/custom-elements.json +3554 -291
- package/dist/data.html.json +95 -1
- package/dist/data.snippets.json +45 -45
- package/dist/date/date2.js +1 -1
- package/dist/datetime/datetime2.js +1 -1
- package/dist/dialog/dialog-footer2.js +1 -1
- package/dist/dialog/dialog-header2.js +1 -1
- package/dist/dialog/dialog.examples.json +3 -3
- package/dist/dialog/dialog2.js +1 -1
- package/dist/divider/divider.examples.json +1 -1
- package/dist/divider/divider2.js +1 -1
- package/dist/dot/dot2.js +1 -1
- package/dist/drawer/drawer-content2.js +1 -1
- package/dist/drawer/drawer-footer2.js +1 -1
- package/dist/drawer/drawer-header2.js +1 -1
- package/dist/drawer/drawer2.js +1 -1
- package/dist/dropdown/dropdown-footer2.js +1 -1
- package/dist/dropdown/dropdown-header2.js +1 -1
- package/dist/dropdown/dropdown2.js +1 -1
- package/dist/dropdown-group/dropdown-group.examples.json +4 -4
- package/dist/dropdown-group/dropdown-group.js +1 -1
- package/dist/dropzone/dropzone.examples.json +1 -1
- package/dist/dropzone/dropzone2.js +1 -1
- package/dist/file/file2.js +1 -1
- package/dist/format-bytes/format-bytes2.js +1 -1
- package/dist/format-datetime/format-datetime.examples.json +3 -3
- package/dist/format-datetime/format-datetime2.js +1 -1
- package/dist/format-number/format-number2.js +1 -1
- package/dist/format-relative-time/format-relative-time2.js +1 -1
- package/dist/format-truncate/format-truncate.examples.json +4 -4
- package/dist/format-truncate/format-truncate2.js +1 -1
- package/dist/forms/actions.examples.json +1 -1
- package/dist/forms/control/control.examples.json +1 -1
- package/dist/forms/control/control2.js +1 -1
- package/dist/forms/control-group/control-group2.js +1 -1
- package/dist/forms/control-message/control-message2.js +1 -1
- package/dist/gauge/gauge.examples.json +2 -2
- package/dist/gauge/gauge2.js +1 -1
- package/dist/grid/cell/cell2.js +1 -1
- package/dist/grid/column/column2.js +1 -1
- package/dist/grid/footer/footer2.js +1 -1
- package/dist/grid/grid.examples.js.map +1 -1
- package/dist/grid/grid.examples.json +34 -34
- package/dist/grid/grid2.js +1 -1
- package/dist/grid/header/header2.js +1 -1
- package/dist/grid/placeholder/placeholder2.js +1 -1
- package/dist/grid/row/row2.js +1 -1
- package/dist/icon/icon2.js +2 -2
- package/dist/icon-button/icon-button2.js +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group2.js +1 -1
- package/dist/input/input2.js +1 -1
- package/dist/internal/controllers/gesture.controller.d.ts +122 -42
- package/dist/internal/controllers/gesture.controller.examples.js.map +1 -1
- package/dist/internal/controllers/gesture.controller.examples.json +2 -2
- package/dist/internal/controllers/gesture.controller.js +300 -159
- package/dist/internal/controllers/gesture.controller.js.map +1 -1
- package/dist/internal/controllers/key-state.controller.d.ts +18 -0
- package/dist/internal/controllers/key-state.controller.js +84 -0
- package/dist/internal/controllers/key-state.controller.js.map +1 -0
- package/dist/internal/controllers/keynav-grid.controller.examples.json +1 -1
- package/dist/internal/controllers/keynav-list.controller.examples.json +1 -1
- package/dist/internal/controllers/keynav-spatial.controller.d.ts +4 -1
- package/dist/internal/controllers/keynav-spatial.controller.js +7 -6
- package/dist/internal/controllers/keynav-spatial.controller.js.map +1 -1
- package/dist/internal/controllers/popover.examples.json +2 -2
- package/dist/internal/index.d.ts +2 -0
- package/dist/internal/index.js +29 -27
- package/dist/internal/services/global.service.js +1 -1
- package/dist/internal/utils/dom.d.ts +1 -0
- package/dist/internal/utils/dom.js +42 -38
- package/dist/internal/utils/dom.js.map +1 -1
- package/dist/internal/utils/focus.d.ts +2 -0
- package/dist/internal/utils/focus.js +14 -7
- package/dist/internal/utils/focus.js.map +1 -1
- package/dist/internal/utils/numeric.d.ts +3 -0
- package/dist/internal/utils/numeric.js +14 -0
- package/dist/internal/utils/numeric.js.map +1 -0
- package/dist/logo/logo.examples.json +1 -1
- package/dist/logo/logo2.js +1 -1
- package/dist/menu/menu-item2.js +1 -1
- package/dist/menu/menu.examples.js.map +1 -1
- package/dist/menu/menu.examples.json +4 -4
- package/dist/menu/menu2.js +1 -1
- package/dist/month/month2.js +1 -1
- package/dist/notification/notification-group2.js +1 -1
- package/dist/notification/notification.examples.json +3 -3
- package/dist/notification/notification2.js +1 -1
- package/dist/page/page-panel/page-panel-content2.js +1 -1
- package/dist/page/page-panel/page-panel-footer2.js +1 -1
- package/dist/page/page-panel/page-panel-header2.js +1 -1
- package/dist/page/page-panel/page-panel2.js +1 -1
- package/dist/page/page.examples.json +10 -10
- package/dist/page/page2.js +1 -1
- package/dist/page-header/page-header.examples.json +1 -1
- package/dist/page-header/page-header2.js +1 -1
- package/dist/page-loader/page-loader2.js +1 -1
- package/dist/pagination/pagination.examples.json +6 -6
- package/dist/pagination/pagination2.js +1 -1
- package/dist/panel/panel2.js +4 -4
- package/dist/password/password2.js +1 -1
- package/dist/preferences-input/preferences-input.examples.json +1 -1
- package/dist/preferences-input/preferences-input2.js +1 -1
- package/dist/progress-bar/progress-bar.examples.json +1 -1
- package/dist/progress-bar/progress-bar2.js +1 -1
- package/dist/progress-ring/progress-ring2.js +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
- package/dist/pulse/pulse2.js +1 -1
- package/dist/radio/radio-group2.js +1 -1
- package/dist/radio/radio2.js +1 -1
- package/dist/range/range.examples.json +1 -1
- package/dist/range/range2.js +1 -1
- package/dist/resize-handle/resize-handle.examples.json +4 -4
- package/dist/resize-handle/resize-handle2.js +6 -10
- package/dist/resize-handle/resize-handle2.js.map +1 -1
- package/dist/search/search2.js +1 -1
- package/dist/select/select2.js +1 -1
- package/dist/skeleton/skeleton2.js +1 -1
- package/dist/sort-button/sort-button2.js +1 -1
- package/dist/sparkline/sparkline.examples.json +2 -2
- package/dist/sparkline/sparkline2.js +1 -1
- package/dist/star-rating/star-rating2.js +1 -1
- package/dist/steps/steps2.js +2 -2
- package/dist/switch/switch-group2.js +1 -1
- package/dist/switch/switch2.js +1 -1
- package/dist/tabs/tabs-group2.js +1 -1
- package/dist/tabs/tabs.examples.json +4 -4
- package/dist/tabs/tabs2.js +2 -2
- package/dist/tag/tag.examples.json +1 -1
- package/dist/tag/tag2.js +1 -1
- package/dist/textarea/textarea.d.ts +7 -1
- package/dist/textarea/textarea.examples.js.map +1 -1
- package/dist/textarea/textarea.examples.json +22 -0
- package/dist/textarea/textarea.js +1 -1
- package/dist/textarea/textarea.js.map +1 -1
- package/dist/textarea/textarea2.js +10 -3
- package/dist/textarea/textarea2.js.map +1 -1
- package/dist/time/time2.js +1 -1
- package/dist/toast/toast.examples.json +1 -1
- package/dist/toast/toast2.js +1 -1
- package/dist/toggletip/toggletip-footer2.js +1 -1
- package/dist/toggletip/toggletip-header2.js +1 -1
- package/dist/toggletip/toggletip2.js +1 -1
- package/dist/toolbar/toolbar2.js +1 -1
- package/dist/tooltip/tooltip.examples.json +2 -2
- package/dist/tooltip/tooltip2.js +1 -1
- package/dist/tree/tree-node2.js +1 -1
- package/dist/tree/tree2.js +1 -1
- package/dist/viewport/define.d.ts +7 -0
- package/dist/viewport/define.js +7 -0
- package/dist/viewport/define.js.map +1 -0
- package/dist/viewport/index.d.ts +3 -0
- package/dist/viewport/index.js +3 -0
- package/dist/viewport/viewport-animation.controller.d.ts +21 -0
- package/dist/viewport/viewport-animation.controller.js +93 -0
- package/dist/viewport/viewport-animation.controller.js.map +1 -0
- package/dist/viewport/viewport-autofit.controller.d.ts +18 -0
- package/dist/viewport/viewport-autofit.controller.js +105 -0
- package/dist/viewport/viewport-autofit.controller.js.map +1 -0
- package/dist/viewport/viewport-fitting.utils.d.ts +36 -0
- package/dist/viewport/viewport-fitting.utils.js +35 -0
- package/dist/viewport/viewport-fitting.utils.js.map +1 -0
- package/dist/viewport/viewport-gesture-navigation.controller.d.ts +29 -0
- package/dist/viewport/viewport-gesture-navigation.controller.js +311 -0
- package/dist/viewport/viewport-gesture-navigation.controller.js.map +1 -0
- package/dist/viewport/viewport-gridlines.d.ts +38 -0
- package/dist/viewport/viewport-gridlines.js +6 -0
- package/dist/viewport/viewport-gridlines.js.map +1 -0
- package/dist/viewport/viewport-gridlines.utils.d.ts +11 -0
- package/dist/viewport/viewport-gridlines.utils.js +54 -0
- package/dist/viewport/viewport-gridlines.utils.js.map +1 -0
- package/dist/viewport/viewport-gridlines2.js +154 -0
- package/dist/viewport/viewport-gridlines2.js.map +1 -0
- package/dist/viewport/viewport-navigation.controller.d.ts +27 -0
- package/dist/viewport/viewport-navigation.controller.js +142 -0
- package/dist/viewport/viewport-navigation.controller.js.map +1 -0
- package/dist/viewport/viewport-navigation.types.d.ts +9 -0
- package/dist/viewport/viewport-projection.utils.d.ts +7 -0
- package/dist/viewport/viewport-projection.utils.js +25 -0
- package/dist/viewport/viewport-projection.utils.js.map +1 -0
- package/dist/viewport/viewport.d.ts +92 -0
- package/dist/viewport/viewport.examples.js +6 -0
- package/dist/viewport/viewport.examples.js.map +1 -0
- package/dist/viewport/viewport.examples.json +60 -0
- package/dist/viewport/viewport.js +6 -0
- package/dist/viewport/viewport.js.map +1 -0
- package/dist/viewport/viewport.types.d.ts +66 -0
- package/dist/viewport/viewport2.js +375 -0
- package/dist/viewport/viewport2.js.map +1 -0
- package/dist/week/week2.js +1 -1
- package/package.json +14 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.js","names":[],"sources":["../../../src/internal/utils/dom.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { GlobalStateService } from '../services/global.service.js';\nimport { LogService } from '../services/log.service.js';\nimport type { ElementDefinition } from '../types/index.js';\nimport { isFocusable } from './focus.js';\n\nexport function getChildren(node: Document | Node | HTMLElement): Element[] {\n if (node instanceof Document && node.documentElement) {\n return Array.from(node.documentElement.children); // root document children\n } else if (node instanceof HTMLElement && node.shadowRoot) {\n return Array.from(node.shadowRoot.children); // shadow root direct children\n } else if (node instanceof HTMLSlotElement && node.assignedElements) {\n const slotted = node.assignedElements(); // slotted elements\n return slotted.length ? slotted : Array.from(node.children); // slot fallback\n } else {\n return Array.from((node as HTMLElement).children); // light DOM direct children\n }\n}\n\nexport function generateId() {\n const uint32 = self.crypto.getRandomValues(new Uint32Array(1))[0]!;\n return `_${uint32.toString(16)}`;\n}\n\nexport function getAttributeChanges(element: HTMLElement, attr: string, fn: (attrValue: string | null) => void) {\n fn(element.getAttribute(attr));\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n if (mutation.attributeName === attr) {\n fn((mutation.target as HTMLElement).getAttribute(attr));\n }\n });\n });\n observer.observe(element, { attributes: true, subtree: true });\n return observer;\n}\n\nexport function getAttributeListChanges(element: HTMLElement, attrs: string[], fn: (mutation: MutationRecord) => void) {\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n if (mutation.attributeName && attrs.includes(mutation.attributeName)) {\n fn(mutation);\n }\n });\n });\n observer.observe(element, { attributes: true, subtree: true });\n return observer;\n}\n\n/**\n * Appends styles to the render root of a given element. This is useful for\n * styles that apply outside the scope of the element's shadow\n * root such as UA styles --webkit-* that won't work in a ::slotted selector\n */\nexport function appendRootNodeStyle(host: HTMLElement, styles: string) {\n const stylesheet = new CSSStyleSheet();\n stylesheet.replaceSync(styles);\n const root = host.getRootNode() as Document | ShadowRoot;\n if (root.adoptedStyleSheets) {\n const hasStyleSheet = root.adoptedStyleSheets\n .map(s => styleSheetToString(s))\n .find(s => s === styleSheetToString(stylesheet));\n if (!hasStyleSheet) {\n root.adoptedStyleSheets = [...Array.from(root.adoptedStyleSheets), stylesheet];\n }\n }\n return stylesheet;\n}\n\nexport function styleSheetToString(stylesheet: CSSStyleSheet) {\n return stylesheet.cssRules\n ? Array.from(stylesheet.cssRules)\n .map(rule => rule.cssText || '')\n .join('\\n')\n : '';\n}\n\n/** Intercepts a property setter on an element so `callback` fires on every assignment. Does not use a MutationObserver. */\nexport function getPropertyChanges(element: HTMLElement, key: string, callback: (value: unknown) => void) {\n const proto = Object.getPrototypeOf(element);\n const descriptor = Object.getOwnPropertyDescriptor(proto, key);\n if (!descriptor) return;\n const own = Object.getOwnPropertyDescriptor(element, key);\n if (own && own.configurable === false) return;\n Object.defineProperty(element, key, {\n configurable: true,\n get: descriptor.get,\n set: (val: unknown) => {\n descriptor.set!.call(element, val);\n callback(val);\n }\n });\n\n return () => {\n if (own) {\n Object.defineProperty(element, key, own);\n return;\n }\n\n Reflect.deleteProperty(element, key);\n };\n}\n\n/* used for cases of needing to know a property update outside of lit, example a native input value prop change */\nexport function getElementUpdate(element: HTMLElement, key: string, callback: (value: unknown) => void) {\n if (element.hasAttribute(key)) {\n callback(element.getAttribute(key));\n } else if ((element as unknown as Record<string, unknown>)[key] !== undefined) {\n callback((element as unknown as Record<string, unknown>)[key]);\n }\n\n const cleanupPropertyChanges = getPropertyChanges(element, key, callback);\n const observer = getAttributeChanges(element, key, val => callback(val));\n const disconnect = observer.disconnect.bind(observer);\n\n observer.disconnect = () => {\n cleanupPropertyChanges?.();\n disconnect();\n };\n\n return observer;\n}\n\nexport function clickOutsideElementBounds(event: PointerEvent | MouseEvent, element: HTMLElement) {\n const { left, right, top, bottom } = element.getBoundingClientRect();\n return event.clientX < left || event.clientX > right || event.clientY < top || event.clientY > bottom;\n}\n\n/** parses number out of basic calc generated by the design tokens */\nexport function parseTokenNumber(value: string) {\n return parseInt(value.includes('calc') ? value.split('*')[1]!.replace('px)', '').trim() : value, 10) || 0;\n}\n\n/** true if the browser supports scoped custom element registries */\nexport const supportsScopedRegistry =\n globalThis.CustomElementRegistry && 'initialize' in CustomElementRegistry.prototype;\n\n/** defines an element with the given custom element registry */\nexport function defineElement(element: ElementDefinition, customElementRegistry: CustomElementRegistry) {\n Object.entries(element.elementDefinitions ?? {})\n .filter(([_tag, e]) => !customElementRegistry.get(e.metadata.tag))\n .forEach(([_tag, e]) => {\n defineElement(e, customElementRegistry);\n });\n\n if (!customElementRegistry.get(element.metadata.tag)) {\n customElementRegistry.define(element.metadata.tag, element);\n\n if (customElementRegistry === customElements) {\n GlobalStateService.dispatch('NVE_ELEMENT_DEFINE', {\n elementRegistry: { [element.metadata.tag]: element.metadata.version }\n });\n }\n }\n}\n\n/** defines an element with the global custom element registry */\nexport function define(element: ElementDefinition) {\n const { version } = element.metadata;\n\n // if scoped registry supported, register only the root element to global registry\n if (supportsScopedRegistry && !customElements.get(element.metadata.tag)) {\n customElements.define(element.metadata.tag, element);\n GlobalStateService.dispatch('NVE_ELEMENT_DEFINE', {\n elementRegistry: { [element.metadata.tag]: element.metadata.version }\n });\n } else {\n // if scoped registry not supported, register the element and all its children to the global registry\n defineElement(element, customElements);\n }\n\n // warn on duplicate version\n if (\n GlobalStateService.state.elementRegistry[element.metadata.tag] !== version &&\n globalThis?.location?.hostname === 'localhost'\n ) {\n void import('./audit-logs.js').then(m =>\n console.warn(m.getDuplicatePackageVersionWarning(element.metadata.tag, version))\n );\n }\n}\n\nexport function isContextMenuClick(event: MouseEvent) {\n return (event.buttons === 2 && !event.ctrlKey) || (event.buttons === 1 && event.ctrlKey);\n}\n\nexport function getFlattenedFocusableItems(element: Node, depth = 10) {\n return getFlattenedDOMTree(element, depth).filter((e: HTMLElement) => isFocusable(e)) as HTMLElement[];\n}\n\n/**\n * Preserves visual DOM ordering when using slots within Shadow DOM\n * See more information/resources on Shadow DOM linear traversal\n * https://nolanlawson.com/2021/02/13/managing-focus-in-the-shadow-dom/\n * https://www.abeautifulsite.net/posts/querying-through-shadow-roots/\n */\nexport function getFlattenedDOMTree(node: Node, depth = 10): HTMLElement[] {\n return (\n Array.from(getChildren(node)).reduce(\n (p: unknown[], n: Node) => [\n ...p,\n [n, [...Array.from(getChildren(n)).map(i => [i, getFlattenedDOMTree(i, depth)])]]\n ],\n []\n ) as unknown as HTMLElement[]\n ).flat(depth);\n}\n\nexport function validKeyNavigationCode(e: KeyboardEvent) {\n return keynavCodes.has(e.code);\n}\n\nexport enum KeynavCode {\n End = 'End',\n Home = 'Home',\n PageUp = 'PageUp',\n PageDown = 'PageDown',\n ArrowUp = 'ArrowUp',\n ArrowDown = 'ArrowDown',\n ArrowLeft = 'ArrowLeft',\n ArrowRight = 'ArrowRight'\n}\n\nconst keynavCodes: Set<string> = new Set(Object.values(KeynavCode));\n\nexport function hasInvalidDOMGrid(rows: HTMLElement[]) {\n return rows.some(row => row.children.length !== rows[0]!.children.length);\n}\n\nexport function removeEmptyTextNode(node: Node) {\n if ((node as Text)?.wholeText?.trim() === '') {\n (node as Text).remove();\n }\n}\n\nexport function scrollBarWidth() {\n const div = globalThis.document.createElement('div');\n div.style.setProperty('width', '100px');\n div.style.setProperty('height', '100px');\n div.style.setProperty('overflow', 'scroll');\n div.style.setProperty('position', 'absolute');\n div.style.setProperty('top', '-9999px');\n globalThis.document.body.appendChild(div);\n const width = div.offsetWidth - div.clientWidth;\n globalThis.document.body.removeChild(div);\n return width;\n}\n\nexport function hasScrollBar(el: HTMLElement) {\n return el.scrollHeight > el.clientHeight;\n}\n\nexport function hasHorizontalScrollBar(el: HTMLElement) {\n return el.scrollWidth > el.clientWidth;\n}\n\nexport function endOfScrollBox(element: HTMLElement, offset = 0) {\n return element.scrollTop + element.offsetHeight + offset >= element.scrollHeight;\n}\n\nexport async function openEyeDropper(): Promise<string> {\n const EyeDropperConstructor = (\n globalThis as unknown as { EyeDropper?: new () => { open: () => Promise<{ sRGBHex: string }> } }\n ).EyeDropper;\n\n if (!EyeDropperConstructor) {\n LogService.warn('EyeDropper API is unavailable');\n return '';\n }\n\n try {\n return (await new EyeDropperConstructor().open()).sRGBHex;\n } catch (e) {\n LogService.warn(`EyeDropper selection failed: ${(e as Error).message}`);\n return '';\n }\n}\n\n/**\n * provides a object with key/value of the currently applied design tokens\n */\nexport function getThemeTokens(element = globalThis.document.querySelector(':root')!) {\n // default root or provided element\n const styles = getComputedStyle(element);\n let parent: CSSStyleSheet[] = [];\n\n // check for parent iframe, same domain iframes change how the browser accesses style sheets\n try {\n parent = Array.from(globalThis.parent.document.styleSheets);\n } catch {\n // if not accessible, skip\n }\n\n return [...parent, ...Array.from(globalThis.document.styleSheets)]\n .reduce((finalArr: string[][], sheet) => {\n let rules: CSSRule[] = [];\n try {\n rules = [...sheet.cssRules];\n } catch {\n // if the style sheet is not accessible, skip\n }\n return finalArr.concat(\n rules\n .filter(rule => rule.type === 1)\n .reduce((propValArr: string[][], rule) => {\n const props = [...(rule as CSSStyleRule).style]\n .filter((p: string) => p.trim().includes('--nve'))\n .map((propName: string) => [\n propName.trim(),\n (rule as CSSStyleRule).style.getPropertyValue(propName).trim()\n ]);\n return [...propValArr, ...props];\n }, [])\n );\n }, [])\n .reduce(\n (p: Record<string, string>, token: string[]) => ({ ...p, [token[0]!]: styles.getPropertyValue(token[0]!) }),\n {}\n );\n}\n\nexport function removeEmptySlotWhitespace(slot: HTMLSlotElement) {\n if (slotContainsOnlyWhitespace(slot)) {\n slot.assignedNodes().forEach((node: Node) => node.parentNode?.removeChild(node));\n }\n}\n\nexport function slotContainsOnlyWhitespace(slot: HTMLSlotElement) {\n const hasNoElements = !slot.assignedNodes().find(i => i.nodeType !== Node.TEXT_NODE);\n const hasOnlyEmptyTextNodes = !slot\n .assignedNodes()\n .find(i => i.nodeType === Node.TEXT_NODE && (i.textContent ?? '').trim() !== '');\n return hasNoElements && hasOnlyEmptyTextNodes;\n}\n\nexport function applySlotContentStates(slot: HTMLSlotElement, element: HTMLElement & { _internals: ElementInternals }) {\n const nodes = slot.assignedNodes();\n const name = slot.name ?? 'slot';\n\n if (nodes.length) {\n element._internals.states.add(`has-${name}`);\n } else {\n element._internals.states.delete(`has-${name}`);\n }\n}\n\nexport function getDisplayValue(option?: { label?: string; value?: string }): string {\n return option?.label || option?.value || '';\n}\n\n/** determines if HTML element matches the given component tag */\nexport function matchesElementName(element: Partial<HTMLElement>, component: { metadata: { tag: string } }) {\n return element.localName === component.metadata.tag;\n}\n\nexport function createGhostElement(sourceElement: HTMLElement) {\n const ghost = globalThis.document.createElement('div');\n const { width } = sourceElement.getBoundingClientRect();\n ghost.setAttribute('nve-ghost', '');\n ghost.style.minWidth = `${width}px`;\n ghost.style.maxWidth = `${width}px`;\n ghost.style.height = '1px';\n ghost.slot = sourceElement.slot;\n return ghost;\n}\n\nexport function sameRenderRoot(element1: HTMLElement, element2: HTMLElement) {\n const root1 = element1.getRootNode();\n const root2 = element2.getRootNode();\n const sameShadowRoot = root1 instanceof ShadowRoot && root2 instanceof ShadowRoot && root1 === root2;\n const sameDocumentRoot = root1 === globalThis.document && root2 === globalThis.document;\n const sameUnattachedRoot = root1 === root2;\n return sameShadowRoot || sameDocumentRoot || sameUnattachedRoot;\n}\n\nexport function getAnchorNames(element: HTMLElement): string[] {\n return (\n element.style.anchorName\n ?.split(',')\n ?.map(name => name.trim())\n ?.filter(name => name !== 'none' && name !== '') ?? []\n );\n}\n\nexport function removeAnchorName(element: HTMLElement, name: string) {\n const anchorNames = getAnchorNames(element);\n element.style.anchorName = anchorNames.filter(i => i !== name).join(',');\n}\n\nexport function appendAnchorName(element: HTMLElement, name: string) {\n element.style.anchorName = Array.from(new Set([...getAnchorNames(element), name])).join(',');\n}\n\n/**\n * Returns true when both arrays have the same length and each index is strictly equal (`===`).\n */\nexport function sameOrderedStringArray(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((value, index) => value === b[index]);\n}\n\n/**\n * Returns unique non-empty strings in first-seen order (insertion order of a `Set` over the filtered list).\n */\nexport function uniqueNonEmptyStrings(values: Iterable<string | null | undefined>): string[] {\n return Array.from(\n new Set(Array.from(values).filter((value): value is string => typeof value === 'string' && value.length > 0))\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dom.js","names":[],"sources":["../../../src/internal/utils/dom.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { GlobalStateService } from '../services/global.service.js';\nimport { LogService } from '../services/log.service.js';\nimport type { ElementDefinition } from '../types/index.js';\nimport { isFocusable } from './focus.js';\n\nexport function getChildren(node: Document | Node | HTMLElement): Element[] {\n if (node instanceof Document && node.documentElement) {\n return Array.from(node.documentElement.children); // root document children\n } else if (node instanceof HTMLElement && node.shadowRoot) {\n return Array.from(node.shadowRoot.children); // shadow root direct children\n } else if (node instanceof HTMLSlotElement && node.assignedElements) {\n const slotted = node.assignedElements(); // slotted elements\n return slotted.length ? slotted : Array.from(node.children); // slot fallback\n } else {\n return Array.from((node as HTMLElement).children); // light DOM direct children\n }\n}\n\nexport function generateId() {\n const uint32 = self.crypto.getRandomValues(new Uint32Array(1))[0]!;\n return `_${uint32.toString(16)}`;\n}\n\nexport function getAttributeChanges(element: HTMLElement, attr: string, fn: (attrValue: string | null) => void) {\n fn(element.getAttribute(attr));\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n if (mutation.attributeName === attr) {\n fn((mutation.target as HTMLElement).getAttribute(attr));\n }\n });\n });\n observer.observe(element, { attributes: true, subtree: true });\n return observer;\n}\n\nexport function getAttributeListChanges(element: HTMLElement, attrs: string[], fn: (mutation: MutationRecord) => void) {\n const observer = new MutationObserver(mutations => {\n mutations.forEach(mutation => {\n if (mutation.attributeName && attrs.includes(mutation.attributeName)) {\n fn(mutation);\n }\n });\n });\n observer.observe(element, { attributes: true, subtree: true });\n return observer;\n}\n\n/**\n * Appends styles to the render root of a given element. This is useful for\n * styles that apply outside the scope of the element's shadow\n * root such as UA styles --webkit-* that won't work in a ::slotted selector\n */\nexport function appendRootNodeStyle(host: HTMLElement, styles: string) {\n const stylesheet = new CSSStyleSheet();\n stylesheet.replaceSync(styles);\n const root = host.getRootNode() as Document | ShadowRoot;\n if (root.adoptedStyleSheets) {\n const hasStyleSheet = root.adoptedStyleSheets\n .map(s => styleSheetToString(s))\n .find(s => s === styleSheetToString(stylesheet));\n if (!hasStyleSheet) {\n root.adoptedStyleSheets = [...Array.from(root.adoptedStyleSheets), stylesheet];\n }\n }\n return stylesheet;\n}\n\nexport function styleSheetToString(stylesheet: CSSStyleSheet) {\n return stylesheet.cssRules\n ? Array.from(stylesheet.cssRules)\n .map(rule => rule.cssText || '')\n .join('\\n')\n : '';\n}\n\n/** Intercepts a property setter on an element so `callback` fires on every assignment. Does not use a MutationObserver. */\nexport function getPropertyChanges(element: HTMLElement, key: string, callback: (value: unknown) => void) {\n const proto = Object.getPrototypeOf(element);\n const descriptor = Object.getOwnPropertyDescriptor(proto, key);\n if (!descriptor) return;\n const own = Object.getOwnPropertyDescriptor(element, key);\n if (own && own.configurable === false) return;\n Object.defineProperty(element, key, {\n configurable: true,\n get: descriptor.get,\n set: (val: unknown) => {\n descriptor.set!.call(element, val);\n callback(val);\n }\n });\n\n return () => {\n if (own) {\n Object.defineProperty(element, key, own);\n return;\n }\n\n Reflect.deleteProperty(element, key);\n };\n}\n\n/* used for cases of needing to know a property update outside of lit, example a native input value prop change */\nexport function getElementUpdate(element: HTMLElement, key: string, callback: (value: unknown) => void) {\n if (element.hasAttribute(key)) {\n callback(element.getAttribute(key));\n } else if ((element as unknown as Record<string, unknown>)[key] !== undefined) {\n callback((element as unknown as Record<string, unknown>)[key]);\n }\n\n const cleanupPropertyChanges = getPropertyChanges(element, key, callback);\n const observer = getAttributeChanges(element, key, val => callback(val));\n const disconnect = observer.disconnect.bind(observer);\n\n observer.disconnect = () => {\n cleanupPropertyChanges?.();\n disconnect();\n };\n\n return observer;\n}\n\nexport function clickOutsideElementBounds(event: PointerEvent | MouseEvent, element: HTMLElement) {\n const { left, right, top, bottom } = element.getBoundingClientRect();\n return event.clientX < left || event.clientX > right || event.clientY < top || event.clientY > bottom;\n}\n\n/** parses number out of basic calc generated by the design tokens */\nexport function parseTokenNumber(value: string) {\n return parseInt(value.includes('calc') ? value.split('*')[1]!.replace('px)', '').trim() : value, 10) || 0;\n}\n\nexport function getCustomElementRegistry(element: Element): CustomElementRegistry | undefined {\n const root = element.getRootNode();\n const CustomElementRegistryConstructor =\n element.ownerDocument.defaultView?.CustomElementRegistry ?? globalThis.CustomElementRegistry;\n if (\n CustomElementRegistryConstructor &&\n 'customElementRegistry' in root &&\n root.customElementRegistry instanceof CustomElementRegistryConstructor\n ) {\n return root.customElementRegistry;\n }\n const documentRegistry = element.ownerDocument.defaultView?.customElements;\n if (documentRegistry) return documentRegistry;\n return typeof customElements === 'undefined' ? undefined : customElements;\n}\n\n/** true if the browser supports scoped custom element registries */\nexport const supportsScopedRegistry =\n globalThis.CustomElementRegistry && 'initialize' in CustomElementRegistry.prototype;\n\n/** defines an element with the given custom element registry */\nexport function defineElement(element: ElementDefinition, customElementRegistry: CustomElementRegistry) {\n Object.entries(element.elementDefinitions ?? {})\n .filter(([_tag, e]) => !customElementRegistry.get(e.metadata.tag))\n .forEach(([_tag, e]) => {\n defineElement(e, customElementRegistry);\n });\n\n if (!customElementRegistry.get(element.metadata.tag)) {\n customElementRegistry.define(element.metadata.tag, element);\n\n if (customElementRegistry === customElements) {\n GlobalStateService.dispatch('NVE_ELEMENT_DEFINE', {\n elementRegistry: { [element.metadata.tag]: element.metadata.version }\n });\n }\n }\n}\n\n/** defines an element with the global custom element registry */\nexport function define(element: ElementDefinition) {\n const { version } = element.metadata;\n\n // if scoped registry supported, register only the root element to global registry\n if (supportsScopedRegistry && !customElements.get(element.metadata.tag)) {\n customElements.define(element.metadata.tag, element);\n GlobalStateService.dispatch('NVE_ELEMENT_DEFINE', {\n elementRegistry: { [element.metadata.tag]: element.metadata.version }\n });\n } else {\n // if scoped registry not supported, register the element and all its children to the global registry\n defineElement(element, customElements);\n }\n\n // warn on duplicate version\n if (\n GlobalStateService.state.elementRegistry[element.metadata.tag] !== version &&\n globalThis?.location?.hostname === 'localhost'\n ) {\n void import('./audit-logs.js').then(m =>\n console.warn(m.getDuplicatePackageVersionWarning(element.metadata.tag, version))\n );\n }\n}\n\nexport function isContextMenuClick(event: MouseEvent) {\n return (event.buttons === 2 && !event.ctrlKey) || (event.buttons === 1 && event.ctrlKey);\n}\n\nexport function getFlattenedFocusableItems(element: Node, depth = 10) {\n return getFlattenedDOMTree(element, depth).filter((e: HTMLElement) => isFocusable(e)) as HTMLElement[];\n}\n\n/**\n * Preserves visual DOM ordering when using slots within Shadow DOM\n * See more information/resources on Shadow DOM linear traversal\n * https://nolanlawson.com/2021/02/13/managing-focus-in-the-shadow-dom/\n * https://www.abeautifulsite.net/posts/querying-through-shadow-roots/\n */\nexport function getFlattenedDOMTree(node: Node, depth = 10): HTMLElement[] {\n return (\n Array.from(getChildren(node)).reduce(\n (p: unknown[], n: Node) => [\n ...p,\n [n, [...Array.from(getChildren(n)).map(i => [i, getFlattenedDOMTree(i, depth)])]]\n ],\n []\n ) as unknown as HTMLElement[]\n ).flat(depth);\n}\n\nexport function validKeyNavigationCode(e: KeyboardEvent) {\n return keynavCodes.has(e.code);\n}\n\nexport enum KeynavCode {\n End = 'End',\n Home = 'Home',\n PageUp = 'PageUp',\n PageDown = 'PageDown',\n ArrowUp = 'ArrowUp',\n ArrowDown = 'ArrowDown',\n ArrowLeft = 'ArrowLeft',\n ArrowRight = 'ArrowRight'\n}\n\nconst keynavCodes: Set<string> = new Set(Object.values(KeynavCode));\n\nexport function hasInvalidDOMGrid(rows: HTMLElement[]) {\n return rows.some(row => row.children.length !== rows[0]!.children.length);\n}\n\nexport function removeEmptyTextNode(node: Node) {\n if ((node as Text)?.wholeText?.trim() === '') {\n (node as Text).remove();\n }\n}\n\nexport function scrollBarWidth() {\n const div = globalThis.document.createElement('div');\n div.style.setProperty('width', '100px');\n div.style.setProperty('height', '100px');\n div.style.setProperty('overflow', 'scroll');\n div.style.setProperty('position', 'absolute');\n div.style.setProperty('top', '-9999px');\n globalThis.document.body.appendChild(div);\n const width = div.offsetWidth - div.clientWidth;\n globalThis.document.body.removeChild(div);\n return width;\n}\n\nexport function hasScrollBar(el: HTMLElement) {\n return el.scrollHeight > el.clientHeight;\n}\n\nexport function hasHorizontalScrollBar(el: HTMLElement) {\n return el.scrollWidth > el.clientWidth;\n}\n\nexport function endOfScrollBox(element: HTMLElement, offset = 0) {\n return element.scrollTop + element.offsetHeight + offset >= element.scrollHeight;\n}\n\nexport async function openEyeDropper(): Promise<string> {\n const EyeDropperConstructor = (\n globalThis as unknown as { EyeDropper?: new () => { open: () => Promise<{ sRGBHex: string }> } }\n ).EyeDropper;\n\n if (!EyeDropperConstructor) {\n LogService.warn('EyeDropper API is unavailable');\n return '';\n }\n\n try {\n return (await new EyeDropperConstructor().open()).sRGBHex;\n } catch (e) {\n LogService.warn(`EyeDropper selection failed: ${(e as Error).message}`);\n return '';\n }\n}\n\n/**\n * provides a object with key/value of the currently applied design tokens\n */\nexport function getThemeTokens(element = globalThis.document.querySelector(':root')!) {\n // default root or provided element\n const styles = getComputedStyle(element);\n let parent: CSSStyleSheet[] = [];\n\n // check for parent iframe, same domain iframes change how the browser accesses style sheets\n try {\n parent = Array.from(globalThis.parent.document.styleSheets);\n } catch {\n // if not accessible, skip\n }\n\n return [...parent, ...Array.from(globalThis.document.styleSheets)]\n .reduce((finalArr: string[][], sheet) => {\n let rules: CSSRule[] = [];\n try {\n rules = [...sheet.cssRules];\n } catch {\n // if the style sheet is not accessible, skip\n }\n return finalArr.concat(\n rules\n .filter(rule => rule.type === 1)\n .reduce((propValArr: string[][], rule) => {\n const props = [...(rule as CSSStyleRule).style]\n .filter((p: string) => p.trim().includes('--nve'))\n .map((propName: string) => [\n propName.trim(),\n (rule as CSSStyleRule).style.getPropertyValue(propName).trim()\n ]);\n return [...propValArr, ...props];\n }, [])\n );\n }, [])\n .reduce(\n (p: Record<string, string>, token: string[]) => ({ ...p, [token[0]!]: styles.getPropertyValue(token[0]!) }),\n {}\n );\n}\n\nexport function removeEmptySlotWhitespace(slot: HTMLSlotElement) {\n if (slotContainsOnlyWhitespace(slot)) {\n slot.assignedNodes().forEach((node: Node) => node.parentNode?.removeChild(node));\n }\n}\n\nexport function slotContainsOnlyWhitespace(slot: HTMLSlotElement) {\n const hasNoElements = !slot.assignedNodes().find(i => i.nodeType !== Node.TEXT_NODE);\n const hasOnlyEmptyTextNodes = !slot\n .assignedNodes()\n .find(i => i.nodeType === Node.TEXT_NODE && (i.textContent ?? '').trim() !== '');\n return hasNoElements && hasOnlyEmptyTextNodes;\n}\n\nexport function applySlotContentStates(slot: HTMLSlotElement, element: HTMLElement & { _internals: ElementInternals }) {\n const nodes = slot.assignedNodes();\n const name = slot.name ?? 'slot';\n\n if (nodes.length) {\n element._internals.states.add(`has-${name}`);\n } else {\n element._internals.states.delete(`has-${name}`);\n }\n}\n\nexport function getDisplayValue(option?: { label?: string; value?: string }): string {\n return option?.label || option?.value || '';\n}\n\n/** determines if HTML element matches the given component tag */\nexport function matchesElementName(element: Partial<HTMLElement>, component: { metadata: { tag: string } }) {\n return element.localName === component.metadata.tag;\n}\n\nexport function createGhostElement(sourceElement: HTMLElement) {\n const ghost = globalThis.document.createElement('div');\n const { width } = sourceElement.getBoundingClientRect();\n ghost.setAttribute('nve-ghost', '');\n ghost.style.minWidth = `${width}px`;\n ghost.style.maxWidth = `${width}px`;\n ghost.style.height = '1px';\n ghost.slot = sourceElement.slot;\n return ghost;\n}\n\nexport function sameRenderRoot(element1: HTMLElement, element2: HTMLElement) {\n const root1 = element1.getRootNode();\n const root2 = element2.getRootNode();\n const sameShadowRoot = root1 instanceof ShadowRoot && root2 instanceof ShadowRoot && root1 === root2;\n const sameDocumentRoot = root1 === globalThis.document && root2 === globalThis.document;\n const sameUnattachedRoot = root1 === root2;\n return sameShadowRoot || sameDocumentRoot || sameUnattachedRoot;\n}\n\nexport function getAnchorNames(element: HTMLElement): string[] {\n return (\n element.style.anchorName\n ?.split(',')\n ?.map(name => name.trim())\n ?.filter(name => name !== 'none' && name !== '') ?? []\n );\n}\n\nexport function removeAnchorName(element: HTMLElement, name: string) {\n const anchorNames = getAnchorNames(element);\n element.style.anchorName = anchorNames.filter(i => i !== name).join(',');\n}\n\nexport function appendAnchorName(element: HTMLElement, name: string) {\n element.style.anchorName = Array.from(new Set([...getAnchorNames(element), name])).join(',');\n}\n\n/**\n * Returns true when both arrays have the same length and each index is strictly equal (`===`).\n */\nexport function sameOrderedStringArray(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((value, index) => value === b[index]);\n}\n\n/**\n * Returns unique non-empty strings in first-seen order (insertion order of a `Set` over the filtered list).\n */\nexport function uniqueNonEmptyStrings(values: Iterable<string | null | undefined>): string[] {\n return Array.from(\n new Set(Array.from(values).filter((value): value is string => typeof value === 'string' && value.length > 0))\n );\n}\n"],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ export declare function isFocusable(element: Element): boolean;
|
|
|
2
2
|
/** returns interactive elements that does not require advanced keyboard interactions like arrow/navigation */
|
|
3
3
|
export declare function isSimpleFocusable(element: Element): boolean;
|
|
4
4
|
export declare function getActiveElement(root?: Document | ShadowRoot): Element | null;
|
|
5
|
+
/** Returns whether an element itself owns focus in its immediate document or shadow root. */
|
|
6
|
+
export declare function isImmediateRootActiveElement(element: Element): boolean;
|
|
5
7
|
export declare function focusElement(element: HTMLElement): void;
|
|
6
8
|
export declare function focusElementTimeout(element: HTMLElement): void;
|
|
7
9
|
export declare function setActiveKeyListItem(items: NodeListOf<HTMLElement> | HTMLElement[], item: HTMLElement): void;
|
|
@@ -30,19 +30,26 @@ function t(e) {
|
|
|
30
30
|
function n(e = globalThis.document) {
|
|
31
31
|
return e.activeElement && e.activeElement.shadowRoot ? n(e.activeElement.shadowRoot) ?? e.activeElement : e.activeElement;
|
|
32
32
|
}
|
|
33
|
-
function r(
|
|
34
|
-
t
|
|
33
|
+
function r(e) {
|
|
34
|
+
let t = e.getRootNode();
|
|
35
|
+
return i(t) && t.activeElement === e;
|
|
35
36
|
}
|
|
36
37
|
function i(e) {
|
|
37
|
-
|
|
38
|
+
return "activeElement" in e;
|
|
38
39
|
}
|
|
39
|
-
function a(
|
|
40
|
-
e
|
|
40
|
+
function a(t) {
|
|
41
|
+
t && !e(t) ? (t.setAttribute("tabindex", "-1"), t.focus(), t.addEventListener("blur", () => t.removeAttribute("tabindex"), { once: !0 })) : t?.focus();
|
|
41
42
|
}
|
|
42
43
|
function o(e) {
|
|
43
|
-
|
|
44
|
+
setTimeout(() => a(e));
|
|
44
45
|
}
|
|
45
46
|
function s(e, t) {
|
|
47
|
+
e.forEach((e) => e.tabIndex = -1), t.tabIndex = 0;
|
|
48
|
+
}
|
|
49
|
+
function c(e) {
|
|
50
|
+
e.forEach((e) => e.tabIndex = -1), e[0] && (e[0].tabIndex = 0);
|
|
51
|
+
}
|
|
52
|
+
function l(e, t) {
|
|
46
53
|
let n = (e) => e.code === "Space" || e.code === "ArrowUp" || e.code === "ArrowDown";
|
|
47
54
|
e.addEventListener("pointerdown", (e) => {
|
|
48
55
|
e.preventDefault();
|
|
@@ -55,6 +62,6 @@ function s(e, t) {
|
|
|
55
62
|
});
|
|
56
63
|
}
|
|
57
64
|
//#endregion
|
|
58
|
-
export {
|
|
65
|
+
export { a as focusElement, o as focusElementTimeout, n as getActiveElement, c as initializeKeyListItems, e as isFocusable, r as isImmediateRootActiveElement, t as isSimpleFocusable, l as onListboxActivate, s as setActiveKeyListItem };
|
|
59
66
|
|
|
60
67
|
//# sourceMappingURL=focus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus.js","names":[],"sources":["../../../src/internal/utils/focus.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function isFocusable(element: Element) {\n return (\n element.matches(\n [\n 'a[href]',\n 'area[href]',\n 'input',\n 'button',\n 'select',\n 'textarea',\n 'iframe',\n 'object',\n 'embed',\n '*[tabindex]',\n '*[contenteditable=true]',\n '[role=button]'\n ].join(',')\n ) &&\n element.matches(':not([disabled], [inert])') &&\n !element.closest(`[inert]`) &&\n !element.closest('[popover]')?.matches(':not(:popover-open)')\n );\n}\n\n/** returns interactive elements that does not require advanced keyboard interactions like arrow/navigation */\nexport function isSimpleFocusable(element: Element) {\n return element.matches(\n [\n 'a[href]',\n 'button:not([disabled])',\n 'input[type=checkbox]',\n 'input[type=radio]',\n 'object',\n 'embed',\n '*[tabindex]',\n '[role=button]:not([disabled])'\n ].join(',')\n );\n}\n\nexport function getActiveElement(root: Document | ShadowRoot = globalThis.document): Element | null {\n if (root.activeElement && root.activeElement.shadowRoot) {\n return getActiveElement(root.activeElement.shadowRoot) ?? root.activeElement;\n } else {\n return root.activeElement;\n }\n}\n\nexport function focusElement(element: HTMLElement) {\n if (element && !isFocusable(element)) {\n element.setAttribute('tabindex', '-1');\n element.focus();\n element.addEventListener('blur', () => element.removeAttribute('tabindex'), { once: true });\n } else {\n element?.focus();\n }\n}\n\nexport function focusElementTimeout(element: HTMLElement) {\n setTimeout(() => focusElement(element));\n}\n\nexport function setActiveKeyListItem(items: NodeListOf<HTMLElement> | HTMLElement[], item: HTMLElement) {\n items.forEach(i => (i.tabIndex = -1));\n item.tabIndex = 0;\n}\n\nexport function initializeKeyListItems(items: NodeListOf<HTMLElement> | HTMLElement[]) {\n items.forEach(i => (i.tabIndex = -1));\n items[0] && (items[0].tabIndex = 0);\n}\n\n/** determines if user interaction is a valid interaction for activating a listbox type */\nexport function onListboxActivate(\n element: HTMLElement & { disabled?: boolean },\n fn: (event: KeyboardEvent | PointerEvent) => void\n) {\n const validKey = (e: KeyboardEvent) => e.code === 'Space' || e.code === 'ArrowUp' || e.code === 'ArrowDown';\n\n element.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n });\n\n // Chrome's LightDismissFromClick runs auto-popover light dismiss from click;\n // opening on pointerup can close immediately in the same gesture.\n // https://issues.chromium.org/issues/408010435\n element.addEventListener('click', (e: PointerEvent) => {\n e.preventDefault();\n\n if (!element.disabled) {\n fn(e);\n }\n });\n\n element.addEventListener('keyup', (e: KeyboardEvent) => {\n if (validKey(e) && !element.disabled) {\n fn(e);\n }\n });\n\n element.addEventListener('keydown', (e: KeyboardEvent) => {\n if (validKey(e) && !element.disabled) {\n e.preventDefault();\n }\n });\n}\n"],"mappings":";AAGA,SAAgB,EAAY,GAAkB;CAC5C,OACE,EAAQ,QACN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,CACZ,KACA,EAAQ,QAAQ,2BAA2B,KAC3C,CAAC,EAAQ,QAAQ,SAAS,KAC1B,CAAC,EAAQ,QAAQ,WAAW,CAAC,EAAE,QAAQ,qBAAqB;AAEhE;AAGA,SAAgB,EAAkB,GAAkB;CAClD,OAAO,EAAQ,QACb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,CACZ;AACF;AAEA,SAAgB,EAAiB,IAA8B,WAAW,UAA0B;CAIhG,OAHE,EAAK,iBAAiB,EAAK,cAAc,aACpC,EAAiB,EAAK,cAAc,UAAU,KAAK,EAAK,gBAExD,EAAK;AAEhB;AAEA,SAAgB,EAAa,GAAsB;CACjD,AAAI,KAAW,CAAC,EAAY,CAAO,KACjC,EAAQ,aAAa,YAAY,IAAI,GACrC,EAAQ,MAAM,GACd,EAAQ,iBAAiB,cAAc,EAAQ,gBAAgB,UAAU,GAAG,EAAE,MAAM,GAAK,CAAC,KAE1F,GAAS,MAAM;AAEnB;AAEA,SAAgB,EAAoB,GAAsB;CACxD,iBAAiB,EAAa,CAAO,CAAC;AACxC;AAEA,SAAgB,EAAqB,GAAgD,GAAmB;CAEtG,AADA,EAAM,SAAQ,MAAM,EAAE,WAAW,EAAG,GACpC,EAAK,WAAW;AAClB;AAEA,SAAgB,EAAuB,GAAgD;CAErF,AADA,EAAM,SAAQ,MAAM,EAAE,WAAW,EAAG,GACpC,EAAM,OAAO,EAAM,EAAE,CAAC,WAAW;AACnC;AAGA,SAAgB,EACd,GACA,GACA;CACA,IAAM,KAAY,MAAqB,EAAE,SAAS,WAAW,EAAE,SAAS,aAAa,EAAE,SAAS;CAuBhG,AArBA,EAAQ,iBAAiB,gBAAgB,MAAoB;EAC3D,EAAE,eAAe;CACnB,CAAC,GAKD,EAAQ,iBAAiB,UAAU,MAAoB;EAGrD,AAFA,EAAE,eAAe,GAEZ,EAAQ,YACX,EAAG,CAAC;CAER,CAAC,GAED,EAAQ,iBAAiB,UAAU,MAAqB;EACtD,AAAI,EAAS,CAAC,KAAK,CAAC,EAAQ,YAC1B,EAAG,CAAC;CAER,CAAC,GAED,EAAQ,iBAAiB,YAAY,MAAqB;EACxD,AAAI,EAAS,CAAC,KAAK,CAAC,EAAQ,YAC1B,EAAE,eAAe;CAErB,CAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"focus.js","names":[],"sources":["../../../src/internal/utils/focus.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function isFocusable(element: Element) {\n return (\n element.matches(\n [\n 'a[href]',\n 'area[href]',\n 'input',\n 'button',\n 'select',\n 'textarea',\n 'iframe',\n 'object',\n 'embed',\n '*[tabindex]',\n '*[contenteditable=true]',\n '[role=button]'\n ].join(',')\n ) &&\n element.matches(':not([disabled], [inert])') &&\n !element.closest(`[inert]`) &&\n !element.closest('[popover]')?.matches(':not(:popover-open)')\n );\n}\n\n/** returns interactive elements that does not require advanced keyboard interactions like arrow/navigation */\nexport function isSimpleFocusable(element: Element) {\n return element.matches(\n [\n 'a[href]',\n 'button:not([disabled])',\n 'input[type=checkbox]',\n 'input[type=radio]',\n 'object',\n 'embed',\n '*[tabindex]',\n '[role=button]:not([disabled])'\n ].join(',')\n );\n}\n\nexport function getActiveElement(root: Document | ShadowRoot = globalThis.document): Element | null {\n if (root.activeElement && root.activeElement.shadowRoot) {\n return getActiveElement(root.activeElement.shadowRoot) ?? root.activeElement;\n } else {\n return root.activeElement;\n }\n}\n\n/** Returns whether an element itself owns focus in its immediate document or shadow root. */\nexport function isImmediateRootActiveElement(element: Element): boolean {\n const root = element.getRootNode();\n return hasActiveElement(root) && root.activeElement === element;\n}\n\nfunction hasActiveElement(root: Node): root is Node & { readonly activeElement: Element | null } {\n return 'activeElement' in root;\n}\n\nexport function focusElement(element: HTMLElement) {\n if (element && !isFocusable(element)) {\n element.setAttribute('tabindex', '-1');\n element.focus();\n element.addEventListener('blur', () => element.removeAttribute('tabindex'), { once: true });\n } else {\n element?.focus();\n }\n}\n\nexport function focusElementTimeout(element: HTMLElement) {\n setTimeout(() => focusElement(element));\n}\n\nexport function setActiveKeyListItem(items: NodeListOf<HTMLElement> | HTMLElement[], item: HTMLElement) {\n items.forEach(i => (i.tabIndex = -1));\n item.tabIndex = 0;\n}\n\nexport function initializeKeyListItems(items: NodeListOf<HTMLElement> | HTMLElement[]) {\n items.forEach(i => (i.tabIndex = -1));\n items[0] && (items[0].tabIndex = 0);\n}\n\n/** determines if user interaction is a valid interaction for activating a listbox type */\nexport function onListboxActivate(\n element: HTMLElement & { disabled?: boolean },\n fn: (event: KeyboardEvent | PointerEvent) => void\n) {\n const validKey = (e: KeyboardEvent) => e.code === 'Space' || e.code === 'ArrowUp' || e.code === 'ArrowDown';\n\n element.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n });\n\n // Chrome's LightDismissFromClick runs auto-popover light dismiss from click;\n // opening on pointerup can close immediately in the same gesture.\n // https://issues.chromium.org/issues/408010435\n element.addEventListener('click', (e: PointerEvent) => {\n e.preventDefault();\n\n if (!element.disabled) {\n fn(e);\n }\n });\n\n element.addEventListener('keyup', (e: KeyboardEvent) => {\n if (validKey(e) && !element.disabled) {\n fn(e);\n }\n });\n\n element.addEventListener('keydown', (e: KeyboardEvent) => {\n if (validKey(e) && !element.disabled) {\n e.preventDefault();\n }\n });\n}\n"],"mappings":";AAGA,SAAgB,EAAY,GAAkB;CAC5C,OACE,EAAQ,QACN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,CACZ,KACA,EAAQ,QAAQ,2BAA2B,KAC3C,CAAC,EAAQ,QAAQ,SAAS,KAC1B,CAAC,EAAQ,QAAQ,WAAW,CAAC,EAAE,QAAQ,qBAAqB;AAEhE;AAGA,SAAgB,EAAkB,GAAkB;CAClD,OAAO,EAAQ,QACb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG,CACZ;AACF;AAEA,SAAgB,EAAiB,IAA8B,WAAW,UAA0B;CAIhG,OAHE,EAAK,iBAAiB,EAAK,cAAc,aACpC,EAAiB,EAAK,cAAc,UAAU,KAAK,EAAK,gBAExD,EAAK;AAEhB;AAGA,SAAgB,EAA6B,GAA2B;CACtE,IAAM,IAAO,EAAQ,YAAY;CACjC,OAAO,EAAiB,CAAI,KAAK,EAAK,kBAAkB;AAC1D;AAEA,SAAS,EAAiB,GAAuE;CAC/F,OAAO,mBAAmB;AAC5B;AAEA,SAAgB,EAAa,GAAsB;CACjD,AAAI,KAAW,CAAC,EAAY,CAAO,KACjC,EAAQ,aAAa,YAAY,IAAI,GACrC,EAAQ,MAAM,GACd,EAAQ,iBAAiB,cAAc,EAAQ,gBAAgB,UAAU,GAAG,EAAE,MAAM,GAAK,CAAC,KAE1F,GAAS,MAAM;AAEnB;AAEA,SAAgB,EAAoB,GAAsB;CACxD,iBAAiB,EAAa,CAAO,CAAC;AACxC;AAEA,SAAgB,EAAqB,GAAgD,GAAmB;CAEtG,AADA,EAAM,SAAQ,MAAM,EAAE,WAAW,EAAG,GACpC,EAAK,WAAW;AAClB;AAEA,SAAgB,EAAuB,GAAgD;CAErF,AADA,EAAM,SAAQ,MAAM,EAAE,WAAW,EAAG,GACpC,EAAM,OAAO,EAAM,EAAE,CAAC,WAAW;AACnC;AAGA,SAAgB,EACd,GACA,GACA;CACA,IAAM,KAAY,MAAqB,EAAE,SAAS,WAAW,EAAE,SAAS,aAAa,EAAE,SAAS;CAuBhG,AArBA,EAAQ,iBAAiB,gBAAgB,MAAoB;EAC3D,EAAE,eAAe;CACnB,CAAC,GAKD,EAAQ,iBAAiB,UAAU,MAAoB;EAGrD,AAFA,EAAE,eAAe,GAEZ,EAAQ,YACX,EAAG,CAAC;CAER,CAAC,GAED,EAAQ,iBAAiB,UAAU,MAAqB;EACtD,AAAI,EAAS,CAAC,KAAK,CAAC,EAAQ,YAC1B,EAAG,CAAC;CAER,CAAC,GAED,EAAQ,iBAAiB,YAAY,MAAqB;EACxD,AAAI,EAAS,CAAC,KAAK,CAAC,EAAQ,YAC1B,EAAE,eAAe;CAErB,CAAC;AACH"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function finiteOr(value: number | undefined, fallback: number): number;
|
|
2
|
+
export declare function nonnegativeFiniteOr(value: number | undefined, fallback: number): number;
|
|
3
|
+
export declare function positiveFiniteOr(value: number | undefined, fallback: number): number;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/internal/utils/numeric.ts
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
return e !== void 0 && Number.isFinite(e) ? e : t;
|
|
4
|
+
}
|
|
5
|
+
function t(e, t) {
|
|
6
|
+
return e !== void 0 && Number.isFinite(e) && e >= 0 ? e : t;
|
|
7
|
+
}
|
|
8
|
+
function n(e, t) {
|
|
9
|
+
return e !== void 0 && Number.isFinite(e) && e > 0 ? e : t;
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { e as finiteOr, t as nonnegativeFiniteOr, n as positiveFiniteOr };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=numeric.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric.js","names":[],"sources":["../../../src/internal/utils/numeric.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nexport function finiteOr(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isFinite(value) ? value : fallback;\n}\n\nexport function nonnegativeFiniteOr(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isFinite(value) && value >= 0 ? value : fallback;\n}\n\nexport function positiveFiniteOr(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n"],"mappings":";AAGA,SAAgB,EAAS,GAA2B,GAA0B;CAC5E,OAAO,MAAU,KAAA,KAAa,OAAO,SAAS,CAAK,IAAI,IAAQ;AACjE;AAEA,SAAgB,EAAoB,GAA2B,GAA0B;CACvF,OAAO,MAAU,KAAA,KAAa,OAAO,SAAS,CAAK,KAAK,KAAS,IAAI,IAAQ;AAC/E;AAEA,SAAgB,EAAiB,GAA2B,GAA0B;CACpF,OAAO,MAAU,KAAA,KAAa,OAAO,SAAS,CAAK,KAAK,IAAQ,IAAI,IAAQ;AAC9E"}
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
{
|
|
46
46
|
"id": "logo-light-theme",
|
|
47
47
|
"name": "LightTheme",
|
|
48
|
-
"template": "<div
|
|
48
|
+
"template": "<div nve-theme=\"root light\" nve-layout=\"row gap:xs align:wrap pad:sm\" style=\"background: var(--nve-sys-layer-container-background) !important\">\n <nve-logo aria-label=\"NVIDIA\">NV</nve-logo>\n <nve-logo color=\"red-cardinal\" aria-label=\"red cardinal\">Rc</nve-logo>\n <nve-logo color=\"gray-slate\" aria-label=\"gray slate\">Gs</nve-logo>\n <nve-logo color=\"gray-denim\" aria-label=\"gray denim\">Gd</nve-logo>\n <nve-logo color=\"blue-indigo\" aria-label=\"blue indigo\">Bi</nve-logo>\n <nve-logo color=\"blue-cobalt\" aria-label=\"blue cobalt\">Bc</nve-logo>\n <nve-logo color=\"blue-sky\" aria-label=\"blue sky\">Bs</nve-logo>\n <nve-logo color=\"teal-cyan\" aria-label=\"teal cyan\">Tc</nve-logo>\n <nve-logo color=\"green-mint\" aria-label=\"green mint\">Gm</nve-logo>\n <nve-logo color=\"teal-seafoam\" aria-label=\"teal seafoam\">Ts</nve-logo>\n <nve-logo color=\"green-grass\" aria-label=\"green grass\">Gg</nve-logo>\n <nve-logo color=\"yellow-amber\" aria-label=\"yellow amber\">Ya</nve-logo>\n <nve-logo color=\"orange-pumpkin\" aria-label=\"orange pumpkin\">Op</nve-logo>\n <nve-logo color=\"red-tomato\" aria-label=\"red tomato\">Rt</nve-logo>\n <nve-logo color=\"pink-magenta\" aria-label=\"pink magenta\">Pm</nve-logo>\n <nve-logo color=\"purple-plum\" aria-label=\"purple plum\">Pp</nve-logo>\n <nve-logo color=\"purple-violet\" aria-label=\"purple violet\">Pv</nve-logo>\n <nve-logo color=\"purple-lavender\" aria-label=\"purple lavender\">Pl</nve-logo>\n <nve-logo color=\"pink-rose\" aria-label=\"pink rose\">Pr</nve-logo>\n <nve-logo color=\"green-jade\" aria-label=\"green jade\">Gj</nve-logo>\n <nve-logo color=\"lime-pear\" aria-label=\"lime pear\">Lp</nve-logo>\n <nve-logo color=\"yellow-nova\" aria-label=\"yellow nova\">Yn</nve-logo>\n <nve-logo color=\"brand-green\" aria-label=\"brand green\">Bg</nve-logo>\n</div>\n",
|
|
49
49
|
"summary": "Logo colors optimized for light theme backgrounds. Ensures proper contrast and visibility when used in light mode interfaces.",
|
|
50
50
|
"description": "",
|
|
51
51
|
"composition": false,
|
package/dist/logo/logo2.js
CHANGED
package/dist/menu/menu-item2.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.examples.js","names":[],"sources":["../../src/menu/menu.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html } from 'lit';\nimport '@nvidia-elements/core/button/define.js';\nimport '@nvidia-elements/core/dropdown/define.js';\nimport '@nvidia-elements/core/icon/define.js';\nimport '@nvidia-elements/core/menu/define.js';\nimport '@nvidia-elements/core/logo/define.js';\nimport '@nvidia-elements/core/search/define.js';\nimport '@nvidia-elements/core/drawer/define.js';\nimport '@nvidia-elements/core/card/define.js';\nimport '@nvidia-elements/core/tooltip/define.js';\nimport '@nvidia-elements/core/page/define.js';\n\nexport default {\n title: 'Elements/Menu',\n component: 'nve-menu',\n};\n\n/**\n * @summary Basic menu with simple text items for the default menu structure and styling.\n */\nexport const Default = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item>item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu with keyboard navigation and ARIA disclosure pattern inside a dropdown. Use when menu items need accessible focus management and arrow key navigation.\n * @tags pattern\n */\nexport const Dropdown = {\n render: () => html`\n <nve-button popovertarget=\"dropdown-menu\">dropdown</nve-button>\n <nve-dropdown id=\"dropdown-menu\">\n <nve-menu>\n <nve-menu-item><nve-icon name=\"person\"></nve-icon> profile</nve-menu-item>\n <nve-menu-item><nve-icon name=\"gear\"></nve-icon> settings</nve-menu-item>\n <nve-menu-item><nve-icon name=\"star\"></nve-icon> favorites</nve-menu-item>\n <nve-divider></nve-divider>\n <nve-menu-item><nve-icon name=\"logout\"></nve-icon> logout</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n `\n};\n\n/**\n * @summary Menu with a selected item showing the visual state for user-selected options.\n */\nexport const Selected = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item selected>item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu with a current page item showing the visual state for the active/current page in navigation.\n */\nexport const Current = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary By default Menu will show a blue border on the selected item. You can change the border color by setting `--border-background` on the `<nve-menu-item>`\n * @tags test-case\n */\nexport const BorderBackground = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\" style=\"--border-background: var(--nve-ref-color-brand-green-900);\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu with disabled items showing unavailable options while maintaining visual context.\n * @tags test-case\n */\nexport const Disabled = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item disabled>item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu items with icons to add visual context and improve usability.\n */\nexport const Icons = {\n render: () => html`\n <nve-menu>\n <nve-menu-item><nve-icon name=\"person\"></nve-icon> profile</nve-menu-item>\n <nve-menu-item><nve-icon name=\"gear\"></nve-icon> settings</nve-menu-item>\n <nve-menu-item><nve-icon name=\"star\"></nve-icon> favorites</nve-menu-item>\n <nve-menu-item><nve-icon name=\"logout\"></nve-icon> logout</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu items with links for navigation functionality within menu structures.\n */\nexport const Links = {\n render: () => html`\n <nve-menu>\n <nve-menu-item><nve-icon name=\"person\"></nve-icon><a href=\"#\">profile</a></nve-menu-item>\n <nve-menu-item><nve-icon name=\"gear\"></nve-icon> <a href=\"#\">settings</a></nve-menu-item>\n <nve-menu-item><nve-icon name=\"star\"></nve-icon> <a href=\"#\">favorites</a></nve-menu-item>\n <nve-menu-item><nve-icon name=\"logout\"></nve-icon> <a href=\"#\">logout</a></nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu item features a default slot for content, along with a suffix slot for displaying elements such as keyboard shortcuts at the end of the menu item container.\n */\nexport const Suffix = {\n render: () => html`\n <nve-menu>\n <nve-menu-item><kbd slot=\"suffix\" nve-text=\"code flat\">CMD + C</kbd></nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu with constrained height showing scrollable behavior when content exceeds container limits.\n * @tags test-case\n */\nexport const Scroll = {\n render: () => html`\n <nve-menu style=\"--max-height: 150px\">\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item>item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n <nve-menu-item>item 5</nve-menu-item>\n <nve-menu-item>item 6</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Use a dropdown menu with search and branded logos for application selection interfaces.\n * @tags pattern\n */\nexport const Complex = {\n render: () => html`\n <nve-button popovertarget=\"dropdown-menu\">dropdown</nve-button>\n <nve-dropdown id=\"dropdown-menu\">\n <nve-search rounded>\n <input type=\"search\" placeholder=\"search tools\" aria-label=\"search apps\" />\n </nve-search>\n <nve-menu>\n <nve-menu-item>\n <nve-logo color=\"pink-rose\" size=\"sm\">Db</nve-logo> Debugger\n </nve-menu-item>\n <nve-menu-item>\n <nve-logo color=\"blue-cobalt\" size=\"sm\">TM</nve-logo> Task Manager\n </nve-menu-item>\n <nve-menu-item>\n <nve-logo color=\"yellow-nova\" size=\"sm\">CI</nve-logo> CI Services\n </nve-menu-item>\n <nve-divider></nve-divider>\n <nve-menu-item>\n <nve-logo size=\"sm\">NV</nve-logo> All Apps\n </nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n `\n};\n\n/**\n * @summary Use a navigation drawer to overlay page content for out-of-context navigation.\n * @tags pattern\n */\nexport const VerticalNavigationDrawer = {\n render: () => html`\n <nve-page>\n <nve-page-header>\n <nve-logo slot=\"prefix\" size=\"sm\">NV</nve-logo>\n <h2 slot=\"prefix\" nve-text=\"heading sm\">NVIDIA</h2>\n </nve-page-header>\n <main nve-layout=\"column gap:md pad:md\">\n <nve-button popovertarget=\"menu-drawer\">toggle drawer</nve-button>\n </main>\n <nve-drawer position=\"right\" size=\"sm\" modal closable id=\"menu-drawer\">\n <nve-drawer-header>\n <h3 nve-text=\"heading\">Drawer</h3>\n </nve-drawer-header>\n <nve-drawer-content>\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n </nve-drawer-content>\n </nve-drawer>\n </nve-page>\n `\n};\n\n/**\n * @summary Use an inline navigation panel to push page content aside when navigation is contextual to the page.\n * @tags pattern\n */\nexport const VerticalNavigationPanel = {\n render: () => html`\n<nve-page>\n <nve-page-header>\n <nve-logo slot=\"prefix\" size=\"sm\">NV</nve-logo>\n <h2 slot=\"prefix\" nve-text=\"heading sm\">NVIDIA</h2>\n </nve-page-header>\n <nve-page-panel slot=\"left\" expanded style=\"max-width:280px\">\n <nve-page-panel-header>\n <h3 nve-text=\"heading\">Drawer</h3>\n </nve-page-panel-header>\n <nve-page-panel-content>\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n </nve-page-panel-content>\n </nve-page-panel>\n <main nve-layout=\"column gap:md pad:md\">\n <p nve-text=\"body\">Content</p>\n </main>\n</nve-page>\n `\n};\n\n/**\n * @summary Use a tooltip on a menu item to provide extra context and warnings.\n * @tags pattern test-case\n */\nexport const ItemTooltip = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item popovertarget=\"menu-tooltip\" id=\"menu-item-2\">\n item 2\n <nve-icon id=\"menu-anchor\" size=\"md\" name=\"exclamation-triangle\" style=\"margin-left: auto\"></nve-icon>\n <nve-tooltip anchor=\"menu-anchor\" id=\"menu-tooltip\" style=\"interest-delay-start: 2s\">This is a warning tooltip</nve-tooltip>\n </nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n </nve-menu>\n `\n}\n\n/**\n * @summary Menu items with danger status styling for destructive actions like delete or logout operations.\n */\nexport const DangerStatus = {\n render: () => html`\n <nve-menu>\n <nve-menu-item status=\"danger\">default</nve-menu-item>\n <nve-menu-item status=\"danger\" disabled>disabled</nve-menu-item>\n <nve-menu-item status=\"danger\" selected>selected</nve-menu-item>\n <nve-menu-item status=\"danger\" current=\"page\">current</nve-menu-item>\n <nve-menu-item status=\"danger\"><nve-icon name=\"gear\"></nve-icon> icon left</nve-menu-item>\n <nve-menu-item status=\"danger\">icon right <nve-icon id=\"warning-icon\" size=\"md\" name=\"exclamation-triangle\" style=\"margin-left: auto\"></nve-icon></nve-menu-item>\n </nve-menu>\n `\n}\n"],"mappings":";AAGA,IAAA,IAAS"}
|
|
1
|
+
{"version":3,"file":"menu.examples.js","names":[],"sources":["../../src/menu/menu.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html } from 'lit';\nimport '@nvidia-elements/core/button/define.js';\nimport '@nvidia-elements/core/dropdown/define.js';\nimport '@nvidia-elements/core/icon/define.js';\nimport '@nvidia-elements/core/menu/define.js';\nimport '@nvidia-elements/core/logo/define.js';\nimport '@nvidia-elements/core/search/define.js';\nimport '@nvidia-elements/core/drawer/define.js';\nimport '@nvidia-elements/core/card/define.js';\nimport '@nvidia-elements/core/tooltip/define.js';\nimport '@nvidia-elements/core/page/define.js';\n\nexport default {\n title: 'Elements/Menu',\n component: 'nve-menu',\n};\n\n/**\n * @summary Basic menu with simple text items for the default menu structure and styling.\n */\nexport const Default = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item>item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu with keyboard navigation and ARIA disclosure pattern inside a dropdown. Use when menu items need accessible focus management and arrow key navigation.\n * @tags pattern\n */\nexport const Dropdown = {\n render: () => html`\n <nve-button popovertarget=\"dropdown-menu\">dropdown</nve-button>\n <nve-dropdown id=\"dropdown-menu\">\n <nve-menu>\n <nve-menu-item><nve-icon name=\"person\"></nve-icon> profile</nve-menu-item>\n <nve-menu-item><nve-icon name=\"gear\"></nve-icon> settings</nve-menu-item>\n <nve-menu-item><nve-icon name=\"star\"></nve-icon> favorites</nve-menu-item>\n <nve-divider></nve-divider>\n <nve-menu-item><nve-icon name=\"logout\"></nve-icon> logout</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n `\n};\n\n/**\n * @summary Menu with a selected item showing the visual state for user-selected options.\n */\nexport const Selected = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item selected>item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu with a current page item showing the visual state for the active/current page in navigation.\n */\nexport const Current = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary By default Menu will show a blue border on the selected item. You can change the border color by setting `--border-background` on the `<nve-menu-item>`\n * @tags test-case\n */\nexport const BorderBackground = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\" style=\"--border-background: var(--nve-ref-color-brand-green-900);\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu with disabled items showing unavailable options while maintaining visual context.\n * @tags test-case\n */\nexport const Disabled = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item disabled>item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu items with icons to add visual context and improve usability.\n */\nexport const Icons = {\n render: () => html`\n <nve-menu>\n <nve-menu-item><nve-icon name=\"person\"></nve-icon> profile</nve-menu-item>\n <nve-menu-item><nve-icon name=\"gear\"></nve-icon> settings</nve-menu-item>\n <nve-menu-item><nve-icon name=\"star\"></nve-icon> favorites</nve-menu-item>\n <nve-menu-item><nve-icon name=\"logout\"></nve-icon> logout</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu items with links for navigation functionality within menu structures.\n */\nexport const Links = {\n render: () => html`\n <nve-menu>\n <nve-menu-item><nve-icon name=\"person\"></nve-icon><a href=\"#\">profile</a></nve-menu-item>\n <nve-menu-item><nve-icon name=\"gear\"></nve-icon> <a href=\"#\">settings</a></nve-menu-item>\n <nve-menu-item><nve-icon name=\"star\"></nve-icon> <a href=\"#\">favorites</a></nve-menu-item>\n <nve-menu-item><nve-icon name=\"logout\"></nve-icon> <a href=\"#\">logout</a></nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu item features a default slot for content, along with a suffix slot for displaying elements such as keyboard shortcuts at the end of the menu item container.\n */\nexport const Suffix = {\n render: () => html`\n <nve-menu>\n <nve-menu-item><kbd slot=\"suffix\" nve-text=\"code flat\">CMD + C</kbd></nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Menu with constrained height showing scrollable behavior when content exceeds container limits.\n * @tags test-case\n */\nexport const Scroll = {\n render: () => html`\n <nve-menu style=\"--max-height: 150px\">\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item>item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n <nve-menu-item>item 5</nve-menu-item>\n <nve-menu-item>item 6</nve-menu-item>\n </nve-menu>\n `\n};\n\n/**\n * @summary Use a dropdown menu with search and branded logos for application selection interfaces.\n * @tags pattern\n */\nexport const Complex = {\n render: () => html`\n <nve-button popovertarget=\"dropdown-menu\">dropdown</nve-button>\n <nve-dropdown id=\"dropdown-menu\">\n <nve-search rounded>\n <input type=\"search\" placeholder=\"search tools\" aria-label=\"search apps\" />\n </nve-search>\n <nve-menu>\n <nve-menu-item>\n <nve-logo color=\"pink-rose\" size=\"sm\">Db</nve-logo> Debugger\n </nve-menu-item>\n <nve-menu-item>\n <nve-logo color=\"blue-cobalt\" size=\"sm\">TM</nve-logo> Task Manager\n </nve-menu-item>\n <nve-menu-item>\n <nve-logo color=\"yellow-nova\" size=\"sm\">CI</nve-logo> CI Services\n </nve-menu-item>\n <nve-divider></nve-divider>\n <nve-menu-item>\n <nve-logo size=\"sm\">NV</nve-logo> All Apps\n </nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n `\n};\n\n/**\n * @summary Use a navigation drawer to overlay page content for out-of-context navigation.\n * @tags pattern\n */\nexport const VerticalNavigationDrawer = {\n render: () => html`\n <nve-page>\n <nve-page-header slot=\"header\">\n <nve-logo slot=\"prefix\" size=\"sm\">NV</nve-logo>\n <h2 slot=\"prefix\" nve-text=\"heading sm\">NVIDIA</h2>\n </nve-page-header>\n <main nve-layout=\"column gap:md pad:md\">\n <nve-button popovertarget=\"menu-drawer\">toggle drawer</nve-button>\n </main>\n <nve-drawer position=\"right\" size=\"sm\" modal closable id=\"menu-drawer\">\n <nve-drawer-header>\n <h3 nve-text=\"heading\">Drawer</h3>\n </nve-drawer-header>\n <nve-drawer-content>\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n </nve-drawer-content>\n </nve-drawer>\n </nve-page>\n `\n};\n\n/**\n * @summary Use an inline navigation panel to push page content aside when navigation is contextual to the page.\n * @tags pattern\n */\nexport const VerticalNavigationPanel = {\n render: () => html`\n<nve-page>\n <nve-page-header slot=\"header\">\n <nve-logo slot=\"prefix\" size=\"sm\">NV</nve-logo>\n <h2 slot=\"prefix\" nve-text=\"heading sm\">NVIDIA</h2>\n </nve-page-header>\n <nve-page-panel slot=\"left\" expanded style=\"max-width:280px\">\n <nve-page-panel-header>\n <h3 nve-text=\"heading\">Drawer</h3>\n </nve-page-panel-header>\n <nve-page-panel-content>\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n </nve-page-panel-content>\n </nve-page-panel>\n <main nve-layout=\"column gap:md pad:md\">\n <p nve-text=\"body\">Content</p>\n </main>\n</nve-page>\n `\n};\n\n/**\n * @summary Use a tooltip on a menu item to provide extra context and warnings.\n * @tags pattern test-case\n */\nexport const ItemTooltip = {\n render: () => html`\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item popovertarget=\"menu-tooltip\" id=\"menu-item-2\">\n item 2\n <nve-icon id=\"menu-anchor\" size=\"md\" name=\"exclamation-triangle\" style=\"margin-left: auto\"></nve-icon>\n <nve-tooltip anchor=\"menu-anchor\" id=\"menu-tooltip\" style=\"interest-delay-start: 2s\">This is a warning tooltip</nve-tooltip>\n </nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n </nve-menu>\n `\n}\n\n/**\n * @summary Menu items with danger status styling for destructive actions like delete or logout operations.\n */\nexport const DangerStatus = {\n render: () => html`\n <nve-menu>\n <nve-menu-item status=\"danger\">default</nve-menu-item>\n <nve-menu-item status=\"danger\" disabled>disabled</nve-menu-item>\n <nve-menu-item status=\"danger\" selected>selected</nve-menu-item>\n <nve-menu-item status=\"danger\" current=\"page\">current</nve-menu-item>\n <nve-menu-item status=\"danger\"><nve-icon name=\"gear\"></nve-icon> icon left</nve-menu-item>\n <nve-menu-item status=\"danger\">icon right <nve-icon id=\"warning-icon\" size=\"md\" name=\"exclamation-triangle\" style=\"margin-left: auto\"></nve-icon></nve-menu-item>\n </nve-menu>\n `\n}\n"],"mappings":";AAGA,IAAA,IAAS"}
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
{
|
|
115
115
|
"id": "menu-vertical-navigation-drawer",
|
|
116
116
|
"name": "VerticalNavigationDrawer",
|
|
117
|
-
"template": "<nve-page>\n <nve-page-header>\n <nve-logo slot=\"prefix\" size=\"sm\">NV</nve-logo>\n <h2 slot=\"prefix\" nve-text=\"heading sm\">NVIDIA</h2>\n </nve-page-header>\n <main nve-layout=\"column gap:md pad:md\">\n <nve-button popovertarget=\"menu-drawer\">toggle drawer</nve-button>\n </main>\n <nve-drawer position=\"right\" size=\"sm\" modal closable id=\"menu-drawer\">\n <nve-drawer-header>\n <h3 nve-text=\"heading\">Drawer</h3>\n </nve-drawer-header>\n <nve-drawer-content>\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n </nve-drawer-content>\n </nve-drawer>\n</nve-page>\n",
|
|
117
|
+
"template": "<nve-page>\n <nve-page-header slot=\"header\">\n <nve-logo slot=\"prefix\" size=\"sm\">NV</nve-logo>\n <h2 slot=\"prefix\" nve-text=\"heading sm\">NVIDIA</h2>\n </nve-page-header>\n <main nve-layout=\"column gap:md pad:md\">\n <nve-button popovertarget=\"menu-drawer\">toggle drawer</nve-button>\n </main>\n <nve-drawer position=\"right\" size=\"sm\" modal closable id=\"menu-drawer\">\n <nve-drawer-header>\n <h3 nve-text=\"heading\">Drawer</h3>\n </nve-drawer-header>\n <nve-drawer-content>\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n </nve-drawer-content>\n </nve-drawer>\n</nve-page>\n",
|
|
118
118
|
"summary": "Use a navigation drawer to overlay page content for out-of-context navigation.",
|
|
119
119
|
"description": "",
|
|
120
120
|
"composition": true,
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
{
|
|
126
126
|
"id": "menu-vertical-navigation-panel",
|
|
127
127
|
"name": "VerticalNavigationPanel",
|
|
128
|
-
"template": "<nve-page>\n <nve-page-header>\n <nve-logo slot=\"prefix\" size=\"sm\">NV</nve-logo>\n <h2 slot=\"prefix\" nve-text=\"heading sm\">NVIDIA</h2>\n </nve-page-header>\n <nve-page-panel slot=\"left\" expanded style=\"max-width: 280px\">\n <nve-page-panel-header>\n <h3 nve-text=\"heading\">Drawer</h3>\n </nve-page-panel-header>\n <nve-page-panel-content>\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n </nve-page-panel-content>\n </nve-page-panel>\n <main nve-layout=\"column gap:md pad:md\">\n <p nve-text=\"body\">Content</p>\n </main>\n</nve-page>\n",
|
|
128
|
+
"template": "<nve-page>\n <nve-page-header slot=\"header\">\n <nve-logo slot=\"prefix\" size=\"sm\">NV</nve-logo>\n <h2 slot=\"prefix\" nve-text=\"heading sm\">NVIDIA</h2>\n </nve-page-header>\n <nve-page-panel slot=\"left\" expanded style=\"max-width: 280px\">\n <nve-page-panel-header>\n <h3 nve-text=\"heading\">Drawer</h3>\n </nve-page-panel-header>\n <nve-page-panel-content>\n <nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item current=\"page\">item 2</nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n <nve-menu-item>item 4</nve-menu-item>\n </nve-menu>\n </nve-page-panel-content>\n </nve-page-panel>\n <main nve-layout=\"column gap:md pad:md\">\n <p nve-text=\"body\">Content</p>\n </main>\n</nve-page>\n",
|
|
129
129
|
"summary": "Use an inline navigation panel to push page content aside when navigation is contextual to the page.",
|
|
130
130
|
"description": "",
|
|
131
131
|
"composition": true,
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
{
|
|
137
137
|
"id": "menu-item-tooltip",
|
|
138
138
|
"name": "ItemTooltip",
|
|
139
|
-
"template": "<nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item popovertarget=\"menu-tooltip\" id=\"menu-item-2\">\n item 2\n <nve-icon id=\"menu-anchor\" size=\"md\" name=\"exclamation-triangle\" style=\"margin-left: auto\"></nve-icon>\n <nve-tooltip anchor=\"menu-anchor\" id=\"menu-tooltip\" style=\"interest-delay-start: 2s\"
|
|
139
|
+
"template": "<nve-menu>\n <nve-menu-item>item 1</nve-menu-item>\n <nve-menu-item popovertarget=\"menu-tooltip\" id=\"menu-item-2\">\n item 2\n <nve-icon id=\"menu-anchor\" size=\"md\" name=\"exclamation-triangle\" style=\"margin-left: auto\"></nve-icon>\n <nve-tooltip anchor=\"menu-anchor\" id=\"menu-tooltip\" style=\"interest-delay-start: 2s\">This is a warning tooltip</nve-tooltip>\n </nve-menu-item>\n <nve-menu-item>item 3</nve-menu-item>\n</nve-menu>\n",
|
|
140
140
|
"summary": "Use a tooltip on a menu item to provide extra context and warnings.",
|
|
141
141
|
"description": "",
|
|
142
142
|
"composition": true,
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
{
|
|
149
149
|
"id": "menu-danger-status",
|
|
150
150
|
"name": "DangerStatus",
|
|
151
|
-
"template": "<nve-menu>\n <nve-menu-item status=\"danger\">default</nve-menu-item>\n <nve-menu-item status=\"danger\" disabled>disabled</nve-menu-item>\n <nve-menu-item status=\"danger\" selected>selected</nve-menu-item>\n <nve-menu-item status=\"danger\" current=\"page\">current</nve-menu-item>\n <nve-menu-item status=\"danger\"><nve-icon name=\"gear\"></nve-icon> icon left</nve-menu-item>\n <nve-menu-item status=\"danger\"
|
|
151
|
+
"template": "<nve-menu>\n <nve-menu-item status=\"danger\">default</nve-menu-item>\n <nve-menu-item status=\"danger\" disabled>disabled</nve-menu-item>\n <nve-menu-item status=\"danger\" selected>selected</nve-menu-item>\n <nve-menu-item status=\"danger\" current=\"page\">current</nve-menu-item>\n <nve-menu-item status=\"danger\"><nve-icon name=\"gear\"></nve-icon> icon left</nve-menu-item>\n <nve-menu-item status=\"danger\">icon right <nve-icon id=\"warning-icon\" size=\"md\" name=\"exclamation-triangle\" style=\"margin-left: auto\"></nve-icon></nve-menu-item>\n</nve-menu>\n",
|
|
152
152
|
"summary": "Menu items with danger status styling for destructive actions like delete or logout operations.",
|
|
153
153
|
"description": "",
|
|
154
154
|
"composition": false,
|
package/dist/menu/menu2.js
CHANGED
package/dist/month/month2.js
CHANGED
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
{
|
|
46
46
|
"id": "notification-content-wrap",
|
|
47
47
|
"name": "ContentWrap",
|
|
48
|
-
"template": "<nve-notification position=\"center\">\n <h3 nve-text=\"label\">Notification</h3>\n <p nve-text=\"body\" style=\"width: 230px\"
|
|
48
|
+
"template": "<nve-notification position=\"center\">\n <h3 nve-text=\"label\">Notification</h3>\n <p nve-text=\"body\" style=\"width: 230px\">some text content in a notification with some really long text in it that just keeps going...</p>\n</nve-notification>\n",
|
|
49
49
|
"summary": "Notification with text wrapping for longer content. Use when notification messages exceed single-line length, but keep content concise for better readability and user comprehension.",
|
|
50
50
|
"description": "",
|
|
51
51
|
"composition": false,
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
{
|
|
68
68
|
"id": "notification-interactive-group",
|
|
69
69
|
"name": "InteractiveGroup",
|
|
70
|
-
"template": "<nve-notification-group position=\"bottom\" alignment=\"end\" id=\"group\"></nve-notification-group>\n<nve-button>generate</nve-button>\n<script type=\"module\">\n const button = document.querySelector(\"nve-button\");\n button.addEventListener(\"click\", () => {\n const notification = document.createElement(\"nve-notification\");\n notification.closable = true;\n notification.status = [\"warning\", \"danger\", \"success\", \"accent\", undefined][Math.floor(Math.random() * 5)];\n notification.innerHTML
|
|
70
|
+
"template": "<nve-notification-group position=\"bottom\" alignment=\"end\" id=\"group\"></nve-notification-group>\n<nve-button>generate</nve-button>\n<script type=\"module\">\n const button = document.querySelector(\"nve-button\");\n button.addEventListener(\"click\", () => {\n const notification = document.createElement(\"nve-notification\");\n notification.closable = true;\n notification.status = [\"warning\", \"danger\", \"success\", \"accent\", undefined][Math.floor(Math.random() * 5)];\n notification.innerHTML = '<h3 nve-text=\"label\">' + (notification.status ?? \"default\") + '</h3><p nve-text=\"body\">some text content in a notification</p>';\n notification.closeTimeout = 1000 * (document.querySelectorAll(\"nve-notification\").length + 1);\n notification.addEventListener(\"close\", () => notification.remove(), { once: true });\n notification.position = \"bottom\";\n notification.alignment = \"end\";\n document.querySelector(\"nve-notification-group\").prepend(notification);\n });\n</script>\n",
|
|
71
71
|
"summary": "Dynamic notification group with programmatic creation and stacking. Perfect for toast-style notifications generated by user actions or system events, with progressive timeout and automatic removal patterns for managing many notifications.",
|
|
72
72
|
"description": "",
|
|
73
73
|
"composition": false,
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
{
|
|
141
141
|
"id": "notification-layers",
|
|
142
142
|
"name": "Layers",
|
|
143
|
-
"template": "<nve-button>Notification</nve-button>\n<nve-button popovertarget=\"dialog\">Dialog</nve-button>\n<nve-notification-group position=\"bottom\" alignment=\"end\" id=\"group\"></nve-notification-group>\n<nve-dialog id=\"dialog\" modal closable>\n <nve-dialog-header>\n <h3 nve-text=\"heading semibold\">Notification</h3>\n </nve-dialog-header>\n <p nve-text=\"body\">This should not cause the dialog to close</p>\n</nve-dialog>\n<script type=\"module\">\n const button = document.querySelector(\"nve-button\");\n button.addEventListener(\"click\", () => {\n const notification = document.createElement(\"nve-notification\");\n notification.closable = true;\n notification.status = [\"warning\", \"danger\", \"success\", \"accent\", undefined][Math.floor(Math.random() * 5)];\n notification.innerHTML
|
|
143
|
+
"template": "<nve-button>Notification</nve-button>\n<nve-button popovertarget=\"dialog\">Dialog</nve-button>\n<nve-notification-group position=\"bottom\" alignment=\"end\" id=\"group\"></nve-notification-group>\n<nve-dialog id=\"dialog\" modal closable>\n <nve-dialog-header>\n <h3 nve-text=\"heading semibold\">Notification</h3>\n </nve-dialog-header>\n <p nve-text=\"body\">This should not cause the dialog to close</p>\n</nve-dialog>\n<script type=\"module\">\n const button = document.querySelector(\"nve-button\");\n button.addEventListener(\"click\", () => {\n const notification = document.createElement(\"nve-notification\");\n notification.closable = true;\n notification.status = [\"warning\", \"danger\", \"success\", \"accent\", undefined][Math.floor(Math.random() * 5)];\n notification.innerHTML = '<h3 nve-text=\"label\">' + (notification.status ?? \"default\") + '</h3><p nve-text=\"body\">some text content in a notification</p>';\n notification.closeTimeout = 3000 * (document.querySelectorAll(\"nve-notification\").length + 1);\n notification.addEventListener(\"close\", () => notification.remove(), { once: true });\n notification.position = \"bottom\";\n notification.alignment = \"end\";\n document.querySelector(\"nve-notification-group\").prepend(notification);\n });\n</script>\n",
|
|
144
144
|
"summary": "Notification layering with modal dialogs for proper stacking context. Ensures notifications appear above dialogs without interfering with modal interactions, crucial for complex UI layering scenarios.",
|
|
145
145
|
"description": "",
|
|
146
146
|
"composition": true,
|