@backstage/ui 0.15.0-next.0 → 0.15.0-next.2

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.
Files changed (58) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/dist/components/Accordion/Accordion.module.css.esm.js +2 -2
  3. package/dist/components/Box/Box.module.css.esm.js +2 -2
  4. package/dist/components/Card/Card.module.css.esm.js +2 -2
  5. package/dist/components/Checkbox/Checkbox.module.css.esm.js +2 -2
  6. package/dist/components/Combobox/Combobox.esm.js +72 -0
  7. package/dist/components/Combobox/Combobox.esm.js.map +1 -0
  8. package/dist/components/Combobox/Combobox.module.css.esm.js +8 -0
  9. package/dist/components/Combobox/Combobox.module.css.esm.js.map +1 -0
  10. package/dist/components/Combobox/ComboboxInput.esm.js +21 -0
  11. package/dist/components/Combobox/ComboboxInput.esm.js.map +1 -0
  12. package/dist/components/Combobox/ComboboxListBox.esm.js +46 -0
  13. package/dist/components/Combobox/ComboboxListBox.esm.js.map +1 -0
  14. package/dist/components/Combobox/definition.esm.js +74 -0
  15. package/dist/components/Combobox/definition.esm.js.map +1 -0
  16. package/dist/components/Container/Container.module.css.esm.js +2 -2
  17. package/dist/components/Flex/Flex.module.css.esm.js +2 -2
  18. package/dist/components/Grid/Grid.module.css.esm.js +2 -2
  19. package/dist/components/Header/Header.esm.js +187 -28
  20. package/dist/components/Header/Header.esm.js.map +1 -1
  21. package/dist/components/Header/Header.module.css.esm.js +2 -2
  22. package/dist/components/Header/HeaderMetadataStatus.esm.js +32 -0
  23. package/dist/components/Header/HeaderMetadataStatus.esm.js.map +1 -0
  24. package/dist/components/Header/HeaderMetadataStatus.module.css.esm.js +8 -0
  25. package/dist/components/Header/HeaderMetadataStatus.module.css.esm.js.map +1 -0
  26. package/dist/components/Header/HeaderMetadataUsers.esm.js +92 -0
  27. package/dist/components/Header/HeaderMetadataUsers.esm.js.map +1 -0
  28. package/dist/components/Header/HeaderMetadataUsers.module.css.esm.js +8 -0
  29. package/dist/components/Header/HeaderMetadataUsers.module.css.esm.js.map +1 -0
  30. package/dist/components/Header/definition.esm.js +22 -3
  31. package/dist/components/Header/definition.esm.js.map +1 -1
  32. package/dist/components/Link/Link.esm.js +7 -2
  33. package/dist/components/Link/Link.esm.js.map +1 -1
  34. package/dist/components/Link/Link.module.css.esm.js +2 -2
  35. package/dist/components/PluginHeader/PluginHeader.esm.js +8 -17
  36. package/dist/components/PluginHeader/PluginHeader.esm.js.map +1 -1
  37. package/dist/components/PluginHeader/PluginHeader.module.css.esm.js +2 -2
  38. package/dist/components/Select/Select.module.css.esm.js +2 -2
  39. package/dist/components/Select/SelectContent.esm.js.map +1 -1
  40. package/dist/components/Select/SelectListBox.esm.js +26 -12
  41. package/dist/components/Select/SelectListBox.esm.js.map +1 -1
  42. package/dist/components/Select/definition.esm.js +20 -4
  43. package/dist/components/Select/definition.esm.js.map +1 -1
  44. package/dist/components/Table/hooks/useCompletePagination.esm.js +28 -11
  45. package/dist/components/Table/hooks/useCompletePagination.esm.js.map +1 -1
  46. package/dist/components/Table/hooks/useDebouncedValue.esm.js +16 -0
  47. package/dist/components/Table/hooks/useDebouncedValue.esm.js.map +1 -0
  48. package/dist/css/styles.css +34 -0
  49. package/dist/hooks/useDefinition/useDefinition.esm.js +8 -6
  50. package/dist/hooks/useDefinition/useDefinition.esm.js.map +1 -1
  51. package/dist/hooks/useResolvedHref.esm.js +17 -0
  52. package/dist/hooks/useResolvedHref.esm.js.map +1 -0
  53. package/dist/index.d.ts +313 -52
  54. package/dist/index.esm.js +4 -0
  55. package/dist/index.esm.js.map +1 -1
  56. package/dist/provider/BUIProvider.esm.js +3 -2
  57. package/dist/provider/BUIProvider.esm.js.map +1 -1
  58. package/package.json +8 -3
@@ -1 +1 @@
1
- {"version":3,"file":"useDefinition.esm.js","sources":["../../../src/hooks/useDefinition/useDefinition.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { useBreakpoint } from '../useBreakpoint';\nimport { useBgProvider, useBgConsumer, BgProvider } from '../useBg';\nimport { resolveDefinitionProps, processUtilityProps } from './helpers';\nimport { useAnalytics } from '../../analytics/useAnalytics';\nimport { noopTracker } from '../../analytics/useAnalytics';\nimport { useInRouterContext, useHref } from 'react-router-dom';\nimport type {\n ComponentConfig,\n UseDefinitionOptions,\n UseDefinitionResult,\n UtilityKeys,\n} from './types';\n\nexport function useDefinition<\n D extends ComponentConfig<any, any>,\n P extends Record<string, any>,\n>(\n definition: D,\n props: P,\n options?: UseDefinitionOptions<D>,\n): UseDefinitionResult<D, P> {\n const { breakpoint } = useBreakpoint();\n\n // Turn relative href into an absolute path using the current route\n // context, so that client-side navigation works correctly.\n let hrefResolvedProps = props;\n const hasRouter = useInRouterContext();\n // useHref throws outside a Router, so we guard with useInRouterContext.\n // The guard is safe because a component's router context does not\n // change during its lifetime, keeping the hook call count stable.\n if (hasRouter) {\n const absoluteHref = useHref((props as any).href ?? '');\n if ((props as any).href !== undefined) {\n hrefResolvedProps = { ...props, href: absoluteHref } as P;\n }\n }\n\n // Resolve all props centrally — applies responsive values and defaults\n const { ownPropsResolved, restProps } = resolveDefinitionProps(\n definition,\n hrefResolvedProps,\n breakpoint,\n );\n\n const dataAttributes: Record<string, string | undefined> = {};\n\n for (const [key, config] of Object.entries(definition.propDefs)) {\n const finalValue = ownPropsResolved[key];\n\n if (finalValue !== undefined) {\n // Skip data-bg for bg prop when the provider path handles it\n if (key === 'bg' && definition.bg === 'provider') continue;\n\n if ((config as any).dataAttribute) {\n // eslint-disable-next-line no-restricted-syntax\n dataAttributes[`data-${key.toLowerCase()}`] = String(finalValue);\n }\n }\n }\n\n // Provider: resolve bg and provide context for children\n const providerBg = useBgProvider(\n definition.bg === 'provider' ? ownPropsResolved.bg : undefined,\n );\n\n // Consumer: read parent context bg\n const consumerBg = useBgConsumer();\n\n // Provider: set data-bg from the resolved provider bg\n if (definition.bg === 'provider' && providerBg.bg !== undefined) {\n dataAttributes['data-bg'] = String(providerBg.bg);\n }\n\n // Consumer: set data-on-bg from the parent context\n if (definition.bg === 'consumer' && consumerBg.bg !== undefined) {\n dataAttributes['data-on-bg'] = String(consumerBg.bg);\n }\n\n const { utilityClasses, utilityStyle } = processUtilityProps<UtilityKeys<D>>(\n props,\n (definition.utilityProps ?? []) as readonly UtilityKeys<D>[],\n );\n\n // Analytics: conditionally call useAnalytics based on definition flag\n let analytics = noopTracker;\n if (definition.analytics) {\n const tracker = useAnalytics();\n analytics = ownPropsResolved.noTrack ? noopTracker : tracker;\n }\n\n const utilityTarget = options?.utilityTarget ?? 'root';\n const classNameTarget = options?.classNameTarget ?? 'root';\n\n const classes: Record<string, string> = {};\n\n for (const [name, cssKey] of Object.entries(definition.classNames)) {\n classes[name] = clsx(\n cssKey as string,\n definition.styles[cssKey as keyof typeof definition.styles],\n utilityTarget === name && utilityClasses,\n classNameTarget === name && ownPropsResolved.className,\n );\n }\n\n let children: ReactNode | undefined;\n let childrenWithBgProvider: ReactNode | undefined;\n\n if (definition.bg === 'provider') {\n childrenWithBgProvider = providerBg.bg ? (\n <BgProvider bg={providerBg.bg}>{props.children}</BgProvider>\n ) : (\n props.children\n );\n } else {\n children = props.children;\n }\n\n return {\n ownProps: {\n classes,\n ...ownPropsResolved,\n ...(definition.bg === 'provider'\n ? { childrenWithBgProvider }\n : { children }),\n },\n restProps,\n dataAttributes,\n utilityStyle,\n ...(definition.analytics ? { analytics } : {}),\n } as unknown as UseDefinitionResult<D, P>;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDefinition.esm.js","sources":["../../../src/hooks/useDefinition/useDefinition.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { useBreakpoint } from '../useBreakpoint';\nimport { useBgProvider, useBgConsumer, BgProvider } from '../useBg';\nimport { resolveDefinitionProps, processUtilityProps } from './helpers';\nimport { useAnalytics } from '../../analytics/useAnalytics';\nimport { noopTracker } from '../../analytics/useAnalytics';\nimport {\n useResolvedPath,\n useInRouterContext,\n createPath,\n} from 'react-router-dom';\nimport { isExternalLink } from '../../utils/linkUtils';\nimport type {\n ComponentConfig,\n UseDefinitionOptions,\n UseDefinitionResult,\n UtilityKeys,\n} from './types';\n\nexport function useDefinition<\n D extends ComponentConfig<any, any>,\n P extends Record<string, any>,\n>(\n definition: D,\n props: P,\n options?: UseDefinitionOptions<D>,\n): UseDefinitionResult<D, P> {\n const { breakpoint } = useBreakpoint();\n\n let hrefResolvedProps = props;\n const hasRouter = useInRouterContext();\n if (hasRouter) {\n const rawHref = (props as any).href;\n const resolved = useResolvedPath(rawHref ?? '');\n if (rawHref !== undefined && !isExternalLink(rawHref)) {\n hrefResolvedProps = { ...props, href: createPath(resolved) } as P;\n }\n }\n\n // Resolve all props centrally — applies responsive values and defaults\n const { ownPropsResolved, restProps } = resolveDefinitionProps(\n definition,\n hrefResolvedProps,\n breakpoint,\n );\n\n const dataAttributes: Record<string, string | undefined> = {};\n\n for (const [key, config] of Object.entries(definition.propDefs)) {\n const finalValue = ownPropsResolved[key];\n\n if (finalValue !== undefined) {\n // Skip data-bg for bg prop when the provider path handles it\n if (key === 'bg' && definition.bg === 'provider') continue;\n\n if ((config as any).dataAttribute) {\n // eslint-disable-next-line no-restricted-syntax\n dataAttributes[`data-${key.toLowerCase()}`] = String(finalValue);\n }\n }\n }\n\n // Provider: resolve bg and provide context for children\n const providerBg = useBgProvider(\n definition.bg === 'provider' ? ownPropsResolved.bg : undefined,\n );\n\n // Consumer: read parent context bg\n const consumerBg = useBgConsumer();\n\n // Provider: set data-bg from the resolved provider bg\n if (definition.bg === 'provider' && providerBg.bg !== undefined) {\n dataAttributes['data-bg'] = String(providerBg.bg);\n }\n\n // Consumer: set data-on-bg from the parent context\n if (definition.bg === 'consumer' && consumerBg.bg !== undefined) {\n dataAttributes['data-on-bg'] = String(consumerBg.bg);\n }\n\n const { utilityClasses, utilityStyle } = processUtilityProps<UtilityKeys<D>>(\n props,\n (definition.utilityProps ?? []) as readonly UtilityKeys<D>[],\n );\n\n // Analytics: conditionally call useAnalytics based on definition flag\n let analytics = noopTracker;\n if (definition.analytics) {\n const tracker = useAnalytics();\n analytics = ownPropsResolved.noTrack ? noopTracker : tracker;\n }\n\n const utilityTarget =\n options?.utilityTarget !== undefined ? options.utilityTarget : 'root';\n const classNameTarget =\n options?.classNameTarget !== undefined ? options.classNameTarget : 'root';\n\n const classes: Record<string, string> = {};\n\n for (const [name, cssKey] of Object.entries(definition.classNames)) {\n classes[name] = clsx(\n cssKey as string,\n definition.styles[cssKey as keyof typeof definition.styles],\n utilityTarget === name && utilityClasses,\n classNameTarget === name && ownPropsResolved.className,\n );\n }\n\n let children: ReactNode | undefined;\n let childrenWithBgProvider: ReactNode | undefined;\n\n if (definition.bg === 'provider') {\n childrenWithBgProvider = providerBg.bg ? (\n <BgProvider bg={providerBg.bg}>{props.children}</BgProvider>\n ) : (\n props.children\n );\n } else {\n children = props.children;\n }\n\n return {\n ownProps: {\n classes,\n ...ownPropsResolved,\n ...(definition.bg === 'provider'\n ? { childrenWithBgProvider }\n : { children }),\n },\n restProps,\n dataAttributes,\n utilityStyle,\n ...(definition.analytics ? { analytics } : {}),\n } as unknown as UseDefinitionResult<D, P>;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { useInRouterContext, useHref } from 'react-router-dom';
2
+ import { isExternalLink } from '../utils/linkUtils.esm.js';
3
+
4
+ function useResolvedHref(href) {
5
+ const hasRouter = useInRouterContext();
6
+ if (!hasRouter) {
7
+ return href;
8
+ }
9
+ const resolved = useHref(href ?? "");
10
+ if (!href || isExternalLink(href)) {
11
+ return href;
12
+ }
13
+ return resolved;
14
+ }
15
+
16
+ export { useResolvedHref };
17
+ //# sourceMappingURL=useResolvedHref.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResolvedHref.esm.js","sources":["../../src/hooks/useResolvedHref.ts"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useHref, useInRouterContext } from 'react-router-dom';\nimport { isExternalLink } from '../utils/linkUtils';\n\n/**\n * Resolves an href for rendering. External URLs are returned unchanged;\n * internal paths are resolved through react-router's useHref so they\n * respect the current basename and route context.\n *\n * @internal\n */\nexport function useResolvedHref(href: string): string;\nexport function useResolvedHref(href: string | undefined): string | undefined;\nexport function useResolvedHref(href: string | undefined): string | undefined {\n const hasRouter = useInRouterContext();\n // useHref throws outside a Router, so we guard with useInRouterContext.\n // The guard is safe because a component's router context does not\n // change during its lifetime, keeping the hook call count stable.\n if (!hasRouter) {\n return href;\n }\n const resolved = useHref(href ?? '');\n if (!href || isExternalLink(href)) {\n return href;\n }\n return resolved;\n}\n"],"names":[],"mappings":";;;AA4BO,SAAS,gBAAgB,IAAA,EAA8C;AAC5E,EAAA,MAAM,YAAY,kBAAA,EAAmB;AAIrC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA;AACnC,EAAA,IAAI,CAAC,IAAA,IAAQ,cAAA,CAAe,IAAI,CAAA,EAAG;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA;AACT;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { CSSProperties, ReactNode, HTMLAttributes, ComponentPropsWithoutRef, ReactElement, ElementType, ComponentPropsWithRef, ComponentProps } from 'react';
3
- import { DisclosureProps, DisclosureGroupProps, DisclosurePanelProps, HeadingProps, ButtonProps as ButtonProps$1, DateRangePickerProps as DateRangePickerProps$1, ModalOverlayProps, DialogTriggerProps as DialogTriggerProps$1, TabProps as TabProps$1, TabListProps as TabListProps$1, TabPanelProps as TabPanelProps$1, TabsProps as TabsProps$1, LinkProps as LinkProps$1, CheckboxProps as CheckboxProps$1, CheckboxGroupProps as CheckboxGroupProps$1, RadioProps as RadioProps$1, RadioGroupProps as RadioGroupProps$1, SliderProps as SliderProps$1, CellProps as CellProps$1, ColumnProps as ColumnProps$1, RowProps as RowProps$1, TableProps as TableProps$1, TableBodyProps as TableBodyProps$1, TableHeaderProps as TableHeaderProps$1, TagProps as TagProps$1, TagListProps, TagGroupProps as TagGroupProps$1, TextFieldProps as TextFieldProps$1, TooltipProps as TooltipProps$1, TooltipTriggerComponentProps, PopoverProps as PopoverProps$1, MenuProps as MenuProps$1, ListBoxProps, MenuItemProps as MenuItemProps$1, ListBoxItemProps, MenuSectionProps as MenuSectionProps$1, SeparatorProps, MenuTriggerProps as MenuTriggerProps$1, SubmenuTriggerProps as SubmenuTriggerProps$1, SearchFieldProps as SearchFieldProps$1, GridListProps, GridListItemProps, SelectProps as SelectProps$1, SwitchProps as SwitchProps$1, ToggleButtonProps as ToggleButtonProps$1, ToggleButtonGroupProps as ToggleButtonGroupProps$1 } from 'react-aria-components';
3
+ import { DisclosureProps, DisclosureGroupProps, DisclosurePanelProps, HeadingProps, ButtonProps as ButtonProps$1, DateRangePickerProps as DateRangePickerProps$1, ModalOverlayProps, DialogTriggerProps as DialogTriggerProps$1, TabProps as TabProps$1, TabListProps as TabListProps$1, TabPanelProps as TabPanelProps$1, TabsProps as TabsProps$1, LinkProps as LinkProps$1, CheckboxProps as CheckboxProps$1, CheckboxGroupProps as CheckboxGroupProps$1, SelectProps as SelectProps$1, ComboBoxProps, RadioProps as RadioProps$1, RadioGroupProps as RadioGroupProps$1, SliderProps as SliderProps$1, CellProps as CellProps$1, ColumnProps as ColumnProps$1, RowProps as RowProps$1, TableProps as TableProps$1, TableBodyProps as TableBodyProps$1, TableHeaderProps as TableHeaderProps$1, TagProps as TagProps$1, TagListProps, TagGroupProps as TagGroupProps$1, TextFieldProps as TextFieldProps$1, TooltipProps as TooltipProps$1, TooltipTriggerComponentProps, PopoverProps as PopoverProps$1, MenuProps as MenuProps$1, ListBoxProps, MenuItemProps as MenuItemProps$1, ListBoxItemProps, MenuSectionProps as MenuSectionProps$1, SeparatorProps, MenuTriggerProps as MenuTriggerProps$1, SubmenuTriggerProps as SubmenuTriggerProps$1, SearchFieldProps as SearchFieldProps$1, GridListProps, GridListItemProps, SwitchProps as SwitchProps$1, ToggleButtonProps as ToggleButtonProps$1, ToggleButtonGroupProps as ToggleButtonGroupProps$1 } from 'react-aria-components';
4
4
  import { DateValue } from '@internationalized/date';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
6
  import { NavigateOptions } from 'react-router-dom';
@@ -1568,6 +1568,44 @@ interface HeaderNavTabGroup {
1568
1568
  * @public
1569
1569
  */
1570
1570
  type HeaderNavTabItem = HeaderNavTab | HeaderNavTabGroup;
1571
+ /**
1572
+ * Represents a tag item in the header.
1573
+ *
1574
+ * @public
1575
+ */
1576
+ interface HeaderTag {
1577
+ label: string;
1578
+ href?: string;
1579
+ }
1580
+ /**
1581
+ * Represents a metadata key-value pair in the header.
1582
+ *
1583
+ * @public
1584
+ */
1585
+ interface HeaderMetadataItem {
1586
+ label: string;
1587
+ value: React.ReactNode;
1588
+ }
1589
+ /**
1590
+ * Represents a user in the HeaderMetadataUsers component.
1591
+ *
1592
+ * @public
1593
+ */
1594
+ interface HeaderMetadataUser {
1595
+ name: string;
1596
+ src?: string;
1597
+ href?: string;
1598
+ }
1599
+ /**
1600
+ * Represents a status item in the HeaderMetadataStatus component.
1601
+ *
1602
+ * @public
1603
+ */
1604
+ interface HeaderMetadataStatusProps {
1605
+ label: string;
1606
+ color: 'danger' | 'warning' | 'success' | 'info';
1607
+ href?: string;
1608
+ }
1571
1609
  /**
1572
1610
  * Own props for the Header component.
1573
1611
  *
@@ -1578,8 +1616,23 @@ interface HeaderOwnProps {
1578
1616
  customActions?: React.ReactNode;
1579
1617
  tabs?: HeaderNavTabItem[];
1580
1618
  activeTabId?: string | null;
1619
+ /**
1620
+ * @deprecated The breadcrumbs prop will be removed in a future release.
1621
+ */
1581
1622
  breadcrumbs?: HeaderBreadcrumb[];
1623
+ /**
1624
+ * Markdown string rendered below the title. Only inline links are supported.
1625
+ * Bold, italic, and block-level markdown are not rendered.
1626
+ */
1627
+ description?: string;
1628
+ tags?: HeaderTag[];
1629
+ metadata?: HeaderMetadataItem[];
1582
1630
  className?: string;
1631
+ /**
1632
+ * Makes the title-and-actions row stick to the top of its nearest scroll
1633
+ * container while the rest of the header content scrolls away.
1634
+ */
1635
+ sticky?: boolean;
1583
1636
  }
1584
1637
  /**
1585
1638
  * Props for the Header component.
@@ -1633,12 +1686,27 @@ declare const HeaderDefinition: {
1633
1686
  readonly styles: {
1634
1687
  readonly [key: string]: string;
1635
1688
  };
1689
+ readonly bg: "consumer";
1636
1690
  readonly classNames: {
1637
- readonly root: "bui-Header";
1691
+ readonly headerTop: "bui-HeaderTop";
1692
+ readonly stickySentinel: "bui-HeaderStickySentinel";
1638
1693
  readonly content: "bui-HeaderContent";
1694
+ readonly headerBottom: "bui-HeaderBottom";
1639
1695
  readonly breadcrumbs: "bui-HeaderBreadcrumbs";
1696
+ readonly breadcrumbsSmall: "bui-HeaderBreadcrumbsSmall";
1697
+ readonly breadcrumbLink: "bui-HeaderBreadcrumbLink";
1698
+ readonly breadcrumbLinkSmall: "bui-HeaderBreadcrumbLinkSmall";
1699
+ readonly breadcrumbSeparator: "bui-HeaderBreadcrumbSeparator";
1700
+ readonly titleStack: "bui-HeaderTitleStack";
1701
+ readonly title: "bui-HeaderTitle";
1702
+ readonly titleSmall: "bui-HeaderTitleSmall";
1640
1703
  readonly tabsWrapper: "bui-HeaderTabsWrapper";
1641
1704
  readonly controls: "bui-HeaderControls";
1705
+ readonly tags: "bui-HeaderTags";
1706
+ readonly tag: "bui-HeaderTag";
1707
+ readonly description: "bui-HeaderDescription";
1708
+ readonly metaRow: "bui-HeaderMetaRow";
1709
+ readonly metaItem: "bui-HeaderMetaItem";
1642
1710
  };
1643
1711
  readonly propDefs: {
1644
1712
  readonly title: {};
@@ -1646,7 +1714,11 @@ declare const HeaderDefinition: {
1646
1714
  readonly tabs: {};
1647
1715
  readonly activeTabId: {};
1648
1716
  readonly breadcrumbs: {};
1717
+ readonly description: {};
1718
+ readonly tags: {};
1719
+ readonly metadata: {};
1649
1720
  readonly className: {};
1721
+ readonly sticky: {};
1650
1722
  };
1651
1723
  };
1652
1724
  /**
@@ -1657,12 +1729,27 @@ declare const HeaderPageDefinition: {
1657
1729
  readonly styles: {
1658
1730
  readonly [key: string]: string;
1659
1731
  };
1732
+ readonly bg: "consumer";
1660
1733
  readonly classNames: {
1661
- readonly root: "bui-Header";
1734
+ readonly headerTop: "bui-HeaderTop";
1735
+ readonly stickySentinel: "bui-HeaderStickySentinel";
1662
1736
  readonly content: "bui-HeaderContent";
1737
+ readonly headerBottom: "bui-HeaderBottom";
1663
1738
  readonly breadcrumbs: "bui-HeaderBreadcrumbs";
1739
+ readonly breadcrumbsSmall: "bui-HeaderBreadcrumbsSmall";
1740
+ readonly breadcrumbLink: "bui-HeaderBreadcrumbLink";
1741
+ readonly breadcrumbLinkSmall: "bui-HeaderBreadcrumbLinkSmall";
1742
+ readonly breadcrumbSeparator: "bui-HeaderBreadcrumbSeparator";
1743
+ readonly titleStack: "bui-HeaderTitleStack";
1744
+ readonly title: "bui-HeaderTitle";
1745
+ readonly titleSmall: "bui-HeaderTitleSmall";
1664
1746
  readonly tabsWrapper: "bui-HeaderTabsWrapper";
1665
1747
  readonly controls: "bui-HeaderControls";
1748
+ readonly tags: "bui-HeaderTags";
1749
+ readonly tag: "bui-HeaderTag";
1750
+ readonly description: "bui-HeaderDescription";
1751
+ readonly metaRow: "bui-HeaderMetaRow";
1752
+ readonly metaItem: "bui-HeaderMetaItem";
1666
1753
  };
1667
1754
  readonly propDefs: {
1668
1755
  readonly title: {};
@@ -1670,7 +1757,11 @@ declare const HeaderPageDefinition: {
1670
1757
  readonly tabs: {};
1671
1758
  readonly activeTabId: {};
1672
1759
  readonly breadcrumbs: {};
1760
+ readonly description: {};
1761
+ readonly tags: {};
1762
+ readonly metadata: {};
1673
1763
  readonly className: {};
1764
+ readonly sticky: {};
1674
1765
  };
1675
1766
  };
1676
1767
 
@@ -1725,6 +1816,26 @@ declare const HeaderNavGroupDefinition: {
1725
1816
  };
1726
1817
  };
1727
1818
 
1819
+ /**
1820
+ * Displays a list of users as avatars inside a Header metadata value.
1821
+ * A single user shows the avatar with their name beside it.
1822
+ * Multiple users show avatars in a row with the name revealed on hover via tooltip.
1823
+ * When a user has an `href`, the avatar and name become links.
1824
+ *
1825
+ * @public
1826
+ */
1827
+ declare const HeaderMetadataUsers: ({ users, }: {
1828
+ users: HeaderMetadataUser[];
1829
+ }) => react_jsx_runtime.JSX.Element | null;
1830
+
1831
+ /**
1832
+ * Displays a single status indicator as a coloured dot with a label inside a
1833
+ * Header metadata value. Optionally renders the label as a link when href is provided.
1834
+ *
1835
+ * @public
1836
+ */
1837
+ declare const HeaderMetadataStatus: ({ label, color, href, }: HeaderMetadataStatusProps) => react_jsx_runtime.JSX.Element;
1838
+
1728
1839
  /** @public */
1729
1840
  type ButtonIconOwnProps = {
1730
1841
  size?: Responsive<'small' | 'medium'>;
@@ -1923,6 +2034,191 @@ declare const CheckboxGroupDefinition: {
1923
2034
  };
1924
2035
  };
1925
2036
 
2037
+ /** @public */
2038
+ type Option = {
2039
+ value: string;
2040
+ label: string;
2041
+ disabled?: boolean;
2042
+ };
2043
+ /** @public */
2044
+ type OptionSection = {
2045
+ title: string;
2046
+ options: Option[];
2047
+ };
2048
+ /** @public */
2049
+ type SelectOwnProps = {
2050
+ /**
2051
+ * An icon to render before the input
2052
+ */
2053
+ icon?: ReactNode;
2054
+ /**
2055
+ * The size of the select field
2056
+ * @defaultValue 'small'
2057
+ */
2058
+ size?: 'small' | 'medium' | Partial<Record<Breakpoint, 'small' | 'medium'>>;
2059
+ /**
2060
+ * The options of the select field. Pass flat options, option sections for
2061
+ * grouped display, or a mix of both in the same array.
2062
+ */
2063
+ options?: Array<Option | OptionSection>;
2064
+ /**
2065
+ * Enable search/filter functionality in the dropdown
2066
+ * @defaultValue false
2067
+ */
2068
+ searchable?: boolean;
2069
+ /**
2070
+ * placeholder text for the search input
2071
+ * only used when searchable is true
2072
+ * @defaultvalue 'search...'
2073
+ */
2074
+ searchPlaceholder?: string;
2075
+ label?: FieldLabelProps['label'];
2076
+ secondaryLabel?: FieldLabelProps['secondaryLabel'];
2077
+ description?: FieldLabelProps['description'];
2078
+ isRequired?: boolean;
2079
+ className?: string;
2080
+ };
2081
+ /** @public */
2082
+ interface SelectProps<T extends 'single' | 'multiple'> extends SelectOwnProps, Omit<SelectProps$1<Option, T>, keyof SelectOwnProps> {
2083
+ /**
2084
+ * Selection mode, single or multiple
2085
+ * @defaultvalue 'single'
2086
+ */
2087
+ selectionMode?: T;
2088
+ }
2089
+
2090
+ /** @public */
2091
+ type ComboboxOwnProps = {
2092
+ /**
2093
+ * An icon to render before the input
2094
+ */
2095
+ icon?: ReactNode;
2096
+ /**
2097
+ * The size of the combobox field
2098
+ * @defaultValue 'small'
2099
+ */
2100
+ size?: 'small' | 'medium' | Partial<Record<Breakpoint, 'small' | 'medium'>>;
2101
+ /**
2102
+ * The options of the combobox field. Pass flat options, option sections for
2103
+ * grouped display, or a mix of both in the same array.
2104
+ */
2105
+ options?: Array<Option | OptionSection>;
2106
+ /**
2107
+ * Placeholder text for the input.
2108
+ */
2109
+ placeholder?: string;
2110
+ label?: FieldLabelProps['label'];
2111
+ secondaryLabel?: FieldLabelProps['secondaryLabel'];
2112
+ description?: FieldLabelProps['description'];
2113
+ isRequired?: boolean;
2114
+ className?: string;
2115
+ };
2116
+ /** @public */
2117
+ interface ComboboxProps extends ComboboxOwnProps, Omit<ComboBoxProps<Option>, keyof ComboboxOwnProps> {
2118
+ }
2119
+
2120
+ /**
2121
+ * A text input combined with a dropdown list of options. The user can type to filter
2122
+ * suggestions, navigate with the keyboard, and pick a value. With `allowsCustomValue`
2123
+ * the typed text can be committed even if no option matches.
2124
+ *
2125
+ * @public
2126
+ */
2127
+ declare const Combobox: react.ForwardRefExoticComponent<ComboboxProps & react.RefAttributes<HTMLDivElement>>;
2128
+
2129
+ /**
2130
+ * Component definition for Combobox
2131
+ * @public
2132
+ */
2133
+ declare const ComboboxDefinition: {
2134
+ readonly styles: {
2135
+ readonly [key: string]: string;
2136
+ };
2137
+ readonly classNames: {
2138
+ readonly root: "bui-Combobox";
2139
+ readonly popover: "bui-ComboboxPopover";
2140
+ };
2141
+ readonly propDefs: {
2142
+ readonly icon: {};
2143
+ readonly size: {
2144
+ readonly dataAttribute: true;
2145
+ readonly default: "small";
2146
+ };
2147
+ readonly options: {};
2148
+ readonly placeholder: {};
2149
+ readonly label: {};
2150
+ readonly secondaryLabel: {};
2151
+ readonly description: {};
2152
+ readonly isRequired: {};
2153
+ readonly className: {};
2154
+ };
2155
+ };
2156
+ /**
2157
+ * Component definition for ComboboxInput
2158
+ * @public
2159
+ */
2160
+ declare const ComboboxInputDefinition: {
2161
+ readonly styles: {
2162
+ readonly [key: string]: string;
2163
+ };
2164
+ readonly classNames: {
2165
+ readonly root: "bui-ComboboxInput";
2166
+ readonly icon: "bui-ComboboxInputIcon";
2167
+ readonly input: "bui-ComboboxInputField";
2168
+ readonly chevron: "bui-ComboboxInputChevron";
2169
+ };
2170
+ readonly bg: "consumer";
2171
+ readonly propDefs: {
2172
+ readonly icon: {};
2173
+ readonly placeholder: {};
2174
+ };
2175
+ };
2176
+ /**
2177
+ * Component definition for ComboboxListBox
2178
+ * @public
2179
+ */
2180
+ declare const ComboboxListBoxDefinition: {
2181
+ readonly styles: {
2182
+ readonly [key: string]: string;
2183
+ };
2184
+ readonly classNames: {
2185
+ readonly root: "bui-ComboboxList";
2186
+ readonly noResults: "bui-ComboboxNoResults";
2187
+ };
2188
+ readonly propDefs: {
2189
+ readonly options: {};
2190
+ };
2191
+ };
2192
+ /**
2193
+ * Component definition for ComboboxListBoxItem
2194
+ * @public
2195
+ */
2196
+ declare const ComboboxListBoxItemDefinition: {
2197
+ readonly styles: {
2198
+ readonly [key: string]: string;
2199
+ };
2200
+ readonly classNames: {
2201
+ readonly root: "bui-ComboboxItem";
2202
+ readonly indicator: "bui-ComboboxItemIndicator";
2203
+ readonly label: "bui-ComboboxItemLabel";
2204
+ };
2205
+ readonly propDefs: {};
2206
+ };
2207
+ /**
2208
+ * Component definition for ComboboxSection
2209
+ * @public
2210
+ */
2211
+ declare const ComboboxSectionDefinition: {
2212
+ readonly styles: {
2213
+ readonly [key: string]: string;
2214
+ };
2215
+ readonly classNames: {
2216
+ readonly root: "bui-ComboboxSection";
2217
+ readonly header: "bui-ComboboxSectionHeader";
2218
+ };
2219
+ readonly propDefs: {};
2220
+ };
2221
+
1926
2222
  /** @public */
1927
2223
  type RadioGroupOwnProps = {
1928
2224
  children?: ReactNode;
@@ -2484,6 +2780,18 @@ type UseTableCompleteOptions<T extends TableItem, TFilter = unknown> = QueryOpti
2484
2780
  sortFn?: (data: T[], sort: SortDescriptor) => T[];
2485
2781
  filterFn?: (data: T[], filter: TFilter) => T[];
2486
2782
  searchFn?: (data: T[], search: string) => T[];
2783
+ /**
2784
+ * Trailing-edge debounce delay (ms) applied to the search value before it
2785
+ * reaches `searchFn`. Defaults to `0` — no debounce, no extra render. The
2786
+ * controlled `search` / `onSearchChange` surface is unaffected.
2787
+ */
2788
+ searchDebounceMs?: number;
2789
+ /**
2790
+ * Trailing-edge debounce delay (ms) applied to the filter value before it
2791
+ * reaches `filterFn`. Defaults to `0` — no debounce, no extra render. The
2792
+ * controlled `filter` / `onFilterChange` surface is unaffected.
2793
+ */
2794
+ filterDebounceMs?: number;
2487
2795
  } & ({
2488
2796
  data: T[] | undefined;
2489
2797
  getData?: never;
@@ -3439,53 +3747,6 @@ declare const ListRowDefinition: {
3439
3747
  };
3440
3748
  };
3441
3749
 
3442
- /** @public */
3443
- type Option = {
3444
- value: string;
3445
- label: string;
3446
- disabled?: boolean;
3447
- };
3448
- /** @public */
3449
- type SelectOwnProps = {
3450
- /**
3451
- * An icon to render before the input
3452
- */
3453
- icon?: ReactNode;
3454
- /**
3455
- * The size of the select field
3456
- * @defaultValue 'small'
3457
- */
3458
- size?: 'small' | 'medium' | Partial<Record<Breakpoint, 'small' | 'medium'>>;
3459
- /**
3460
- * The options of the select field
3461
- */
3462
- options?: Array<Option>;
3463
- /**
3464
- * Enable search/filter functionality in the dropdown
3465
- * @defaultValue false
3466
- */
3467
- searchable?: boolean;
3468
- /**
3469
- * placeholder text for the search input
3470
- * only used when searchable is true
3471
- * @defaultvalue 'search...'
3472
- */
3473
- searchPlaceholder?: string;
3474
- label?: FieldLabelProps['label'];
3475
- secondaryLabel?: FieldLabelProps['secondaryLabel'];
3476
- description?: FieldLabelProps['description'];
3477
- isRequired?: boolean;
3478
- className?: string;
3479
- };
3480
- /** @public */
3481
- interface SelectProps<T extends 'single' | 'multiple'> extends SelectOwnProps, Omit<SelectProps$1<Option, T>, keyof SelectOwnProps> {
3482
- /**
3483
- * Selection mode, single or multiple
3484
- * @defaultvalue 'single'
3485
- */
3486
- selectionMode?: T;
3487
- }
3488
-
3489
3750
  /**
3490
3751
  * A dropdown picker for selecting one or multiple options from a list, with optional search filtering and inline error display.
3491
3752
  *
@@ -3858,5 +4119,5 @@ declare function useAnalytics(): AnalyticsTracker;
3858
4119
  */
3859
4120
  declare function getNodeText(node: ReactNode | ((...args: any[]) => ReactNode)): string | undefined;
3860
4121
 
3861
- export { Accordion, AccordionDefinition, AccordionGroup, AccordionGroupDefinition, AccordionPanel, AccordionPanelDefinition, AccordionTrigger, AccordionTriggerDefinition, Alert, AlertDefinition, Avatar, AvatarDefinition, BUIProvider, Badge, BadgeDefinition, BgProvider, Box, BoxDefinition, Button, ButtonDefinition, ButtonIcon, ButtonIconDefinition, ButtonLink, ButtonLinkDefinition, Card, CardBody, CardBodyDefinition, CardDefinition, CardFooter, CardFooterDefinition, CardHeader, CardHeaderDefinition, Cell, CellProfile, CellText, Checkbox, CheckboxDefinition, CheckboxGroup, CheckboxGroupDefinition, Column, Container, ContainerDefinition, DateRangePicker, DateRangePickerDefinition, Dialog, DialogBody, DialogBodyDefinition, DialogDefinition, DialogFooter, DialogFooterDefinition, DialogHeader, DialogHeaderDefinition, DialogTrigger, FieldLabel, FieldLabelDefinition, Flex, FlexDefinition, FullPage, FullPageDefinition, Grid, GridDefinition, GridItemDefinition, Header, HeaderDefinition, HeaderNavDefinition, HeaderNavGroupDefinition, HeaderNavItemDefinition, HeaderPage, HeaderPageDefinition, Link, LinkDefinition, List, ListDefinition, ListRow, ListRowDefinition, Menu, MenuAutocomplete, MenuAutocompleteListbox, MenuDefinition, MenuItem, MenuListBox, MenuListBoxItem, MenuSection, MenuSeparator, MenuTrigger, PasswordField, PasswordFieldDefinition, PluginHeader, PluginHeaderDefinition, Popover, PopoverDefinition, Radio, RadioDefinition, RadioGroup, RadioGroupDefinition, Row, SearchAutocomplete, SearchAutocompleteDefinition, SearchAutocompleteItem, SearchField, SearchFieldDefinition, Select, SelectDefinition, Skeleton, SkeletonDefinition, Slider, SliderDefinition, SubmenuTrigger, Switch, SwitchDefinition, Tab, TabList, TabPanel, Table, TableBody, TableBodySkeleton, TableDefinition, TableHeader, TablePagination, TablePaginationDefinition, TableRoot, Tabs, TabsDefinition, Tag, TagGroup, TagGroupDefinition, Text, TextDefinition, TextField, TextFieldDefinition, ToggleButton, ToggleButtonDefinition, ToggleButtonGroup, ToggleButtonGroupDefinition, Tooltip, TooltipDefinition, TooltipTrigger, VisuallyHidden, VisuallyHiddenDefinition, getNodeText, useAnalytics, useBgConsumer, useBgProvider, useBreakpoint, useTable };
3862
- export type { AccordionGroupOwnProps, AccordionGroupProps, AccordionOwnProps, AccordionPanelOwnProps, AccordionPanelProps, AccordionProps, AccordionTriggerOwnProps, AccordionTriggerProps, AlertOwnProps, AlertProps, AlignItems, AnalyticsEventAttributes, AnalyticsTracker, AvatarOwnProps, AvatarProps, BUIProviderProps, BadgeOwnProps, BadgeProps, BgContextValue, BgProviderProps, Border, BorderRadius, BoxOwnProps, BoxProps, BoxUtilityProps, Breakpoint, ButtonIconOwnProps, ButtonIconProps, ButtonLinkOwnProps, ButtonLinkProps, ButtonOwnProps, ButtonProps, CardBaseProps, CardBodyOwnProps, CardBodyProps, CardButtonVariant, CardFooterOwnProps, CardFooterProps, CardHeaderOwnProps, CardHeaderProps, CardLinkVariant, CardOwnProps, CardProps, CardStaticVariant, CellOwnProps, CellProfileOwnProps, CellProfileProps, CellProps, CellTextOwnProps, CellTextProps, CheckboxGroupOwnProps, CheckboxGroupProps, CheckboxOwnProps, CheckboxProps, ColumnConfig, ColumnOwnProps, ColumnProps, Columns, CompletePaginationOptions, ContainerBg, ContainerOwnProps, ContainerProps, CursorParams, CursorResponse, DateRangePickerOwnProps, DateRangePickerProps, DialogBodyOwnProps, DialogBodyProps, DialogFooterOwnProps, DialogFooterProps, DialogHeaderOwnProps, DialogHeaderProps, DialogOwnProps, DialogProps, DialogTriggerProps, Display, FieldLabelOwnProps, FieldLabelProps, FilterState, FlexDirection, FlexItemProps, FlexOwnProps, FlexProps, FlexWrap, FullPageOwnProps, FullPageProps, GridItemOwnProps, GridItemProps, GridOwnProps, GridProps, HeaderBreadcrumb, HeaderNavTab, HeaderNavTabGroup, HeaderNavTabItem, HeaderOwnProps, HeaderPageBreadcrumb, HeaderPageOwnProps, HeaderPageProps, HeaderProps, HeaderTab, JustifyContent, LinkOwnProps, LinkProps, ListOwnProps, ListProps, ListRowOwnProps, ListRowProps, MarginProps, MenuAutocompleteListBoxOwnProps, MenuAutocompleteListBoxProps, MenuAutocompleteOwnProps, MenuAutocompleteProps, MenuItemOwnProps, MenuItemProps, MenuListBoxItemOwnProps, MenuListBoxItemProps, MenuListBoxOwnProps, MenuListBoxProps, MenuOwnProps, MenuPopoverOwnProps, MenuProps, MenuSectionOwnProps, MenuSectionProps, MenuSeparatorOwnProps, MenuSeparatorProps, MenuTriggerProps, NoPagination, OffsetParams, OffsetResponse, Option, PaddingProps, PagePagination, PageSizeOption, PaginationOptions, PasswordFieldOwnProps, PasswordFieldProps, PluginHeaderOwnProps, PluginHeaderProps, PopoverOwnProps, PopoverProps, ProviderBg, QueryOptions, RadioGroupOwnProps, RadioGroupProps, RadioOwnProps, RadioProps, Responsive, RowConfig, RowOwnProps, RowProps, RowRenderFn, SearchAutocompleteItemOwnProps, SearchAutocompleteItemProps, SearchAutocompleteOwnProps, SearchAutocompleteProps, SearchFieldOwnProps, SearchFieldProps, SearchState, SelectOwnProps, SelectProps, SkeletonOwnProps, SkeletonProps, SliderOwnProps, SliderProps, SortDescriptor, SortState, Space, SpaceProps, SubmenuTriggerProps, SwitchOwnProps, SwitchProps, TabListOwnProps, TabListProps, TabMatchStrategy, TabOwnProps, TabPanelOwnProps, TabPanelProps, TabProps, TableBodyOwnProps, TableBodyProps, TableHeaderOwnProps, TableHeaderProps, TableItem, TablePaginationOwnProps, TablePaginationProps, TablePaginationType, TableProps, TableRootOwnProps, TableRootProps, TableSelection, TabsOwnProps, TabsProps, TagGroupOwnProps, TagGroupProps, TagOwnProps, TagProps, TextColorStatus, TextColors, TextFieldOwnProps, TextFieldProps, TextOwnProps, TextProps, TextVariants, TextWeights, ToggleButtonGroupOwnProps, ToggleButtonGroupProps, ToggleButtonOwnProps, ToggleButtonProps, TooltipOwnProps, TooltipProps, UseAnalyticsFn, UseTableCompleteOptions, UseTableCursorOptions, UseTableOffsetOptions, UseTableOptions, UseTableResult, UtilityProps, VirtualizedProp, VisuallyHiddenOwnProps, VisuallyHiddenProps };
4122
+ export { Accordion, AccordionDefinition, AccordionGroup, AccordionGroupDefinition, AccordionPanel, AccordionPanelDefinition, AccordionTrigger, AccordionTriggerDefinition, Alert, AlertDefinition, Avatar, AvatarDefinition, BUIProvider, Badge, BadgeDefinition, BgProvider, Box, BoxDefinition, Button, ButtonDefinition, ButtonIcon, ButtonIconDefinition, ButtonLink, ButtonLinkDefinition, Card, CardBody, CardBodyDefinition, CardDefinition, CardFooter, CardFooterDefinition, CardHeader, CardHeaderDefinition, Cell, CellProfile, CellText, Checkbox, CheckboxDefinition, CheckboxGroup, CheckboxGroupDefinition, Column, Combobox, ComboboxDefinition, ComboboxInputDefinition, ComboboxListBoxDefinition, ComboboxListBoxItemDefinition, ComboboxSectionDefinition, Container, ContainerDefinition, DateRangePicker, DateRangePickerDefinition, Dialog, DialogBody, DialogBodyDefinition, DialogDefinition, DialogFooter, DialogFooterDefinition, DialogHeader, DialogHeaderDefinition, DialogTrigger, FieldLabel, FieldLabelDefinition, Flex, FlexDefinition, FullPage, FullPageDefinition, Grid, GridDefinition, GridItemDefinition, Header, HeaderDefinition, HeaderMetadataStatus, HeaderMetadataUsers, HeaderNavDefinition, HeaderNavGroupDefinition, HeaderNavItemDefinition, HeaderPage, HeaderPageDefinition, Link, LinkDefinition, List, ListDefinition, ListRow, ListRowDefinition, Menu, MenuAutocomplete, MenuAutocompleteListbox, MenuDefinition, MenuItem, MenuListBox, MenuListBoxItem, MenuSection, MenuSeparator, MenuTrigger, PasswordField, PasswordFieldDefinition, PluginHeader, PluginHeaderDefinition, Popover, PopoverDefinition, Radio, RadioDefinition, RadioGroup, RadioGroupDefinition, Row, SearchAutocomplete, SearchAutocompleteDefinition, SearchAutocompleteItem, SearchField, SearchFieldDefinition, Select, SelectDefinition, Skeleton, SkeletonDefinition, Slider, SliderDefinition, SubmenuTrigger, Switch, SwitchDefinition, Tab, TabList, TabPanel, Table, TableBody, TableBodySkeleton, TableDefinition, TableHeader, TablePagination, TablePaginationDefinition, TableRoot, Tabs, TabsDefinition, Tag, TagGroup, TagGroupDefinition, Text, TextDefinition, TextField, TextFieldDefinition, ToggleButton, ToggleButtonDefinition, ToggleButtonGroup, ToggleButtonGroupDefinition, Tooltip, TooltipDefinition, TooltipTrigger, VisuallyHidden, VisuallyHiddenDefinition, getNodeText, useAnalytics, useBgConsumer, useBgProvider, useBreakpoint, useTable };
4123
+ export type { AccordionGroupOwnProps, AccordionGroupProps, AccordionOwnProps, AccordionPanelOwnProps, AccordionPanelProps, AccordionProps, AccordionTriggerOwnProps, AccordionTriggerProps, AlertOwnProps, AlertProps, AlignItems, AnalyticsEventAttributes, AnalyticsTracker, AvatarOwnProps, AvatarProps, BUIProviderProps, BadgeOwnProps, BadgeProps, BgContextValue, BgProviderProps, Border, BorderRadius, BoxOwnProps, BoxProps, BoxUtilityProps, Breakpoint, ButtonIconOwnProps, ButtonIconProps, ButtonLinkOwnProps, ButtonLinkProps, ButtonOwnProps, ButtonProps, CardBaseProps, CardBodyOwnProps, CardBodyProps, CardButtonVariant, CardFooterOwnProps, CardFooterProps, CardHeaderOwnProps, CardHeaderProps, CardLinkVariant, CardOwnProps, CardProps, CardStaticVariant, CellOwnProps, CellProfileOwnProps, CellProfileProps, CellProps, CellTextOwnProps, CellTextProps, CheckboxGroupOwnProps, CheckboxGroupProps, CheckboxOwnProps, CheckboxProps, ColumnConfig, ColumnOwnProps, ColumnProps, Columns, ComboboxOwnProps, ComboboxProps, CompletePaginationOptions, ContainerBg, ContainerOwnProps, ContainerProps, CursorParams, CursorResponse, DateRangePickerOwnProps, DateRangePickerProps, DialogBodyOwnProps, DialogBodyProps, DialogFooterOwnProps, DialogFooterProps, DialogHeaderOwnProps, DialogHeaderProps, DialogOwnProps, DialogProps, DialogTriggerProps, Display, FieldLabelOwnProps, FieldLabelProps, FilterState, FlexDirection, FlexItemProps, FlexOwnProps, FlexProps, FlexWrap, FullPageOwnProps, FullPageProps, GridItemOwnProps, GridItemProps, GridOwnProps, GridProps, HeaderBreadcrumb, HeaderMetadataItem, HeaderMetadataStatusProps, HeaderMetadataUser, HeaderNavTab, HeaderNavTabGroup, HeaderNavTabItem, HeaderOwnProps, HeaderPageBreadcrumb, HeaderPageOwnProps, HeaderPageProps, HeaderProps, HeaderTab, HeaderTag, JustifyContent, LinkOwnProps, LinkProps, ListOwnProps, ListProps, ListRowOwnProps, ListRowProps, MarginProps, MenuAutocompleteListBoxOwnProps, MenuAutocompleteListBoxProps, MenuAutocompleteOwnProps, MenuAutocompleteProps, MenuItemOwnProps, MenuItemProps, MenuListBoxItemOwnProps, MenuListBoxItemProps, MenuListBoxOwnProps, MenuListBoxProps, MenuOwnProps, MenuPopoverOwnProps, MenuProps, MenuSectionOwnProps, MenuSectionProps, MenuSeparatorOwnProps, MenuSeparatorProps, MenuTriggerProps, NoPagination, OffsetParams, OffsetResponse, Option, OptionSection, PaddingProps, PagePagination, PageSizeOption, PaginationOptions, PasswordFieldOwnProps, PasswordFieldProps, PluginHeaderOwnProps, PluginHeaderProps, PopoverOwnProps, PopoverProps, ProviderBg, QueryOptions, RadioGroupOwnProps, RadioGroupProps, RadioOwnProps, RadioProps, Responsive, RowConfig, RowOwnProps, RowProps, RowRenderFn, SearchAutocompleteItemOwnProps, SearchAutocompleteItemProps, SearchAutocompleteOwnProps, SearchAutocompleteProps, SearchFieldOwnProps, SearchFieldProps, SearchState, SelectOwnProps, SelectProps, SkeletonOwnProps, SkeletonProps, SliderOwnProps, SliderProps, SortDescriptor, SortState, Space, SpaceProps, SubmenuTriggerProps, SwitchOwnProps, SwitchProps, TabListOwnProps, TabListProps, TabMatchStrategy, TabOwnProps, TabPanelOwnProps, TabPanelProps, TabProps, TableBodyOwnProps, TableBodyProps, TableHeaderOwnProps, TableHeaderProps, TableItem, TablePaginationOwnProps, TablePaginationProps, TablePaginationType, TableProps, TableRootOwnProps, TableRootProps, TableSelection, TabsOwnProps, TabsProps, TagGroupOwnProps, TagGroupProps, TagOwnProps, TagProps, TextColorStatus, TextColors, TextFieldOwnProps, TextFieldProps, TextOwnProps, TextProps, TextVariants, TextWeights, ToggleButtonGroupOwnProps, ToggleButtonGroupProps, ToggleButtonOwnProps, ToggleButtonProps, TooltipOwnProps, TooltipProps, UseAnalyticsFn, UseTableCompleteOptions, UseTableCursorOptions, UseTableOffsetOptions, UseTableOptions, UseTableResult, UtilityProps, VirtualizedProp, VisuallyHiddenOwnProps, VisuallyHiddenProps };
package/dist/index.esm.js CHANGED
@@ -31,6 +31,8 @@ export { PluginHeaderDefinition } from './components/PluginHeader/definition.esm
31
31
  export { Header, HeaderPage } from './components/Header/Header.esm.js';
32
32
  export { HeaderDefinition, HeaderPageDefinition } from './components/Header/definition.esm.js';
33
33
  export { HeaderNavDefinition, HeaderNavGroupDefinition, HeaderNavItemDefinition } from './components/Header/HeaderNavDefinition.esm.js';
34
+ export { HeaderMetadataUsers } from './components/Header/HeaderMetadataUsers.esm.js';
35
+ export { HeaderMetadataStatus } from './components/Header/HeaderMetadataStatus.esm.js';
34
36
  export { ButtonIcon } from './components/ButtonIcon/ButtonIcon.esm.js';
35
37
  export { ButtonIconDefinition } from './components/ButtonIcon/definition.esm.js';
36
38
  export { ButtonLink } from './components/ButtonLink/ButtonLink.esm.js';
@@ -39,6 +41,8 @@ export { Checkbox } from './components/Checkbox/Checkbox.esm.js';
39
41
  export { CheckboxDefinition } from './components/Checkbox/definition.esm.js';
40
42
  export { CheckboxGroup } from './components/CheckboxGroup/CheckboxGroup.esm.js';
41
43
  export { CheckboxGroupDefinition } from './components/CheckboxGroup/definition.esm.js';
44
+ export { Combobox } from './components/Combobox/Combobox.esm.js';
45
+ export { ComboboxDefinition, ComboboxInputDefinition, ComboboxListBoxDefinition, ComboboxListBoxItemDefinition, ComboboxSectionDefinition } from './components/Combobox/definition.esm.js';
42
46
  export { Radio, RadioGroup } from './components/RadioGroup/RadioGroup.esm.js';
43
47
  export { RadioDefinition, RadioGroupDefinition } from './components/RadioGroup/definition.esm.js';
44
48
  export { Slider } from './components/Slider/Slider.esm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,9 +1,10 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { useMemo } from 'react';
3
3
  import { RouterProvider } from 'react-aria-components';
4
- import { useInRouterContext, useNavigate, useHref } from 'react-router-dom';
4
+ import { useInRouterContext, useNavigate } from 'react-router-dom';
5
5
  import { createVersionedValueMap } from '@backstage/version-bridge';
6
6
  import { BUIContext } from '../analytics/useAnalytics.esm.js';
7
+ import { useResolvedHref } from '../hooks/useResolvedHref.esm.js';
7
8
 
8
9
  function BUIProvider(props) {
9
10
  const { useAnalytics, children } = props;
@@ -21,7 +22,7 @@ function BUIProvider(props) {
21
22
  }
22
23
  function RoutedContent({ children }) {
23
24
  const navigate = useNavigate();
24
- return /* @__PURE__ */ jsx(RouterProvider, { navigate, useHref, children });
25
+ return /* @__PURE__ */ jsx(RouterProvider, { navigate, useHref: useResolvedHref, children });
25
26
  }
26
27
 
27
28
  export { BUIProvider };
@@ -1 +1 @@
1
- {"version":3,"file":"BUIProvider.esm.js","sources":["../../src/provider/BUIProvider.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useMemo, type ReactNode } from 'react';\nimport { RouterProvider } from 'react-aria-components';\nimport { useInRouterContext, useNavigate, useHref } from 'react-router-dom';\nimport { createVersionedValueMap } from '@backstage/version-bridge';\nimport { BUIContext } from '../analytics/useAnalytics';\nimport type { UseAnalyticsFn } from '../analytics/types';\n\n/** @public */\nexport type BUIProviderProps = {\n useAnalytics?: UseAnalyticsFn;\n children: ReactNode;\n};\n\n/**\n * Provides integration capabilities to all descendant BUI components.\n *\n * @example\n * ```tsx\n * import { BUIProvider } from '@backstage/ui';\n * import { useAnalytics as useBackstageAnalytics } from '@backstage/core-plugin-api';\n *\n * function App() {\n * return (\n * <BUIProvider useAnalytics={useBackstageAnalytics}>\n * <AppContent />\n * </BUIProvider>\n * );\n * }\n * ```\n *\n * @public\n */\nexport function BUIProvider(props: BUIProviderProps) {\n const { useAnalytics, children } = props;\n const value = useMemo(\n () =>\n createVersionedValueMap({\n 1: { useAnalytics },\n }),\n [useAnalytics],\n );\n\n const content = (\n <BUIContext.Provider value={value}>{children}</BUIContext.Provider>\n );\n\n if (useInRouterContext()) {\n return <RoutedContent>{content}</RoutedContent>;\n }\n\n return content;\n}\n\nfunction RoutedContent({ children }: { children: ReactNode }) {\n const navigate = useNavigate();\n return (\n <RouterProvider navigate={navigate} useHref={useHref}>\n {children}\n </RouterProvider>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAgDO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAS,GAAI,KAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,MACE,uBAAA,CAAwB;AAAA,MACtB,CAAA,EAAG,EAAE,YAAA;AAAa,KACnB,CAAA;AAAA,IACH,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,0BACJ,GAAA,CAAC,UAAA,CAAW,QAAA,EAAX,EAAoB,OAAe,QAAA,EAAS,CAAA;AAG/C,EAAA,IAAI,oBAAmB,EAAG;AACxB,IAAA,uBAAO,GAAA,CAAC,iBAAe,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAA,CAAc,EAAE,QAAA,EAAS,EAA4B;AAC5D,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,uBACE,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAoB,OAAA,EACjC,QAAA,EACH,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"BUIProvider.esm.js","sources":["../../src/provider/BUIProvider.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useMemo, type ReactNode } from 'react';\nimport { RouterProvider } from 'react-aria-components';\nimport { useInRouterContext, useNavigate } from 'react-router-dom';\nimport { createVersionedValueMap } from '@backstage/version-bridge';\nimport { BUIContext } from '../analytics/useAnalytics';\nimport { useResolvedHref } from '../hooks/useResolvedHref';\nimport type { UseAnalyticsFn } from '../analytics/types';\n\n/** @public */\nexport type BUIProviderProps = {\n useAnalytics?: UseAnalyticsFn;\n children: ReactNode;\n};\n\n/**\n * Provides integration capabilities to all descendant BUI components.\n *\n * @example\n * ```tsx\n * import { BUIProvider } from '@backstage/ui';\n * import { useAnalytics as useBackstageAnalytics } from '@backstage/core-plugin-api';\n *\n * function App() {\n * return (\n * <BUIProvider useAnalytics={useBackstageAnalytics}>\n * <AppContent />\n * </BUIProvider>\n * );\n * }\n * ```\n *\n * @public\n */\nexport function BUIProvider(props: BUIProviderProps) {\n const { useAnalytics, children } = props;\n const value = useMemo(\n () =>\n createVersionedValueMap({\n 1: { useAnalytics },\n }),\n [useAnalytics],\n );\n\n const content = (\n <BUIContext.Provider value={value}>{children}</BUIContext.Provider>\n );\n\n if (useInRouterContext()) {\n return <RoutedContent>{content}</RoutedContent>;\n }\n\n return content;\n}\n\nfunction RoutedContent({ children }: { children: ReactNode }) {\n const navigate = useNavigate();\n return (\n <RouterProvider navigate={navigate} useHref={useResolvedHref}>\n {children}\n </RouterProvider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAiDO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAS,GAAI,KAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,MACE,uBAAA,CAAwB;AAAA,MACtB,CAAA,EAAG,EAAE,YAAA;AAAa,KACnB,CAAA;AAAA,IACH,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,0BACJ,GAAA,CAAC,UAAA,CAAW,QAAA,EAAX,EAAoB,OAAe,QAAA,EAAS,CAAA;AAG/C,EAAA,IAAI,oBAAmB,EAAG;AACxB,IAAA,uBAAO,GAAA,CAAC,iBAAe,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAA,CAAc,EAAE,QAAA,EAAS,EAA4B;AAC5D,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,uBACE,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAoB,OAAA,EAAS,iBAC1C,QAAA,EACH,CAAA;AAEJ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/ui",
3
- "version": "0.15.0-next.0",
3
+ "version": "0.15.0-next.2",
4
4
  "backstage": {
5
5
  "role": "web-library"
6
6
  },
@@ -51,18 +51,23 @@
51
51
  },
52
52
  "dependencies": {
53
53
  "@backstage/version-bridge": "1.0.12",
54
+ "@braintree/sanitize-url": "^7.1.2",
54
55
  "@internationalized/date": "^3.12.0",
55
- "@remixicon/react": "^4.6.0",
56
+ "@remixicon/react": ">=4.6.0 <4.9.0",
56
57
  "@tanstack/react-table": "^8.21.3",
57
58
  "clsx": "^2.1.1",
59
+ "marked": "^15.0.12",
58
60
  "react-aria": "~3.48.0",
59
61
  "react-aria-components": "~1.17.0",
60
62
  "react-stately": "~3.46.0",
61
63
  "use-sync-external-store": "^1.4.0"
62
64
  },
63
65
  "devDependencies": {
64
- "@backstage/cli": "0.36.2-next.0",
66
+ "@backstage/cli": "0.36.2-next.1",
67
+ "@backstage/core-components": "0.18.10-next.1",
65
68
  "@storybook/react-vite": "^10.3.3",
69
+ "@testing-library/jest-dom": "^6.0.0",
70
+ "@testing-library/react": "^16.0.0",
66
71
  "@types/react": "^18.0.0",
67
72
  "@types/react-dom": "^18.0.0",
68
73
  "@types/use-sync-external-store": "^1.0.0",