@backstage/ui 0.13.0-next.2 → 0.13.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.
Files changed (76) hide show
  1. package/CHANGELOG.md +243 -0
  2. package/dist/components/Accordion/Accordion.module.css.esm.js +2 -2
  3. package/dist/components/Button/Button.module.css.esm.js +2 -2
  4. package/dist/components/ButtonIcon/ButtonIcon.module.css.esm.js +2 -2
  5. package/dist/components/ButtonLink/ButtonLink.esm.js +2 -3
  6. package/dist/components/ButtonLink/ButtonLink.esm.js.map +1 -1
  7. package/dist/components/ButtonLink/ButtonLink.module.css.esm.js +2 -2
  8. package/dist/components/Card/Card.esm.js +1 -1
  9. package/dist/components/Card/Card.esm.js.map +1 -1
  10. package/dist/components/Card/Card.module.css.esm.js +2 -2
  11. package/dist/components/Checkbox/Checkbox.esm.js +12 -3
  12. package/dist/components/Checkbox/Checkbox.esm.js.map +1 -1
  13. package/dist/components/Checkbox/Checkbox.module.css.esm.js +2 -2
  14. package/dist/components/Checkbox/definition.esm.js +0 -2
  15. package/dist/components/Checkbox/definition.esm.js.map +1 -1
  16. package/dist/components/Container/Container.module.css.esm.js +2 -2
  17. package/dist/components/Dialog/Dialog.esm.js +3 -1
  18. package/dist/components/Dialog/Dialog.esm.js.map +1 -1
  19. package/dist/components/Dialog/Dialog.module.css.esm.js +2 -2
  20. package/dist/components/Header/Header.module.css.esm.js +2 -2
  21. package/dist/components/Header/definition.esm.js +5 -5
  22. package/dist/components/Header/definition.esm.js.map +1 -1
  23. package/dist/components/Link/Link.esm.js +1 -2
  24. package/dist/components/Link/Link.esm.js.map +1 -1
  25. package/dist/components/List/List.esm.js +70 -0
  26. package/dist/components/List/List.esm.js.map +1 -0
  27. package/dist/components/List/List.module.css.esm.js +8 -0
  28. package/dist/components/List/List.module.css.esm.js.map +1 -0
  29. package/dist/components/List/definition.esm.js +44 -0
  30. package/dist/components/List/definition.esm.js.map +1 -0
  31. package/dist/components/Menu/Menu.esm.js +5 -7
  32. package/dist/components/Menu/Menu.esm.js.map +1 -1
  33. package/dist/components/Menu/Menu.module.css.esm.js +2 -2
  34. package/dist/components/PluginHeader/PluginHeader.esm.js +37 -7
  35. package/dist/components/PluginHeader/PluginHeader.esm.js.map +1 -1
  36. package/dist/components/SearchAutocomplete/SearchAutocomplete.esm.js +164 -0
  37. package/dist/components/SearchAutocomplete/SearchAutocomplete.esm.js.map +1 -0
  38. package/dist/components/SearchAutocomplete/SearchAutocomplete.module.css.esm.js +8 -0
  39. package/dist/components/SearchAutocomplete/SearchAutocomplete.module.css.esm.js.map +1 -0
  40. package/dist/components/SearchAutocomplete/definition.esm.js +52 -0
  41. package/dist/components/SearchAutocomplete/definition.esm.js.map +1 -0
  42. package/dist/components/Select/Select.module.css.esm.js +2 -2
  43. package/dist/components/Table/Table.module.css.esm.js +2 -2
  44. package/dist/components/Table/components/Row.esm.js +21 -9
  45. package/dist/components/Table/components/Row.esm.js.map +1 -1
  46. package/dist/components/Table/components/Table.esm.js +80 -68
  47. package/dist/components/Table/components/Table.esm.js.map +1 -1
  48. package/dist/components/Table/components/TableBodySkeleton.esm.js +33 -0
  49. package/dist/components/Table/components/TableBodySkeleton.esm.js.map +1 -0
  50. package/dist/components/Table/components/TableHeader.esm.js +2 -2
  51. package/dist/components/Table/components/TableHeader.esm.js.map +1 -1
  52. package/dist/components/Table/components/TableRoot.esm.js +1 -1
  53. package/dist/components/Table/components/TableRoot.esm.js.map +1 -1
  54. package/dist/components/Table/definition.esm.js +14 -2
  55. package/dist/components/Table/definition.esm.js.map +1 -1
  56. package/dist/components/Table/hooks/useCompletePagination.esm.js +14 -6
  57. package/dist/components/Table/hooks/useCompletePagination.esm.js.map +1 -1
  58. package/dist/components/Tabs/Tabs.esm.js +3 -5
  59. package/dist/components/Tabs/Tabs.esm.js.map +1 -1
  60. package/dist/components/TagGroup/TagGroup.esm.js +2 -5
  61. package/dist/components/TagGroup/TagGroup.esm.js.map +1 -1
  62. package/dist/components/ToggleButtonGroup/ToggleButtonGroup.module.css.esm.js +2 -2
  63. package/dist/css/styles.css +4 -3
  64. package/dist/index.d.ts +337 -41
  65. package/dist/index.esm.js +5 -1
  66. package/dist/index.esm.js.map +1 -1
  67. package/dist/provider/BUIProvider.esm.js +28 -0
  68. package/dist/provider/BUIProvider.esm.js.map +1 -0
  69. package/dist/utils/{isExternalLink.esm.js → linkUtils.esm.js} +5 -2
  70. package/dist/utils/linkUtils.esm.js.map +1 -0
  71. package/package.json +4 -4
  72. package/dist/analytics/BUIProvider.esm.js +0 -18
  73. package/dist/analytics/BUIProvider.esm.js.map +0 -1
  74. package/dist/components/InternalLinkProvider/InternalLinkProvider.esm.js +0 -55
  75. package/dist/components/InternalLinkProvider/InternalLinkProvider.esm.js.map +0 -1
  76. package/dist/utils/isExternalLink.esm.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"BUIProvider.esm.js","sources":["../../src/analytics/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 { createVersionedValueMap } from '@backstage/version-bridge';\nimport { BUIContext } from './useAnalytics';\nimport type { UseAnalyticsFn } from './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 return <BUIContext.Provider value={value}>{children}</BUIContext.Provider>;\n}\n"],"names":[],"mappings":";;;;;AA8CO,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;AACA,EAAA,uBAAO,GAAA,CAAC,UAAA,CAAW,QAAA,EAAX,EAAoB,OAAe,QAAA,EAAS,CAAA;AACtD;;;;"}
@@ -1,55 +0,0 @@
1
- import { jsx, Fragment } from 'react/jsx-runtime';
2
- import { createContext, useContext, useEffect, useState, useCallback } from 'react';
3
- import { RouterProvider } from 'react-aria-components';
4
- import { useNavigate, useHref } from 'react-router-dom';
5
- import { isExternalLink } from '../../utils/isExternalLink.esm.js';
6
-
7
- function isInternalLink(href) {
8
- return !!href && !isExternalLink(href);
9
- }
10
- function RoutedContainer({ children }) {
11
- const navigate = useNavigate();
12
- return /* @__PURE__ */ jsx(RouterProvider, { navigate, useHref, children });
13
- }
14
- function useRoutingRegistration() {
15
- const [count, setCount] = useState(0);
16
- const register = useCallback(() => {
17
- setCount((c) => c + 1);
18
- return () => setCount((c) => c - 1);
19
- }, []);
20
- return { hasRoutedChildren: count > 0, contextValue: { register } };
21
- }
22
- function createRoutingRegistration() {
23
- const RoutingContext = createContext(null);
24
- function RoutingProvider({ children }) {
25
- const { hasRoutedChildren, contextValue } = useRoutingRegistration();
26
- const content = /* @__PURE__ */ jsx(RoutingContext.Provider, { value: contextValue, children });
27
- if (hasRoutedChildren) {
28
- return /* @__PURE__ */ jsx(RoutedContainer, { children: content });
29
- }
30
- return content;
31
- }
32
- function useRoutingRegistrationEffect(href) {
33
- const routingCtx = useContext(RoutingContext);
34
- const hasInternalHref = isInternalLink(href);
35
- useEffect(() => {
36
- if (hasInternalHref && routingCtx) {
37
- return routingCtx.register();
38
- }
39
- return void 0;
40
- }, [hasInternalHref, routingCtx]);
41
- }
42
- return { RoutingContext, RoutingProvider, useRoutingRegistrationEffect };
43
- }
44
- function InternalLinkProvider({
45
- href,
46
- children
47
- }) {
48
- if (!isInternalLink(href)) {
49
- return /* @__PURE__ */ jsx(Fragment, { children });
50
- }
51
- return /* @__PURE__ */ jsx(RoutedContainer, { children });
52
- }
53
-
54
- export { InternalLinkProvider, RoutedContainer, createRoutingRegistration, isInternalLink, useRoutingRegistration };
55
- //# sourceMappingURL=InternalLinkProvider.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InternalLinkProvider.esm.js","sources":["../../../src/components/InternalLinkProvider/InternalLinkProvider.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 {\n ReactNode,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport { RouterProvider } from 'react-aria-components';\nimport { useNavigate, useHref } from 'react-router-dom';\nimport { isExternalLink } from '../../utils/isExternalLink';\n\n/**\n * Checks if an href is an internal link (not external and not empty).\n *\n * @internal\n */\nexport function isInternalLink(href: string | undefined): href is string {\n return !!href && !isExternalLink(href);\n}\n\n/**\n * Context value type for routing registration.\n * Used by container components to track children that need RouterProvider.\n *\n * @internal\n */\nexport type RoutingContextValue = {\n register: () => () => void;\n};\n\n/**\n * Wraps children in a RouterProvider for client-side navigation.\n * Must be rendered within a React Router context.\n *\n * @internal\n */\nexport function RoutedContainer({ children }: { children: ReactNode }) {\n const navigate = useNavigate();\n return (\n <RouterProvider navigate={navigate} useHref={useHref}>\n {children}\n </RouterProvider>\n );\n}\n\n/**\n * Hook for container components that need to conditionally provide routing.\n *\n * Usage:\n * 1. Call this hook in the container component\n * 2. Pass `contextValue` to a RoutingContextValue context provider\n * 3. Children call `register()` via context when they have internal hrefs\n * 4. If `hasRoutedChildren` is true, wrap content in RoutedContainer\n *\n * @internal\n */\nexport function useRoutingRegistration(): {\n hasRoutedChildren: boolean;\n contextValue: RoutingContextValue;\n} {\n const [count, setCount] = useState(0);\n\n const register = useCallback(() => {\n setCount(c => c + 1);\n return () => setCount(c => c - 1);\n }, []);\n\n return { hasRoutedChildren: count > 0, contextValue: { register } };\n}\n\n/**\n * Creates a routing registration context and provider for container components.\n *\n * Usage:\n * ```tsx\n * // At module level\n * const { RoutingProvider, useRoutingRegistrationEffect } = createRoutingRegistration();\n *\n * // Container component wraps content with provider\n * <RoutingProvider>{content}</RoutingProvider>\n *\n * // Child items register when they have internal hrefs\n * useRoutingRegistrationEffect(href);\n * ```\n *\n * @internal\n */\nexport function createRoutingRegistration() {\n const RoutingContext = createContext<RoutingContextValue | null>(null);\n\n function RoutingProvider({ children }: { children: ReactNode }) {\n const { hasRoutedChildren, contextValue } = useRoutingRegistration();\n\n const content = (\n <RoutingContext.Provider value={contextValue}>\n {children}\n </RoutingContext.Provider>\n );\n\n if (hasRoutedChildren) {\n return <RoutedContainer>{content}</RoutedContainer>;\n }\n\n return content;\n }\n\n function useRoutingRegistrationEffect(href: string | undefined) {\n const routingCtx = useContext(RoutingContext);\n const hasInternalHref = isInternalLink(href);\n\n useEffect(() => {\n if (hasInternalHref && routingCtx) {\n return routingCtx.register();\n }\n return undefined;\n }, [hasInternalHref, routingCtx]);\n }\n\n return { RoutingContext, RoutingProvider, useRoutingRegistrationEffect };\n}\n\n/**\n * Conditionally wraps children in a RouterProvider for internal link navigation.\n * Only mounts the router hooks when `href` is an internal link, avoiding the\n * requirement for a Router context when rendering components without internal hrefs.\n *\n * @internal\n */\nexport function InternalLinkProvider({\n href,\n children,\n}: {\n href: string | undefined;\n children: ReactNode;\n}) {\n if (!isInternalLink(href)) {\n return <>{children}</>;\n }\n return <RoutedContainer>{children}</RoutedContainer>;\n}\n"],"names":[],"mappings":";;;;;;AAiCO,SAAS,eAAe,IAAA,EAA0C;AACvE,EAAA,OAAO,CAAC,CAAC,IAAA,IAAQ,CAAC,eAAe,IAAI,CAAA;AACvC;AAkBO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAS,EAA4B;AACrE,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,uBACE,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAoB,OAAA,EACjC,QAAA,EACH,CAAA;AAEJ;AAaO,SAAS,sBAAA,GAGd;AACA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,CAAC,CAAA;AAEpC,EAAA,MAAM,QAAA,GAAW,YAAY,MAAM;AACjC,IAAA,QAAA,CAAS,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AACnB,IAAA,OAAO,MAAM,QAAA,CAAS,CAAA,CAAA,KAAK,CAAA,GAAI,CAAC,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,iBAAA,EAAmB,KAAA,GAAQ,GAAG,YAAA,EAAc,EAAE,UAAS,EAAE;AACpE;AAmBO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM,cAAA,GAAiB,cAA0C,IAAI,CAAA;AAErE,EAAA,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAS,EAA4B;AAC9D,IAAA,MAAM,EAAE,iBAAA,EAAmB,YAAA,EAAa,GAAI,sBAAA,EAAuB;AAEnE,IAAA,MAAM,0BACJ,GAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,KAAA,EAAO,cAC7B,QAAA,EACH,CAAA;AAGF,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,uBAAO,GAAA,CAAC,mBAAiB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,SAAS,6BAA6B,IAAA,EAA0B;AAC9D,IAAA,MAAM,UAAA,GAAa,WAAW,cAAc,CAAA;AAC5C,IAAA,MAAM,eAAA,GAAkB,eAAe,IAAI,CAAA;AAE3C,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,QAAA,OAAO,WAAW,QAAA,EAAS;AAAA,MAC7B;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,EAAG,CAAC,eAAA,EAAiB,UAAU,CAAC,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,cAAA,EAAgB,eAAA,EAAiB,4BAAA,EAA6B;AACzE;AASO,SAAS,oBAAA,CAAqB;AAAA,EACnC,IAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,IAAI,CAAC,cAAA,CAAe,IAAI,CAAA,EAAG;AACzB,IAAA,uCAAU,QAAA,EAAS,CAAA;AAAA,EACrB;AACA,EAAA,uBAAO,GAAA,CAAC,mBAAiB,QAAA,EAAS,CAAA;AACpC;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"isExternalLink.esm.js","sources":["../../src/utils/isExternalLink.ts"],"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\n/**\n * Determines if a link is external.\n * @param href - The href of the link.\n * @returns True if the link is external, false otherwise.\n * @internal\n */\nexport function isExternalLink(href?: string): boolean {\n if (!href) return false;\n\n // Check if it's an absolute URL with protocol\n if (href.startsWith('http://') || href.startsWith('https://')) {\n return true;\n }\n\n // Check if it's a protocol-relative URL\n if (href.startsWith('//')) {\n return true;\n }\n\n // Check if it's a mailto: or tel: link\n if (href.startsWith('mailto:') || href.startsWith('tel:')) {\n return true;\n }\n\n return false;\n}\n"],"names":[],"mappings":"AAsBO,SAAS,eAAe,IAAA,EAAwB;AACrD,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAGlB,EAAA,IAAI,KAAK,UAAA,CAAW,SAAS,KAAK,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAK,UAAA,CAAW,SAAS,KAAK,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;;;;"}