@strapi/admin 5.54.0 → 5.55.1

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 (92) hide show
  1. package/dist/admin/admin/src/components/LanguageProvider.js +35 -1
  2. package/dist/admin/admin/src/components/LanguageProvider.js.map +1 -1
  3. package/dist/admin/admin/src/components/LanguageProvider.mjs +17 -2
  4. package/dist/admin/admin/src/components/LanguageProvider.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/SubNav.js +113 -35
  6. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  7. package/dist/admin/admin/src/components/SubNav.mjs +115 -37
  8. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/SubNavFolder.js +188 -0
  10. package/dist/admin/admin/src/components/SubNavFolder.js.map +1 -0
  11. package/dist/admin/admin/src/components/SubNavFolder.mjs +186 -0
  12. package/dist/admin/admin/src/components/SubNavFolder.mjs.map +1 -0
  13. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  14. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  15. package/dist/admin/admin/src/render.js +1 -1
  16. package/dist/admin/admin/src/render.js.map +1 -1
  17. package/dist/admin/admin/src/render.mjs +1 -1
  18. package/dist/admin/admin/src/render.mjs.map +1 -1
  19. package/dist/admin/admin/src/translations/en.json.js +4 -0
  20. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  21. package/dist/admin/admin/src/translations/en.json.mjs +4 -0
  22. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  23. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js +1 -6
  24. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js.map +1 -1
  25. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs +1 -6
  26. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs.map +1 -1
  27. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +7 -1
  28. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  29. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +7 -1
  30. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
  31. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +5 -1
  32. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  33. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +5 -1
  34. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  35. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +0 -4
  36. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  37. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +0 -4
  38. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  39. package/dist/admin/src/components/SubNav.d.ts +27 -8
  40. package/dist/admin/src/components/SubNavFolder.d.ts +15 -0
  41. package/dist/admin/src/features/Tracking.d.ts +2 -1
  42. package/dist/admin/src/services/admin.d.ts +1 -0
  43. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +4 -0
  44. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  45. package/dist/ee/server/src/index.d.ts.map +1 -1
  46. package/dist/server/ee/server/src/controllers/admin.js +1 -5
  47. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  48. package/dist/server/ee/server/src/controllers/admin.mjs +1 -5
  49. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  50. package/dist/server/ee/server/src/index.js +2 -0
  51. package/dist/server/ee/server/src/index.js.map +1 -1
  52. package/dist/server/ee/server/src/index.mjs +2 -0
  53. package/dist/server/ee/server/src/index.mjs.map +1 -1
  54. package/dist/server/server/src/ai/controllers/ai.js +3 -3
  55. package/dist/server/server/src/ai/controllers/ai.js.map +1 -1
  56. package/dist/server/server/src/ai/controllers/ai.mjs +3 -3
  57. package/dist/server/server/src/ai/controllers/ai.mjs.map +1 -1
  58. package/dist/server/server/src/ai/services/ai.js +37 -12
  59. package/dist/server/server/src/ai/services/ai.js.map +1 -1
  60. package/dist/server/server/src/ai/services/ai.mjs +37 -12
  61. package/dist/server/server/src/ai/services/ai.mjs.map +1 -1
  62. package/dist/server/server/src/audit-logs/tokens.js +106 -0
  63. package/dist/server/server/src/audit-logs/tokens.js.map +1 -0
  64. package/dist/server/server/src/audit-logs/tokens.mjs +99 -0
  65. package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -0
  66. package/dist/server/server/src/controllers/admin.js +10 -1
  67. package/dist/server/server/src/controllers/admin.js.map +1 -1
  68. package/dist/server/server/src/controllers/admin.mjs +10 -1
  69. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  70. package/dist/server/server/src/services/api-token.js +106 -4
  71. package/dist/server/server/src/services/api-token.js.map +1 -1
  72. package/dist/server/server/src/services/api-token.mjs +107 -5
  73. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  74. package/dist/server/server/src/services/transfer/token.js +56 -4
  75. package/dist/server/server/src/services/transfer/token.js.map +1 -1
  76. package/dist/server/server/src/services/transfer/token.mjs +57 -5
  77. package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
  78. package/dist/server/src/ai/services/ai.d.ts +3 -1
  79. package/dist/server/src/ai/services/ai.d.ts.map +1 -1
  80. package/dist/server/src/audit-logs/tokens.d.ts +86 -0
  81. package/dist/server/src/audit-logs/tokens.d.ts.map +1 -0
  82. package/dist/server/src/controllers/admin.d.ts +1 -0
  83. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  84. package/dist/server/src/controllers/index.d.ts +1 -0
  85. package/dist/server/src/controllers/index.d.ts.map +1 -1
  86. package/dist/server/src/index.d.ts +1 -0
  87. package/dist/server/src/index.d.ts.map +1 -1
  88. package/dist/server/src/services/api-token.d.ts.map +1 -1
  89. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  90. package/dist/shared/contracts/admin.d.ts +1 -0
  91. package/dist/shared/contracts/admin.d.ts.map +1 -1
  92. package/package.json +7 -7
@@ -1,11 +1,12 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, useId, useRef, useEffect } from 'react';
3
- import { SubNav as SubNav$1, Flex, Box, Typography, Badge, IconButton, ScrollArea } from '@strapi/design-system';
2
+ import { useState, useId, useRef, useEffect, useMemo } from 'react';
3
+ import { SubNav as SubNav$1, Flex, Box, Typography, IconButton, Menu, Badge, ScrollArea } from '@strapi/design-system';
4
4
  import { ChevronDown, Plus } from '@strapi/icons';
5
5
  import { NavLink } from 'react-router-dom';
6
6
  import { styled } from 'styled-components';
7
7
  import { WIDTH_SIDE_NAVIGATION, HEIGHT_TOP_NAVIGATION, HEIGHT_TOP_NAVIGATION_MEDIUM } from '../constants/theme.mjs';
8
8
  import { tours } from './GuidedTour/Tours.mjs';
9
+ import { SubNavFolder } from './SubNavFolder.mjs';
9
10
 
10
11
  const MainSubNav = styled(SubNav$1)`
11
12
  width: 100%;
@@ -41,6 +42,10 @@ const StyledLink = styled(NavLink)`
41
42
 
42
43
  color: ${({ theme })=>theme.colors.neutral800};
43
44
 
45
+ & > div {
46
+ padding-left: ${({ theme, $depth = 0 })=>`calc(${$depth} * ${theme.spaces[6]} + ${theme.spaces[3]})`};
47
+ }
48
+
44
49
  &.active > div {
45
50
  ${({ theme })=>{
46
51
  return `
@@ -71,14 +76,28 @@ const StyledLink = styled(NavLink)`
71
76
  outline-offset: -2px;
72
77
  }
73
78
  `;
79
+ const LinkBullet = styled.span`
80
+ display: inline-flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ flex: 0 0 16px;
84
+
85
+ &::before {
86
+ content: '';
87
+ width: 4px;
88
+ height: 4px;
89
+ border-radius: 50%;
90
+ background-color: currentColor;
91
+ }
92
+ `;
74
93
  const Link = (props)=>{
75
- const { label, endAction, handleClick, ...rest } = props;
94
+ const { label, endAction, handleClick, depth, bulleted = false, ...rest } = props;
76
95
  return /*#__PURE__*/ jsx(StyledLink, {
77
96
  ...rest,
97
+ $depth: depth,
78
98
  onClick: handleClick,
79
99
  children: /*#__PURE__*/ jsx(Box, {
80
100
  width: '100%',
81
- paddingLeft: 3,
82
101
  paddingRight: 3,
83
102
  paddingTop: {
84
103
  initial: 1,
@@ -97,19 +116,28 @@ const Link = (props)=>{
97
116
  large: 1
98
117
  },
99
118
  children: [
100
- /*#__PURE__*/ jsx(Typography, {
101
- tag: "div",
102
- lineHeight: "32px",
103
- width: {
104
- initial: '80dvw',
105
- medium: '100%'
106
- },
107
- overflow: "hidden",
108
- style: {
109
- textOverflow: 'ellipsis',
110
- whiteSpace: 'nowrap'
111
- },
112
- children: label
119
+ /*#__PURE__*/ jsxs(Flex, {
120
+ gap: 2,
121
+ flex: "1",
122
+ minWidth: "0",
123
+ alignItems: "center",
124
+ children: [
125
+ bulleted && /*#__PURE__*/ jsx(LinkBullet, {
126
+ "aria-hidden": true
127
+ }),
128
+ /*#__PURE__*/ jsx(Typography, {
129
+ tag: "div",
130
+ lineHeight: "32px",
131
+ overflow: "hidden",
132
+ style: {
133
+ textOverflow: 'ellipsis',
134
+ whiteSpace: 'nowrap',
135
+ flex: 1,
136
+ minWidth: 0
137
+ },
138
+ children: label
139
+ })
140
+ ]
113
141
  }),
114
142
  /*#__PURE__*/ jsx(Flex, {
115
143
  gap: 2,
@@ -203,6 +231,64 @@ const Sections = ({ children, ...props })=>{
203
231
  };
204
232
  const Section = ({ label, children, link, sectionId, badgeLabel })=>{
205
233
  const listId = useId();
234
+ // Used to track the selection of an item within the popover menu (as opposed to a menu dismissal via escape, click outside, etc.)
235
+ const popoverMenuItemClicked = useRef(false);
236
+ const linkButton = useMemo(()=>{
237
+ if (!link) return;
238
+ if (!link.menu) {
239
+ return /*#__PURE__*/ jsx(GuidedTourTooltip, {
240
+ sectionId: sectionId,
241
+ children: /*#__PURE__*/ jsx(IconButton, {
242
+ onClick: link.onClick,
243
+ label: link.label,
244
+ variant: "ghost",
245
+ withTooltip: true,
246
+ size: "XS",
247
+ children: /*#__PURE__*/ jsx(Plus, {})
248
+ })
249
+ });
250
+ }
251
+ const onCloseMenuAutoFocus = (event)=>{
252
+ // If the result of a popover menu close deliberately shifts focus, the default Radix behavior (immediately restore focus on the popover's trigger element when the popover closes) would compete.
253
+ if (link.suppressFocusCaptureOnMenuClose && popoverMenuItemClicked.current) {
254
+ event.preventDefault();
255
+ }
256
+ popoverMenuItemClicked.current = false;
257
+ };
258
+ return /*#__PURE__*/ jsx(GuidedTourTooltip, {
259
+ sectionId: sectionId,
260
+ children: /*#__PURE__*/ jsxs(Menu.Root, {
261
+ children: [
262
+ /*#__PURE__*/ jsx(Menu.Trigger, {
263
+ label: link.label,
264
+ tag: IconButton,
265
+ icon: /*#__PURE__*/ jsx(Plus, {}),
266
+ variant: "ghost",
267
+ endIcon: null,
268
+ size: "XS"
269
+ }),
270
+ /*#__PURE__*/ jsx(Menu.Content, {
271
+ onCloseAutoFocus: onCloseMenuAutoFocus,
272
+ zIndex: 2,
273
+ children: link.menu.map((item)=>{
274
+ const onSelectMenuItem = ()=>{
275
+ popoverMenuItemClicked.current = true;
276
+ item.onSelect();
277
+ };
278
+ return /*#__PURE__*/ jsx(Menu.Item, {
279
+ onSelect: onSelectMenuItem,
280
+ startIcon: item.startIcon,
281
+ children: item.label
282
+ }, item.label);
283
+ })
284
+ })
285
+ ]
286
+ })
287
+ });
288
+ }, [
289
+ link,
290
+ sectionId
291
+ ]);
206
292
  return /*#__PURE__*/ jsxs(Flex, {
207
293
  direction: "column",
208
294
  alignItems: "stretch",
@@ -222,35 +308,26 @@ const Section = ({ label, children, link, sectionId, badgeLabel })=>{
222
308
  justifyContent: "space-between",
223
309
  gap: 2,
224
310
  children: [
225
- /*#__PURE__*/ jsx(Flex, {
226
- children: /*#__PURE__*/ jsx(Box, {
227
- children: /*#__PURE__*/ jsx(Typography, {
311
+ /*#__PURE__*/ jsxs(Flex, {
312
+ gap: 2,
313
+ alignItems: "center",
314
+ minWidth: 0,
315
+ children: [
316
+ /*#__PURE__*/ jsx(Typography, {
228
317
  variant: "sigma",
229
318
  textColor: "neutral600",
230
319
  children: label
231
- })
232
- })
233
- }),
234
- /*#__PURE__*/ jsxs(Flex, {
235
- gap: 1,
236
- children: [
320
+ }),
237
321
  badgeLabel && /*#__PURE__*/ jsx(Badge, {
238
322
  backgroundColor: "neutral150",
239
323
  textColor: "neutral600",
240
324
  children: badgeLabel
241
- }),
242
- link && /*#__PURE__*/ jsx(GuidedTourTooltip, {
243
- sectionId: sectionId,
244
- children: /*#__PURE__*/ jsx(IconButton, {
245
- label: link.label,
246
- variant: "ghost",
247
- withTooltip: true,
248
- onClick: link.onClick,
249
- size: "XS",
250
- children: /*#__PURE__*/ jsx(Plus, {})
251
- })
252
325
  })
253
326
  ]
327
+ }),
328
+ /*#__PURE__*/ jsx(Flex, {
329
+ gap: 1,
330
+ children: linkButton
254
331
  })
255
332
  ]
256
333
  })
@@ -398,6 +475,7 @@ const SubNav = {
398
475
  Sections,
399
476
  Section,
400
477
  SubSection,
478
+ Folder: SubNavFolder,
401
479
  PageWrapper
402
480
  };
403
481
 
@@ -1 +1 @@
1
- {"version":3,"file":"SubNav.mjs","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useEffect, useId, useRef, useState } from 'react';\n\nimport {\n Badge,\n Box,\n Flex,\n IconButton,\n ScrollArea,\n SubNav as DSSubNav,\n Typography,\n} from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport {\n HEIGHT_TOP_NAVIGATION,\n HEIGHT_TOP_NAVIGATION_MEDIUM,\n WIDTH_SIDE_NAVIGATION,\n} from '../constants/theme';\n\nimport { tours } from './GuidedTour/Tours';\n\nconst MainSubNav = styled(DSSubNav)<{ $isFullPage?: boolean }>`\n width: 100%;\n height: 100%;\n overflow: ${({ $isFullPage }) => ($isFullPage ? 'visible' : 'hidden')};\n background-color: ${({ theme }) => theme.colors.neutral0};\n display: flex;\n flex-direction: column;\n border-right: 0;\n box-shadow: none;\n position: relative;\n\n ${({ theme }) => theme.breakpoints.medium} {\n width: ${WIDTH_SIDE_NAVIGATION};\n position: sticky;\n top: 0;\n overflow: hidden;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n overscroll-behavior: contain;\n }\n`;\n\nconst Main = ({\n children,\n isFullPage,\n ...props\n}: {\n children: React.ReactNode;\n isFullPage?: boolean;\n}) => (\n <MainSubNav $isFullPage={isFullPage} {...props}>\n {children}\n </MainSubNav>\n);\n\nconst StyledLink = styled(NavLink)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label'> & {\n label: React.ReactNode;\n endAction?: React.ReactNode;\n handleClick?: () => void;\n }\n) => {\n const { label, endAction, handleClick, ...rest } = props;\n\n return (\n <StyledLink {...rest} onClick={handleClick}>\n <Box\n width={'100%'}\n paddingLeft={3}\n paddingRight={3}\n paddingTop={{ initial: 1, large: 0 }}\n paddingBottom={{ initial: 1, large: 0 }}\n borderRadius={1}\n >\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={{ initial: 2, large: 1 }}>\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n width={{ initial: '80dvw', medium: '100%' }}\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Flex)`\n flex: 0 0 ${HEIGHT_TOP_NAVIGATION};\n height: ${HEIGHT_TOP_NAVIGATION};\n\n ${({ theme }) => theme.breakpoints.medium} {\n flex: 0 0 ${HEIGHT_TOP_NAVIGATION_MEDIUM};\n height: ${HEIGHT_TOP_NAVIGATION_MEDIUM};\n }\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader justifyContent=\"space-between\" paddingLeft={5} paddingRight={5}>\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({\n children,\n ...props\n}: {\n children: React.ReactNode[];\n [key: string]: unknown;\n}) => {\n return (\n <Box\n paddingTop={{ initial: 5, large: 4 }}\n paddingBottom={{ initial: 5, large: 4 }}\n paddingLeft={{ initial: 3, large: 0 }}\n paddingRight={{ initial: 3, large: 0 }}\n maxWidth={{ initial: '100%', medium: WIDTH_SIDE_NAVIGATION }}\n >\n <Flex tag=\"ul\" gap={6} direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst GuidedTourTooltip = ({\n sectionId,\n children,\n}: {\n sectionId?: string;\n children: React.ReactNode;\n}) => {\n switch (sectionId) {\n case 'models':\n return (\n <tours.contentTypeBuilder.CollectionTypes>\n <tours.contentTypeBuilder.YourTurn>{children}</tours.contentTypeBuilder.YourTurn>\n </tours.contentTypeBuilder.CollectionTypes>\n );\n case 'singleTypes':\n return (\n <tours.contentTypeBuilder.SingleTypes>{children}</tours.contentTypeBuilder.SingleTypes>\n );\n case 'components':\n return <tours.contentTypeBuilder.Components>{children}</tours.contentTypeBuilder.Components>;\n default:\n return children;\n }\n};\n\nconst Section = ({\n label,\n children,\n link,\n sectionId,\n badgeLabel,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: { label: string; onClick: () => void };\n sectionId?: string;\n badgeLabel?: string;\n}) => {\n const listId = useId();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box\n paddingLeft={{\n initial: 3,\n large: 5,\n }}\n paddingRight={{\n initial: 3,\n large: 5,\n }}\n >\n <Flex position=\"relative\" justifyContent=\"space-between\" gap={2}>\n <Flex>\n <Box>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Box>\n </Flex>\n <Flex gap={1}>\n {badgeLabel && (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\">\n {badgeLabel}\n </Badge>\n )}\n {link && (\n <GuidedTourTooltip sectionId={sectionId}>\n <IconButton\n label={link.label}\n variant=\"ghost\"\n withTooltip\n onClick={link.onClick}\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n )}\n </Flex>\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap={{ initial: 2, large: '2px' }}\n alignItems={'stretch'}\n marginLeft={{\n initial: 0,\n large: 2,\n }}\n marginRight={{\n initial: 0,\n large: 2,\n }}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const [contentHeight, setContentHeight] = useState(0);\n const listId = useId();\n const contentRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n if (contentRef.current) {\n setContentHeight(contentRef.current.scrollHeight);\n }\n }, [children]);\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n <Flex\n ref={contentRef}\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? `${contentHeight}px` : 0,\n overflow: 'hidden',\n transition: 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n </Box>\n );\n};\n\nconst PageWrapper = styled(Box)`\n width: 100%;\n\n ${MainSubNav} {\n background-color: transparent;\n border-right: none;\n }\n\n ${({ theme }) => theme.breakpoints.medium} {\n overflow: hidden;\n\n ${MainSubNav} {\n top: 0;\n }\n }\n`;\n\nconst Content = ({ children }: { children: React.ReactNode }) => {\n return <ScrollArea>{children}</ScrollArea>;\n};\n\nexport const SubNav = {\n Main,\n Content,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n PageWrapper,\n};\n"],"names":["MainSubNav","styled","DSSubNav","$isFullPage","theme","colors","neutral0","breakpoints","medium","WIDTH_SIDE_NAVIGATION","neutral150","Main","children","isFullPage","props","_jsx","StyledLink","NavLink","neutral800","primary100","primary700","neutral100","Link","label","endAction","handleClick","rest","onClick","Box","width","paddingLeft","paddingRight","paddingTop","initial","large","paddingBottom","borderRadius","_jsxs","Flex","justifyContent","gap","Typography","tag","lineHeight","overflow","style","textOverflow","whiteSpace","StyledHeader","HEIGHT_TOP_NAVIGATION","HEIGHT_TOP_NAVIGATION_MEDIUM","Header","variant","Sections","maxWidth","direction","alignItems","map","child","index","li","GuidedTourTooltip","sectionId","tours","contentTypeBuilder","CollectionTypes","YourTurn","SingleTypes","Components","Section","link","badgeLabel","listId","useId","position","textColor","Badge","backgroundColor","IconButton","withTooltip","size","Plus","id","marginLeft","marginRight","SubSectionHeader","button","spaces","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","contentHeight","setContentHeight","contentRef","useRef","useEffect","current","scrollHeight","prev","aria-expanded","aria-controls","ChevronDown","aria-hidden","fill","transform","transition","fontWeight","ref","maxHeight","PageWrapper","Content","ScrollArea","SubNav"],"mappings":"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"}
1
+ {"version":3,"file":"SubNav.mjs","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useEffect, useId, useRef, useState, useMemo } from 'react';\n\nimport {\n Badge,\n Box,\n Flex,\n IconButton,\n Menu,\n ScrollArea,\n SubNav as DSSubNav,\n Typography,\n} from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport {\n HEIGHT_TOP_NAVIGATION,\n HEIGHT_TOP_NAVIGATION_MEDIUM,\n WIDTH_SIDE_NAVIGATION,\n} from '../constants/theme';\n\nimport { tours } from './GuidedTour/Tours';\nimport { SubNavFolder } from './SubNavFolder';\n\nconst MainSubNav = styled(DSSubNav)<{ $isFullPage?: boolean }>`\n width: 100%;\n height: 100%;\n overflow: ${({ $isFullPage }) => ($isFullPage ? 'visible' : 'hidden')};\n background-color: ${({ theme }) => theme.colors.neutral0};\n display: flex;\n flex-direction: column;\n border-right: 0;\n box-shadow: none;\n position: relative;\n\n ${({ theme }) => theme.breakpoints.medium} {\n width: ${WIDTH_SIDE_NAVIGATION};\n position: sticky;\n top: 0;\n overflow: hidden;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n overscroll-behavior: contain;\n }\n`;\n\nconst Main = ({\n children,\n isFullPage,\n ...props\n}: {\n children: React.ReactNode;\n isFullPage?: boolean;\n}) => (\n <MainSubNav $isFullPage={isFullPage} {...props}>\n {children}\n </MainSubNav>\n);\n\nconst StyledLink = styled(NavLink)<{ $depth?: number }>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n & > div {\n padding-left: ${({ theme, $depth = 0 }) =>\n `calc(${$depth} * ${theme.spaces[6]} + ${theme.spaces[3]})`};\n }\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst LinkBullet = styled.span`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 16px;\n\n &::before {\n content: '';\n width: 4px;\n height: 4px;\n border-radius: 50%;\n background-color: currentColor;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label' | '$depth'> & {\n endAction?: React.ReactNode;\n handleClick?: () => void;\n label: React.ReactNode;\n depth?: number;\n bulleted?: boolean;\n }\n) => {\n const { label, endAction, handleClick, depth, bulleted = false, ...rest } = props;\n\n return (\n <StyledLink {...rest} $depth={depth} onClick={handleClick}>\n <Box\n width={'100%'}\n paddingRight={3}\n paddingTop={{ initial: 1, large: 0 }}\n paddingBottom={{ initial: 1, large: 0 }}\n borderRadius={1}\n >\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={{ initial: 2, large: 1 }}>\n <Flex gap={2} flex=\"1\" minWidth=\"0\" alignItems=\"center\">\n {bulleted && <LinkBullet aria-hidden />}\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap', flex: 1, minWidth: 0 }}\n >\n {label}\n </Typography>\n </Flex>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Flex)`\n flex: 0 0 ${HEIGHT_TOP_NAVIGATION};\n height: ${HEIGHT_TOP_NAVIGATION};\n\n ${({ theme }) => theme.breakpoints.medium} {\n flex: 0 0 ${HEIGHT_TOP_NAVIGATION_MEDIUM};\n height: ${HEIGHT_TOP_NAVIGATION_MEDIUM};\n }\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader justifyContent=\"space-between\" paddingLeft={5} paddingRight={5}>\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({\n children,\n ...props\n}: {\n children: React.ReactNode[];\n [key: string]: unknown;\n}) => {\n return (\n <Box\n paddingTop={{ initial: 5, large: 4 }}\n paddingBottom={{ initial: 5, large: 4 }}\n paddingLeft={{ initial: 3, large: 0 }}\n paddingRight={{ initial: 3, large: 0 }}\n maxWidth={{ initial: '100%', medium: WIDTH_SIDE_NAVIGATION }}\n >\n <Flex tag=\"ul\" gap={6} direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst GuidedTourTooltip = ({\n sectionId,\n children,\n}: {\n sectionId?: string;\n children: React.ReactNode;\n}) => {\n switch (sectionId) {\n case 'models':\n return (\n <tours.contentTypeBuilder.CollectionTypes>\n <tours.contentTypeBuilder.YourTurn>{children}</tours.contentTypeBuilder.YourTurn>\n </tours.contentTypeBuilder.CollectionTypes>\n );\n case 'singleTypes':\n return (\n <tours.contentTypeBuilder.SingleTypes>{children}</tours.contentTypeBuilder.SingleTypes>\n );\n case 'components':\n return <tours.contentTypeBuilder.Components>{children}</tours.contentTypeBuilder.Components>;\n default:\n return children;\n }\n};\n\ntype SectionMenuItem = {\n startIcon?: React.ReactNode;\n onSelect: () => void;\n label: string;\n};\n\ntype SectionLink = {\n label: string;\n onClick?: () => void;\n menu?: SectionMenuItem[];\n /**\n * This suppresses the default behavior, where input focus returns to the \"+\" trigger when the popover closes.\n * This allows popover actions to change the focused element without it being immediately undone.\n */\n suppressFocusCaptureOnMenuClose?: boolean;\n};\n\nconst Section = ({\n label,\n children,\n link,\n sectionId,\n badgeLabel,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: SectionLink;\n sectionId?: string;\n badgeLabel?: string;\n}) => {\n const listId = useId();\n\n // Used to track the selection of an item within the popover menu (as opposed to a menu dismissal via escape, click outside, etc.)\n const popoverMenuItemClicked = useRef(false);\n\n const linkButton = useMemo(() => {\n if (!link) return;\n\n if (!link.menu) {\n return (\n <GuidedTourTooltip sectionId={sectionId}>\n <IconButton\n onClick={link.onClick}\n label={link.label}\n variant=\"ghost\"\n withTooltip\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n );\n }\n\n const onCloseMenuAutoFocus = (event: Event): void => {\n // If the result of a popover menu close deliberately shifts focus, the default Radix behavior (immediately restore focus on the popover's trigger element when the popover closes) would compete.\n if (link.suppressFocusCaptureOnMenuClose && popoverMenuItemClicked.current) {\n event.preventDefault();\n }\n\n popoverMenuItemClicked.current = false;\n };\n\n return (\n <GuidedTourTooltip sectionId={sectionId}>\n <Menu.Root>\n <Menu.Trigger\n label={link.label}\n tag={IconButton}\n icon={<Plus />}\n variant=\"ghost\"\n endIcon={null}\n size=\"XS\"\n />\n <Menu.Content onCloseAutoFocus={onCloseMenuAutoFocus} zIndex={2}>\n {link.menu.map((item) => {\n const onSelectMenuItem = () => {\n popoverMenuItemClicked.current = true;\n item.onSelect();\n };\n\n return (\n <Menu.Item onSelect={onSelectMenuItem} startIcon={item.startIcon} key={item.label}>\n {item.label}\n </Menu.Item>\n );\n })}\n </Menu.Content>\n </Menu.Root>\n </GuidedTourTooltip>\n );\n }, [link, sectionId]);\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box\n paddingLeft={{\n initial: 3,\n large: 5,\n }}\n paddingRight={{\n initial: 3,\n large: 5,\n }}\n >\n <Flex position=\"relative\" justifyContent=\"space-between\" gap={2}>\n <Flex gap={2} alignItems=\"center\" minWidth={0}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n {badgeLabel && (\n <Badge backgroundColor=\"neutral150\" textColor=\"neutral600\">\n {badgeLabel}\n </Badge>\n )}\n </Flex>\n <Flex gap={1}>{linkButton}</Flex>\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap={{ initial: 2, large: '2px' }}\n alignItems={'stretch'}\n marginLeft={{\n initial: 0,\n large: 2,\n }}\n marginRight={{\n initial: 0,\n large: 2,\n }}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const [contentHeight, setContentHeight] = useState(0);\n const listId = useId();\n const contentRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n if (contentRef.current) {\n setContentHeight(contentRef.current.scrollHeight);\n }\n }, [children]);\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n <Flex\n ref={contentRef}\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? `${contentHeight}px` : 0,\n overflow: 'hidden',\n transition: 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n </Box>\n );\n};\n\nconst PageWrapper = styled(Box)`\n width: 100%;\n\n ${MainSubNav} {\n background-color: transparent;\n border-right: none;\n }\n\n ${({ theme }) => theme.breakpoints.medium} {\n overflow: hidden;\n\n ${MainSubNav} {\n top: 0;\n }\n }\n`;\n\nconst Content = ({ children }: { children: React.ReactNode }) => {\n return <ScrollArea>{children}</ScrollArea>;\n};\n\nexport const SubNav = {\n Main,\n Content,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n Folder: SubNavFolder,\n PageWrapper,\n};\n"],"names":["MainSubNav","styled","DSSubNav","$isFullPage","theme","colors","neutral0","breakpoints","medium","WIDTH_SIDE_NAVIGATION","neutral150","Main","children","isFullPage","props","_jsx","StyledLink","NavLink","neutral800","$depth","spaces","primary100","primary700","neutral100","LinkBullet","span","Link","label","endAction","handleClick","depth","bulleted","rest","onClick","Box","width","paddingRight","paddingTop","initial","large","paddingBottom","borderRadius","_jsxs","Flex","justifyContent","gap","flex","minWidth","alignItems","aria-hidden","Typography","tag","lineHeight","overflow","style","textOverflow","whiteSpace","StyledHeader","HEIGHT_TOP_NAVIGATION","HEIGHT_TOP_NAVIGATION_MEDIUM","Header","paddingLeft","variant","Sections","maxWidth","direction","map","child","index","li","GuidedTourTooltip","sectionId","tours","contentTypeBuilder","CollectionTypes","YourTurn","SingleTypes","Components","Section","link","badgeLabel","listId","useId","popoverMenuItemClicked","useRef","linkButton","useMemo","menu","IconButton","withTooltip","size","Plus","onCloseMenuAutoFocus","event","suppressFocusCaptureOnMenuClose","current","preventDefault","Menu","Root","Trigger","icon","endIcon","Content","onCloseAutoFocus","zIndex","item","onSelectMenuItem","onSelect","Item","startIcon","position","textColor","Badge","backgroundColor","id","marginLeft","marginRight","SubSectionHeader","button","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","contentHeight","setContentHeight","contentRef","useEffect","scrollHeight","prev","aria-expanded","aria-controls","ChevronDown","fill","transform","transition","fontWeight","ref","maxHeight","PageWrapper","ScrollArea","SubNav","Folder","SubNavFolder"],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var designSystem = require('@strapi/design-system');
6
+ var icons = require('@strapi/icons');
7
+ var styledComponents = require('styled-components');
8
+
9
+ const ANIMATION_DURATION = '0.5s';
10
+ const COLLAPSE_EASING = 'cubic-bezier(0, 1, 0, 1)';
11
+ const FolderRow = styledComponents.styled(designSystem.Flex)`
12
+ border-radius: ${({ theme })=>theme.borderRadius};
13
+
14
+ padding-right: ${({ theme })=>theme.spaces[3]};
15
+
16
+ padding-left: ${({ theme, $depth })=>`calc(${$depth} * ${theme.spaces[6]} + ${theme.spaces[3]})`};
17
+
18
+ background-color: ${({ $isDropTarget, theme })=>$isDropTarget ? theme.colors.primary100 : 'transparent'};
19
+ outline: ${({ $isDropTarget, theme })=>$isDropTarget ? `1px solid ${theme.colors.primary600}` : 'none'};
20
+ outline-offset: -1px;
21
+
22
+ &:hover {
23
+ background-color: ${({ $isDropTarget, theme })=>$isDropTarget ? theme.colors.primary100 : theme.colors.neutral100};
24
+ }
25
+ `;
26
+ const ToggleButton = styledComponents.styled.button`
27
+ gap: ${({ theme })=>theme.spaces[2]};
28
+ align-items: center;
29
+ display: flex;
30
+ flex: 1;
31
+
32
+ padding-block: ${({ theme })=>theme.spaces[2]};
33
+ padding-inline: 0;
34
+
35
+ min-width: 0;
36
+
37
+ background: transparent;
38
+ border: none;
39
+
40
+ text-align: left;
41
+ cursor: pointer;
42
+
43
+ &:focus-visible {
44
+ outline-offset: -2px;
45
+ }
46
+ `;
47
+ const EndActionWrapper = styledComponents.styled(designSystem.Flex)`
48
+ flex-shrink: 0;
49
+ opacity: 0;
50
+ transition: opacity 0.1s ease-out;
51
+
52
+ ${FolderRow}:hover &,
53
+ ${FolderRow}:focus-within & {
54
+ opacity: 1;
55
+ }
56
+ `;
57
+ const Collapsible = styledComponents.styled.div`
58
+ grid-template-rows: ${({ $open })=>$open ? '1fr' : '0fr'};
59
+ display: grid;
60
+
61
+ transition: grid-template-rows ${ANIMATION_DURATION} ${COLLAPSE_EASING};
62
+ `;
63
+ const CollapsibleInner = styledComponents.styled.div`
64
+ overflow: hidden;
65
+ min-height: 0;
66
+ `;
67
+ const FolderView = ({ onToggleClick, isDropTarget, endAction, children, rowRef, label, depth, open })=>{
68
+ const listId = React.useId();
69
+ const [isLabelTruncated, setIsLabelTruncated] = React.useState(false);
70
+ const resizeObserverRef = React.useRef(null);
71
+ // A callback ref (rather than useRef + useEffect) so measurement survives the label
72
+ // element remounting when it moves in and out of the Tooltip wrapper below.
73
+ const measureLabelRef = React.useCallback((node)=>{
74
+ if (resizeObserverRef.current) {
75
+ resizeObserverRef.current.disconnect();
76
+ resizeObserverRef.current = null;
77
+ }
78
+ if (!node) {
79
+ return;
80
+ }
81
+ const measure = ()=>{
82
+ setIsLabelTruncated(node.scrollWidth > node.clientWidth);
83
+ };
84
+ measure();
85
+ if (typeof ResizeObserver === 'undefined') {
86
+ return;
87
+ }
88
+ resizeObserverRef.current = new ResizeObserver(measure);
89
+ resizeObserverRef.current.observe(node);
90
+ }, []);
91
+ const applyInertWhenClosed = React.useCallback((node)=>{
92
+ if (!node) {
93
+ return;
94
+ }
95
+ if (open) {
96
+ node.removeAttribute('inert');
97
+ } else {
98
+ node.setAttribute('inert', '');
99
+ }
100
+ }, [
101
+ open
102
+ ]);
103
+ const labelTypography = /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
104
+ textColor: "neutral800",
105
+ fontWeight: "semiBold",
106
+ ref: measureLabelRef,
107
+ overflow: "hidden",
108
+ tag: "span",
109
+ style: {
110
+ flex: 1,
111
+ minWidth: 0,
112
+ textOverflow: 'ellipsis',
113
+ whiteSpace: 'nowrap'
114
+ },
115
+ children: label
116
+ });
117
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
118
+ children: [
119
+ /*#__PURE__*/ jsxRuntime.jsxs(FolderRow, {
120
+ ref: rowRef,
121
+ $depth: depth,
122
+ $isDropTarget: isDropTarget,
123
+ alignItems: "center",
124
+ children: [
125
+ /*#__PURE__*/ jsxRuntime.jsxs(ToggleButton, {
126
+ onClick: onToggleClick,
127
+ "aria-controls": listId,
128
+ "aria-expanded": open,
129
+ type: "button",
130
+ children: [
131
+ /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {
132
+ fill: "neutral500",
133
+ "aria-hidden": true,
134
+ style: {
135
+ transform: `rotate(${open ? '0deg' : '-90deg'})`,
136
+ transition: `transform ${ANIMATION_DURATION}`,
137
+ flexShrink: 0
138
+ }
139
+ }),
140
+ isLabelTruncated ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Tooltip, {
141
+ label: label,
142
+ children: labelTypography
143
+ }) : labelTypography
144
+ ]
145
+ }),
146
+ endAction != null && /*#__PURE__*/ jsxRuntime.jsx(EndActionWrapper, {
147
+ gap: 2,
148
+ alignItems: "center",
149
+ children: endAction
150
+ })
151
+ ]
152
+ }),
153
+ /*#__PURE__*/ jsxRuntime.jsx(Collapsible, {
154
+ $open: open,
155
+ id: listId,
156
+ children: /*#__PURE__*/ jsxRuntime.jsx(CollapsibleInner, {
157
+ ref: applyInertWhenClosed,
158
+ children: children
159
+ })
160
+ })
161
+ ]
162
+ });
163
+ };
164
+ const SubNavFolder = ({ defaultOpen = false, open: openProp, isDropTarget, endAction, children, onToggle, rowRef, label, depth = 0 })=>{
165
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);
166
+ const isControlled = openProp !== undefined;
167
+ const open = isControlled ? openProp : uncontrolledOpen;
168
+ const handleToggleClick = ()=>{
169
+ const next = !open;
170
+ if (!isControlled) {
171
+ setUncontrolledOpen(next);
172
+ }
173
+ onToggle?.(next);
174
+ };
175
+ return /*#__PURE__*/ jsxRuntime.jsx(FolderView, {
176
+ onToggleClick: handleToggleClick,
177
+ isDropTarget: isDropTarget,
178
+ endAction: endAction,
179
+ rowRef: rowRef,
180
+ label: label,
181
+ depth: depth,
182
+ open: open,
183
+ children: children
184
+ });
185
+ };
186
+
187
+ exports.SubNavFolder = SubNavFolder;
188
+ //# sourceMappingURL=SubNavFolder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubNavFolder.js","sources":["../../../../../admin/src/components/SubNavFolder.tsx"],"sourcesContent":["import { useCallback, useId, useRef, useState } from 'react';\n\nimport { Box, Flex, Tooltip, Typography } from '@strapi/design-system';\nimport { ChevronDown } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nconst ANIMATION_DURATION = '0.5s';\nconst COLLAPSE_EASING = 'cubic-bezier(0, 1, 0, 1)';\n\ninterface SubNavFolderProps {\n label: string;\n depth?: number;\n open?: boolean;\n defaultOpen?: boolean;\n onToggle?: (open: boolean) => void;\n endAction?: React.ReactNode;\n /** Ref attached to the row element used as a drag-and-drop drop target. */\n rowRef?: React.Ref<HTMLDivElement>;\n isDropTarget?: boolean;\n children?: React.ReactNode;\n}\n\nconst FolderRow = styled(Flex)<{ $depth: number; $isDropTarget?: boolean }>`\n border-radius: ${({ theme }) => theme.borderRadius};\n\n padding-right: ${({ theme }) => theme.spaces[3]};\n\n padding-left: ${({ theme, $depth }) =>\n `calc(${$depth} * ${theme.spaces[6]} + ${theme.spaces[3]})`};\n\n background-color: ${({ $isDropTarget, theme }) =>\n $isDropTarget ? theme.colors.primary100 : 'transparent'};\n outline: ${({ $isDropTarget, theme }) =>\n $isDropTarget ? `1px solid ${theme.colors.primary600}` : 'none'};\n outline-offset: -1px;\n\n &:hover {\n background-color: ${({ $isDropTarget, theme }) =>\n $isDropTarget ? theme.colors.primary100 : theme.colors.neutral100};\n }\n`;\n\nconst ToggleButton = styled.button`\n gap: ${({ theme }) => theme.spaces[2]};\n align-items: center;\n display: flex;\n flex: 1;\n\n padding-block: ${({ theme }) => theme.spaces[2]};\n padding-inline: 0;\n\n min-width: 0;\n\n background: transparent;\n border: none;\n\n text-align: left;\n cursor: pointer;\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst EndActionWrapper = styled(Flex)`\n flex-shrink: 0;\n opacity: 0;\n transition: opacity 0.1s ease-out;\n\n ${FolderRow}:hover &,\n ${FolderRow}:focus-within & {\n opacity: 1;\n }\n`;\n\nconst Collapsible = styled.div<{ $open: boolean }>`\n grid-template-rows: ${({ $open }) => ($open ? '1fr' : '0fr')};\n display: grid;\n\n transition: grid-template-rows ${ANIMATION_DURATION} ${COLLAPSE_EASING};\n`;\n\nconst CollapsibleInner = styled.div`\n overflow: hidden;\n min-height: 0;\n`;\n\ninterface FolderViewProps {\n rowRef?: React.Ref<HTMLDivElement>;\n endAction?: React.ReactNode;\n children?: React.ReactNode;\n onToggleClick: () => void;\n isDropTarget?: boolean;\n label: string;\n depth: number;\n open: boolean;\n}\n\nconst FolderView = ({\n onToggleClick,\n isDropTarget,\n endAction,\n children,\n rowRef,\n label,\n depth,\n open,\n}: FolderViewProps) => {\n const listId = useId();\n\n const [isLabelTruncated, setIsLabelTruncated] = useState(false);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n\n // A callback ref (rather than useRef + useEffect) so measurement survives the label\n // element remounting when it moves in and out of the Tooltip wrapper below.\n const measureLabelRef = useCallback((node: HTMLElement | null) => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n\n if (!node) {\n return;\n }\n\n const measure = () => {\n setIsLabelTruncated(node.scrollWidth > node.clientWidth);\n };\n\n measure();\n\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n resizeObserverRef.current = new ResizeObserver(measure);\n resizeObserverRef.current.observe(node);\n }, []);\n\n const applyInertWhenClosed = useCallback(\n (node: HTMLDivElement | null) => {\n if (!node) {\n return;\n }\n\n if (open) {\n node.removeAttribute('inert');\n } else {\n node.setAttribute('inert', '');\n }\n },\n [open]\n );\n\n const labelTypography = (\n <Typography\n textColor=\"neutral800\"\n fontWeight=\"semiBold\"\n ref={measureLabelRef}\n overflow=\"hidden\"\n tag=\"span\"\n style={{ flex: 1, minWidth: 0, textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n );\n\n return (\n <Box>\n <FolderRow ref={rowRef} $depth={depth} $isDropTarget={isDropTarget} alignItems=\"center\">\n <ToggleButton\n onClick={onToggleClick}\n aria-controls={listId}\n aria-expanded={open}\n type=\"button\"\n >\n <ChevronDown\n fill=\"neutral500\"\n aria-hidden\n style={{\n transform: `rotate(${open ? '0deg' : '-90deg'})`,\n transition: `transform ${ANIMATION_DURATION}`,\n flexShrink: 0,\n }}\n />\n {isLabelTruncated ? <Tooltip label={label}>{labelTypography}</Tooltip> : labelTypography}\n </ToggleButton>\n {endAction != null && (\n <EndActionWrapper gap={2} alignItems=\"center\">\n {endAction}\n </EndActionWrapper>\n )}\n </FolderRow>\n <Collapsible $open={open} id={listId}>\n <CollapsibleInner ref={applyInertWhenClosed}>{children}</CollapsibleInner>\n </Collapsible>\n </Box>\n );\n};\n\nconst SubNavFolder = ({\n defaultOpen = false,\n open: openProp,\n isDropTarget,\n endAction,\n children,\n onToggle,\n rowRef,\n label,\n depth = 0,\n}: SubNavFolderProps) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : uncontrolledOpen;\n\n const handleToggleClick = () => {\n const next = !open;\n\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n\n onToggle?.(next);\n };\n\n return (\n <FolderView\n onToggleClick={handleToggleClick}\n isDropTarget={isDropTarget}\n endAction={endAction}\n rowRef={rowRef}\n label={label}\n depth={depth}\n open={open}\n >\n {children}\n </FolderView>\n );\n};\n\nexport { SubNavFolder };\nexport type { SubNavFolderProps };\n"],"names":["ANIMATION_DURATION","COLLAPSE_EASING","FolderRow","styled","Flex","theme","borderRadius","spaces","$depth","$isDropTarget","colors","primary100","primary600","neutral100","ToggleButton","button","EndActionWrapper","Collapsible","div","$open","CollapsibleInner","FolderView","onToggleClick","isDropTarget","endAction","children","rowRef","label","depth","open","listId","useId","isLabelTruncated","setIsLabelTruncated","useState","resizeObserverRef","useRef","measureLabelRef","useCallback","node","current","disconnect","measure","scrollWidth","clientWidth","ResizeObserver","observe","applyInertWhenClosed","removeAttribute","setAttribute","labelTypography","_jsx","Typography","textColor","fontWeight","ref","overflow","tag","style","flex","minWidth","textOverflow","whiteSpace","_jsxs","Box","alignItems","onClick","aria-controls","aria-expanded","type","ChevronDown","fill","aria-hidden","transform","transition","flexShrink","Tooltip","gap","id","SubNavFolder","defaultOpen","openProp","onToggle","uncontrolledOpen","setUncontrolledOpen","isControlled","undefined","handleToggleClick","next"],"mappings":"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"}