@cobaltcore-dev/aurora 1.3.0 → 2.1.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 (150) hide show
  1. package/dist/client/ContentHeader-fKKZVu-o.mjs +116 -0
  2. package/dist/client/ContentHeader-fKKZVu-o.mjs.map +1 -0
  3. package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs +802 -0
  4. package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs.map +1 -0
  5. package/dist/client/{FiltersInput-CKI6zWnm.mjs → FiltersInput-Becwxo_J.mjs} +36 -33
  6. package/dist/client/FiltersInput-Becwxo_J.mjs.map +1 -0
  7. package/dist/client/{FloatingIpActionModals-Ch8uozH9.mjs → FloatingIpActionModals-Cq10WljB.mjs} +2 -2
  8. package/dist/client/{FloatingIpActionModals-Ch8uozH9.mjs.map → FloatingIpActionModals-Cq10WljB.mjs.map} +1 -1
  9. package/dist/client/ImageToastNotifications-BWfzOUMc.mjs +1135 -0
  10. package/dist/client/ImageToastNotifications-BWfzOUMc.mjs.map +1 -0
  11. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +26 -0
  12. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +1 -0
  13. package/dist/client/StorageNotFound-B-zVinVD.mjs +30 -0
  14. package/dist/client/StorageNotFound-B-zVinVD.mjs.map +1 -0
  15. package/dist/client/_flavorId-0PioWpEp.mjs +276 -0
  16. package/dist/client/_flavorId-0PioWpEp.mjs.map +1 -0
  17. package/dist/client/_flavorId-B7fp6Nk8.mjs +22 -0
  18. package/dist/client/_flavorId-B7fp6Nk8.mjs.map +1 -0
  19. package/dist/client/{_flavorId-Dg7MS0Af.mjs → _flavorId-CgueqKTs.mjs} +4 -3
  20. package/dist/client/_flavorId-CgueqKTs.mjs.map +1 -0
  21. package/dist/client/{_floatingIpId-DNn6ABCB.mjs → _floatingIpId-B8r64AL9.mjs} +6 -6
  22. package/dist/client/{_floatingIpId-DNn6ABCB.mjs.map → _floatingIpId-B8r64AL9.mjs.map} +1 -1
  23. package/dist/client/{_floatingIpId-C9xfRWot.mjs → _floatingIpId-lEobpOER.mjs} +2 -2
  24. package/dist/client/{_floatingIpId-C9xfRWot.mjs.map → _floatingIpId-lEobpOER.mjs.map} +1 -1
  25. package/dist/client/{_imageId-8JIbFmGB.mjs → _imageId-Ccv8PedW.mjs} +4 -3
  26. package/dist/client/_imageId-Ccv8PedW.mjs.map +1 -0
  27. package/dist/client/_imageId-CiqEQB_J.mjs +558 -0
  28. package/dist/client/_imageId-CiqEQB_J.mjs.map +1 -0
  29. package/dist/client/_imageId-D9LR-02T.mjs +22 -0
  30. package/dist/client/_imageId-D9LR-02T.mjs.map +1 -0
  31. package/dist/client/{_projectId-DPzv0CCp.mjs → _projectId-BDARsteX.mjs} +4 -4
  32. package/dist/client/_projectId-BDARsteX.mjs.map +1 -0
  33. package/dist/client/{_projectId-DfeVJy0G.mjs → _projectId-CtyAHqhH.mjs} +2 -2
  34. package/dist/client/_projectId-CtyAHqhH.mjs.map +1 -0
  35. package/dist/client/_projectId-D3VOH5lN.mjs +94 -0
  36. package/dist/client/_projectId-D3VOH5lN.mjs.map +1 -0
  37. package/dist/client/{_projectId-B3wmSala.mjs → _projectId-ZBk6vka0.mjs} +83 -81
  38. package/dist/client/_projectId-ZBk6vka0.mjs.map +1 -0
  39. package/dist/client/{_securityGroupId-C6eHmrx_.mjs → _securityGroupId-BwgZnoiR.mjs} +2 -2
  40. package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +1 -0
  41. package/dist/client/{_securityGroupId-DmplhDgt.mjs → _securityGroupId-Cz2NUHdB.mjs} +750 -741
  42. package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +1 -0
  43. package/dist/client/{_storageType-CzZ4u9x_.mjs → _storageType-BNpP1A2N.mjs} +3 -2
  44. package/dist/client/_storageType-BNpP1A2N.mjs.map +1 -0
  45. package/dist/client/_storageType-BxSGKhAI.mjs +15 -0
  46. package/dist/client/_storageType-BxSGKhAI.mjs.map +1 -0
  47. package/dist/client/_storageType-DZYCmiLt.mjs +30 -0
  48. package/dist/client/_storageType-DZYCmiLt.mjs.map +1 -0
  49. package/dist/client/_storageType-UqAMP-8d.mjs +859 -0
  50. package/dist/client/_storageType-UqAMP-8d.mjs.map +1 -0
  51. package/dist/client/_storageType-u51_7OwJ.mjs +7 -0
  52. package/dist/client/_storageType-u51_7OwJ.mjs.map +1 -0
  53. package/dist/client/components/{Error → Errors}/RouteError.d.ts +5 -0
  54. package/dist/client/components/Errors/RouteIdLevelDefaultError.d.ts +18 -0
  55. package/dist/client/components/Errors/ServiceLevelDefaultError.d.ts +9 -0
  56. package/dist/client/components/ListToolbar/SelectedFilters.d.ts +7 -2
  57. package/dist/client/components/ListToolbar/types.d.ts +6 -0
  58. package/dist/client/components/ListToolbar/valueLabels.d.ts +11 -0
  59. package/dist/client/{flavors-B1SDOPDu.mjs → flavors-Ce3J-cFa.mjs} +2 -2
  60. package/dist/client/{flavors-B1SDOPDu.mjs.map → flavors-Ce3J-cFa.mjs.map} +1 -1
  61. package/dist/client/flavors-D5ThLaXO.mjs +666 -0
  62. package/dist/client/flavors-D5ThLaXO.mjs.map +1 -0
  63. package/dist/client/floatingips-Cz9k80cc.mjs.map +1 -1
  64. package/dist/client/{floatingips-DrCvtXtT.mjs → floatingips-DXnRlLvV.mjs} +7 -7
  65. package/dist/client/{floatingips-DrCvtXtT.mjs.map → floatingips-DXnRlLvV.mjs.map} +1 -1
  66. package/dist/client/floatingips-HRbuLxiN.mjs +22 -0
  67. package/dist/client/floatingips-HRbuLxiN.mjs.map +1 -0
  68. package/dist/client/floatingips-nN1kQmsu.mjs +14 -0
  69. package/dist/client/floatingips-nN1kQmsu.mjs.map +1 -0
  70. package/dist/client/{images-BGQv9kKT.mjs → images-C8M3ysWR.mjs} +810 -770
  71. package/dist/client/images-C8M3ysWR.mjs.map +1 -0
  72. package/dist/client/{images-CPmMa4SQ.mjs → images-Cf5R28NR.mjs} +2 -2
  73. package/dist/client/{images-CPmMa4SQ.mjs.map → images-Cf5R28NR.mjs.map} +1 -1
  74. package/dist/client/index.js +419 -415
  75. package/dist/client/index.js.map +1 -1
  76. package/dist/client/{objects-BR3eeSNH.mjs → objects-BudUAfWY.mjs} +5478 -5519
  77. package/dist/client/objects-BudUAfWY.mjs.map +1 -0
  78. package/dist/client/objects-Dc7sKUr8.mjs +67 -0
  79. package/dist/client/objects-Dc7sKUr8.mjs.map +1 -0
  80. package/dist/client/objects-Dw7oeTq2.mjs +80 -0
  81. package/dist/client/objects-Dw7oeTq2.mjs.map +1 -0
  82. package/dist/client/objects-_g7nGIn5.mjs +25 -0
  83. package/dist/client/objects-_g7nGIn5.mjs.map +1 -0
  84. package/dist/client/objects-eBxvY6_n.mjs +78 -0
  85. package/dist/client/objects-eBxvY6_n.mjs.map +1 -0
  86. package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
  87. package/dist/client/{securitygroups-DEJQBcxm.mjs → securitygroups-67fFxiwt.mjs} +2 -2
  88. package/dist/client/{securitygroups-DEJQBcxm.mjs.map → securitygroups-67fFxiwt.mjs.map} +1 -1
  89. package/dist/client/securitygroups-CtKne8UQ.mjs.map +1 -1
  90. package/dist/client/securitygroups-DXrfyuVF.mjs +580 -0
  91. package/dist/client/securitygroups-DXrfyuVF.mjs.map +1 -0
  92. package/dist/client/securitygroups-WLB1_IM6.mjs +22 -0
  93. package/dist/client/securitygroups-WLB1_IM6.mjs.map +1 -0
  94. package/dist/client/securitygroups-o0IXZM6S.mjs +14 -0
  95. package/dist/client/securitygroups-o0IXZM6S.mjs.map +1 -0
  96. package/dist/client/serviceCatalog-B3lKWC9V.mjs +6 -0
  97. package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +1 -0
  98. package/dist/client/storageProviders-CJ5rOh13.mjs +15 -0
  99. package/dist/client/storageProviders-CJ5rOh13.mjs.map +1 -0
  100. package/dist/client/trpcClient.d.ts +102 -4
  101. package/dist/client/useModalTracking-BYd37pXm.mjs +37 -0
  102. package/dist/client/useModalTracking-BYd37pXm.mjs.map +1 -0
  103. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +294 -0
  104. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +1 -0
  105. package/dist/client/utils/serviceCatalog.d.ts +9 -0
  106. package/dist/client/utils/storageProviders.d.ts +44 -0
  107. package/dist/server/index.d.ts +102 -4
  108. package/dist/server/index.js +1319 -416
  109. package/package.json +4 -4
  110. package/dist/client/ContentHeader-CPJbgYWn.mjs +0 -115
  111. package/dist/client/ContentHeader-CPJbgYWn.mjs.map +0 -1
  112. package/dist/client/DeleteFlavorModal-V44QCJBd.mjs +0 -773
  113. package/dist/client/DeleteFlavorModal-V44QCJBd.mjs.map +0 -1
  114. package/dist/client/FiltersInput-CKI6zWnm.mjs.map +0 -1
  115. package/dist/client/ImageToastNotifications-m6c3tVPb.mjs +0 -1152
  116. package/dist/client/ImageToastNotifications-m6c3tVPb.mjs.map +0 -1
  117. package/dist/client/_flavorId-Dg7MS0Af.mjs.map +0 -1
  118. package/dist/client/_flavorId-kHl-b8rI.mjs +0 -232
  119. package/dist/client/_flavorId-kHl-b8rI.mjs.map +0 -1
  120. package/dist/client/_imageId-8JIbFmGB.mjs.map +0 -1
  121. package/dist/client/_imageId-BBAlRioC.mjs +0 -574
  122. package/dist/client/_imageId-BBAlRioC.mjs.map +0 -1
  123. package/dist/client/_projectId-7Nl1MQTJ.mjs +0 -99
  124. package/dist/client/_projectId-7Nl1MQTJ.mjs.map +0 -1
  125. package/dist/client/_projectId-B3wmSala.mjs.map +0 -1
  126. package/dist/client/_projectId-DPzv0CCp.mjs.map +0 -1
  127. package/dist/client/_projectId-DfeVJy0G.mjs.map +0 -1
  128. package/dist/client/_securityGroupId-C6eHmrx_.mjs.map +0 -1
  129. package/dist/client/_securityGroupId-DmplhDgt.mjs.map +0 -1
  130. package/dist/client/_storageType-BRWWJtow.mjs +0 -14
  131. package/dist/client/_storageType-BRWWJtow.mjs.map +0 -1
  132. package/dist/client/_storageType-C5gS9eut.mjs +0 -845
  133. package/dist/client/_storageType-C5gS9eut.mjs.map +0 -1
  134. package/dist/client/_storageType-CzZ4u9x_.mjs.map +0 -1
  135. package/dist/client/_storageType-zeSZe--V.mjs +0 -7
  136. package/dist/client/_storageType-zeSZe--V.mjs.map +0 -1
  137. package/dist/client/flavors-D8_PzQUB.mjs +0 -628
  138. package/dist/client/flavors-D8_PzQUB.mjs.map +0 -1
  139. package/dist/client/images-BGQv9kKT.mjs.map +0 -1
  140. package/dist/client/objects-AERkhfiM.mjs +0 -66
  141. package/dist/client/objects-AERkhfiM.mjs.map +0 -1
  142. package/dist/client/objects-BR3eeSNH.mjs.map +0 -1
  143. package/dist/client/objects-DVccbrL1.mjs +0 -66
  144. package/dist/client/objects-DVccbrL1.mjs.map +0 -1
  145. package/dist/client/securitygroups-BjhgLBHm.mjs +0 -620
  146. package/dist/client/securitygroups-BjhgLBHm.mjs.map +0 -1
  147. package/dist/client/useModalTracking-BcOKTYRN.mjs +0 -33
  148. package/dist/client/useModalTracking-BcOKTYRN.mjs.map +0 -1
  149. package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs +0 -227
  150. package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cobaltcore-dev/aurora",
3
- "version": "1.3.0",
3
+ "version": "2.1.0",
4
4
  "private": false,
5
5
  "description": "Aurora OpenStack dashboard — server and client library",
6
6
  "license": "Apache-2.0",
@@ -105,10 +105,10 @@
105
105
  "vite-plugin-dts": "^5.0.3",
106
106
  "vite-plugin-svgr": "^5.2.0",
107
107
  "vite-tsconfig-paths": "^6.1.1",
108
- "vitest": "^4.1.10",
108
+ "vitest": "^4.1.11",
109
109
  "@cobaltcore-dev/aurora-config": "0.0.1",
110
- "@cobaltcore-dev/policy-engine": "2.0.0",
111
- "@cobaltcore-dev/signal-openstack": "1.0.1"
110
+ "@cobaltcore-dev/signal-openstack": "1.0.1",
111
+ "@cobaltcore-dev/policy-engine": "2.0.0"
112
112
  },
113
113
  "scripts": {
114
114
  "build": "pnpm build:server && pnpm build:client",
@@ -1,115 +0,0 @@
1
- import { H as e, Q as t, Z as n, _ as r, at as i, d as a, tt as o } from "./build-WuxXRAqf.mjs";
2
- import { t as s } from "./Slot-CWb612-_.mjs";
3
- import { t as c } from "./routeInfo-DP3v74Wg.mjs";
4
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
- import { useState as d } from "react";
6
- import { useMatches as f, useParams as p, useRouteContext as m } from "@tanstack/react-router";
7
- import { Trans as h, useLingui as g } from "@lingui/react";
8
- //#region src/client/components/ClipboardText.tsx
9
- var _ = ({ text: r, tooltipContent: i, className: s, truncateAt: c, showTooltip: f = !0, ...p }) => {
10
- let { i18n: m, _: h } = g(), [_, v] = d(!1), [y, b] = d(!1), x = `copyableTooltip inline-flex items-center ${s || ""}`, S = async (e) => {
11
- e.preventDefault(), e.stopPropagation();
12
- try {
13
- await navigator.clipboard.writeText(r), v(!0), b(!1), setTimeout(() => v(!1), 2e3);
14
- } catch (e) {
15
- console.error("Failed to copy text:", e);
16
- }
17
- }, C = c && r.length > c ? `${r.slice(0, c)}...` : r, w = () => _ ? i || m._({ id: "u+VWhB" }) : m._({ id: "he3ygx" }), T = _ && f || y && f;
18
- return /*#__PURE__*/ l("div", {
19
- ...p,
20
- className: x,
21
- children: /*#__PURE__*/ u(n, {
22
- open: T,
23
- children: [/*#__PURE__*/ l(o, {
24
- onClick: S,
25
- onMouseEnter: () => !_ && b(!0),
26
- onMouseLeave: () => b(!1),
27
- "aria-label": m._({
28
- id: "Wbg1jv",
29
- values: { text: r }
30
- }),
31
- className: "cursor-pointer",
32
- asChild: !0,
33
- "data-testid": "clipboard-copy-trigger",
34
- children: /*#__PURE__*/ l("button", {
35
- type: "button",
36
- className: "group border-none bg-transparent p-0 text-inherit",
37
- children: /*#__PURE__*/ u(t, {
38
- direction: "horizontal",
39
- gap: "1",
40
- className: "items-center hover:underline",
41
- children: [/*#__PURE__*/ l("span", {
42
- className: "select-none",
43
- children: C
44
- }), /*#__PURE__*/ l(a, {
45
- icon: _ ? "check" : "contentCopy",
46
- size: "18"
47
- })]
48
- })
49
- })
50
- }), /*#__PURE__*/ l(e, { children: w() })]
51
- })
52
- });
53
- };
54
- //#endregion
55
- //#region src/client/components/ContentHeader/ContentHeader.tsx
56
- function v({ title: e, projectId: t, description: n, actions: a, badges: o }) {
57
- let { slots: d } = m({ strict: !1 }), g = f(), { provider: v } = p({ strict: !1 }), y = [...g].reverse().find((e) => c(e.staticData)), b = y && c(y.staticData) ? y.staticData.service : void 0, x = b === "containers" && v === "ceph" ? "ceph-containers" : b, S = d?.servicePageActions && x ? /*#__PURE__*/ l(s, {
58
- component: d.servicePageActions,
59
- useShadowDOM: !1,
60
- currentService: x
61
- }) : null, C = d?.serviceBanner && x ? /*#__PURE__*/ l(s, {
62
- component: d.serviceBanner,
63
- useShadowDOM: !1,
64
- currentService: x
65
- }) : null, w = d?.projectOverviewBanner && !x ? /*#__PURE__*/ l(s, {
66
- component: d.projectOverviewBanner,
67
- useShadowDOM: !1
68
- }) : null;
69
- return /*#__PURE__*/ u("header", {
70
- className: "mb-8",
71
- children: [
72
- /*#__PURE__*/ u("div", {
73
- className: "flex flex-col sm:flex-row sm:items-center sm:justify-between",
74
- children: [/*#__PURE__*/ u("div", {
75
- className: "flex items-center gap-3",
76
- children: [/*#__PURE__*/ l(i, { children: e }), S]
77
- }), /*#__PURE__*/ u("div", {
78
- className: "text-theme-light flex shrink-0 items-center gap-1 text-sm",
79
- children: [/*#__PURE__*/ u("span", {
80
- className: "font-semibold",
81
- children: [
82
- /*#__PURE__*/ l(h, { id: "mSfwLL" }),
83
- ":",
84
- " "
85
- ]
86
- }), /*#__PURE__*/ l(_, {
87
- text: t,
88
- truncateAt: 15
89
- })]
90
- })]
91
- }),
92
- n && /*#__PURE__*/ l("p", {
93
- className: "text-sm font-normal",
94
- children: n
95
- }),
96
- C,
97
- w,
98
- /*#__PURE__*/ l(r, { className: "mt-4" }),
99
- (o || a) && /*#__PURE__*/ u("div", {
100
- className: "mt-3 flex items-start justify-between",
101
- children: [/*#__PURE__*/ u("div", {
102
- className: "flex items-center gap-2",
103
- children: [o, " "]
104
- }), a && /*#__PURE__*/ l("div", {
105
- className: "flex gap-2",
106
- children: a
107
- })]
108
- })
109
- ]
110
- });
111
- }
112
- //#endregion
113
- export { _ as n, v as t };
114
-
115
- //# sourceMappingURL=ContentHeader-CPJbgYWn.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContentHeader-CPJbgYWn.mjs","names":["React","useState","Tooltip","TooltipTrigger","TooltipContent","Icon","Stack","ClipboardText","text","tooltipContent","className","truncateAt","showTooltip","props","useLingui","copied","setCopied","isHovering","setIsHovering","combinedClassName","handleCopy","e","preventDefault","stopPropagation","navigator","clipboard","writeText","setTimeout","err","console","error","displayText","length","slice","getTooltipContent","t","tooltipIsOpen","div","open","onClick","onMouseEnter","onMouseLeave","aria-label","asChild","data-testid","button","type","direction","gap","span","icon","size","Divider","ContentHeading","useRouteContext","useMatches","useParams","ClipboardText","Slot","isRouteInfo","ContentHeader","title","projectId","description","actions","badges","slots","strict","matches","provider","activeMatch","reverse","find","m","staticData","routeService","service","undefined","currentService","slotActions","servicePageActions","component","useShadowDOM","serviceBanner","projectOverviewBanner","header","className","div","span","text","truncateAt","p"],"sources":["../../src/client/components/ClipboardText.tsx","../../src/client/components/ContentHeader/ContentHeader.tsx"],"sourcesContent":["import React, { useState } from \"react\"\nimport { Tooltip, TooltipTrigger, TooltipContent, Icon, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { useLingui } from \"@lingui/react/macro\"\n\nexport interface ClipboardTextProps extends React.HTMLAttributes<HTMLDivElement> {\n tooltipContent?: string\n text: string\n className?: string\n truncateAt?: number\n showTooltip?: boolean\n}\n\nconst ClipboardText: React.FC<ClipboardTextProps> = ({\n text,\n tooltipContent,\n className,\n truncateAt,\n showTooltip = true,\n ...props\n}) => {\n const { t } = useLingui()\n const [copied, setCopied] = useState(false)\n const [isHovering, setIsHovering] = useState(false)\n\n const combinedClassName = `copyableTooltip inline-flex items-center ${className || \"\"}`\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n setIsHovering(false)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy text:\", err)\n }\n }\n\n const displayText = truncateAt && text.length > truncateAt ? `${text.slice(0, truncateAt)}...` : text\n\n // Determine tooltip content based on state\n const getTooltipContent = () => {\n if (copied) {\n return tooltipContent || t`Copied to clipboard!`\n }\n return t`Copy`\n }\n\n const tooltipIsOpen = (copied && showTooltip) || (isHovering && showTooltip)\n\n return (\n <div {...props} className={combinedClassName}>\n <Tooltip open={tooltipIsOpen}>\n <TooltipTrigger\n onClick={handleCopy}\n onMouseEnter={() => !copied && setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n aria-label={t`Copy ${text} to clipboard`}\n className=\"cursor-pointer\"\n asChild\n data-testid=\"clipboard-copy-trigger\"\n >\n <button type=\"button\" className=\"group border-none bg-transparent p-0 text-inherit\">\n <Stack direction=\"horizontal\" gap=\"1\" className=\"items-center hover:underline\">\n <span className=\"select-none\">{displayText}</span>\n <Icon icon={copied ? \"check\" : \"contentCopy\"} size=\"18\" />\n </Stack>\n </button>\n </TooltipTrigger>\n <TooltipContent>{getTooltipContent()}</TooltipContent>\n </Tooltip>\n </div>\n )\n}\n\nexport default ClipboardText\n","import type { ReactNode } from \"react\"\nimport { Divider, ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useRouteContext, useMatches, useParams } from \"@tanstack/react-router\"\nimport ClipboardText from \"../ClipboardText\"\nimport { Slot } from \"../Slot\"\nimport { isRouteInfo } from \"@/client/routes/routeInfo\"\n\ninterface ContentHeaderProps {\n title: string\n projectId: string\n description?: string | null\n actions?: ReactNode\n badges?: ReactNode\n}\n\nexport function ContentHeader({ title, projectId, description, actions, badges }: ContentHeaderProps) {\n const { slots } = useRouteContext({ strict: false })\n const matches = useMatches()\n const { provider } = useParams({ strict: false }) as { provider?: string }\n\n const activeMatch = [...matches].reverse().find((m) => isRouteInfo(m.staticData))\n const routeService = activeMatch && isRouteInfo(activeMatch.staticData) ? activeMatch.staticData.service : undefined\n\n // Storage routes share service: \"containers\" for both Swift and Ceph.\n // Distinguish them by the $provider param.\n const currentService = routeService === \"containers\" && provider === \"ceph\" ? \"ceph-containers\" : routeService\n\n const slotActions =\n slots?.servicePageActions && currentService ? (\n <Slot component={slots.servicePageActions} useShadowDOM={false} currentService={currentService} />\n ) : null\n\n const serviceBanner =\n slots?.serviceBanner && currentService ? (\n <Slot component={slots.serviceBanner} useShadowDOM={false} currentService={currentService} />\n ) : null\n\n const projectOverviewBanner =\n slots?.projectOverviewBanner && !currentService ? (\n <Slot component={slots.projectOverviewBanner} useShadowDOM={false} />\n ) : null\n\n return (\n <header className=\"mb-8\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-3\">\n <ContentHeading>{title}</ContentHeading>\n {slotActions}\n </div>\n <div className=\"text-theme-light flex shrink-0 items-center gap-1 text-sm\">\n <span className=\"font-semibold\">\n <Trans>Project ID</Trans>:{\" \"}\n </span>\n <ClipboardText text={projectId} truncateAt={15} />\n </div>\n </div>\n {description && <p className=\"text-sm font-normal\">{description}</p>}\n {serviceBanner}\n {projectOverviewBanner}\n <Divider className=\"mt-4\" />\n {(badges || actions) && (\n <div className=\"mt-3 flex items-start justify-between\">\n <div className=\"flex items-center gap-2\">{badges} </div>\n {actions && <div className=\"flex gap-2\">{actions}</div>}\n </div>\n )}\n </header>\n )\n}\n"],"mappings":"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"}