@strapi/content-type-builder 5.58.0 → 5.59.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 (126) hide show
  1. package/dist/admin/components/AIChat/FeedbackModal.js +13 -7
  2. package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -1
  3. package/dist/admin/components/AIChat/FeedbackModal.mjs +14 -8
  4. package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -1
  5. package/dist/admin/components/AIChat/UploadCodeModal.js +12 -6
  6. package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -1
  7. package/dist/admin/components/AIChat/UploadCodeModal.mjs +13 -7
  8. package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -1
  9. package/dist/admin/components/AIChat/UploadFigmaModal.js +12 -6
  10. package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -1
  11. package/dist/admin/components/AIChat/UploadFigmaModal.mjs +13 -7
  12. package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -1
  13. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +6 -3
  14. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -1
  15. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +7 -4
  16. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -1
  17. package/dist/admin/components/AIChat/components/Collapsible.js +9 -4
  18. package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -1
  19. package/dist/admin/components/AIChat/components/Collapsible.mjs +10 -5
  20. package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -1
  21. package/dist/admin/components/AIChat/components/Dropzone.js +13 -6
  22. package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -1
  23. package/dist/admin/components/AIChat/components/Dropzone.mjs +14 -7
  24. package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -1
  25. package/dist/admin/components/AIChat/components/FloatingPanel.js +11 -4
  26. package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -1
  27. package/dist/admin/components/AIChat/components/FloatingPanel.mjs +12 -5
  28. package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -1
  29. package/dist/admin/components/AIChat/components/FullScreenImage.js +16 -8
  30. package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -1
  31. package/dist/admin/components/AIChat/components/FullScreenImage.mjs +17 -9
  32. package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -1
  33. package/dist/admin/components/AIChat/components/Input.js +6 -3
  34. package/dist/admin/components/AIChat/components/Input.js.map +1 -1
  35. package/dist/admin/components/AIChat/components/Input.mjs +7 -4
  36. package/dist/admin/components/AIChat/components/Input.mjs.map +1 -1
  37. package/dist/admin/components/AIChat/components/Messages/Message.js +88 -12
  38. package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
  39. package/dist/admin/components/AIChat/components/Messages/Message.mjs +87 -13
  40. package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -1
  41. package/dist/admin/components/AIChat/components/StepModal.js +44 -17
  42. package/dist/admin/components/AIChat/components/StepModal.js.map +1 -1
  43. package/dist/admin/components/AIChat/components/StepModal.mjs +45 -18
  44. package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -1
  45. package/dist/admin/components/AIChat/providers/ChatProvider.js +79 -27
  46. package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -1
  47. package/dist/admin/components/AIChat/providers/ChatProvider.mjs +80 -28
  48. package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -1
  49. package/dist/admin/components/AIChat/providers/SchemaProvider.js +6 -3
  50. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
  51. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +7 -4
  52. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
  53. package/dist/admin/components/AttributeOptions/AttributeOption.js +2 -2
  54. package/dist/admin/components/AttributeOptions/AttributeOption.js.map +1 -1
  55. package/dist/admin/components/AttributeOptions/AttributeOption.mjs +2 -2
  56. package/dist/admin/components/AttributeOptions/AttributeOption.mjs.map +1 -1
  57. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -1
  58. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -1
  59. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -1
  60. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -1
  61. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js +2 -1
  62. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js.map +1 -1
  63. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs +2 -1
  64. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs.map +1 -1
  65. package/dist/admin/components/DataManager/DataManagerProvider.js +317 -275
  66. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  67. package/dist/admin/components/DataManager/DataManagerProvider.mjs +319 -277
  68. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  69. package/dist/admin/components/DataManager/RenameMigrationModal.js.map +1 -1
  70. package/dist/admin/components/DataManager/RenameMigrationModal.mjs.map +1 -1
  71. package/dist/admin/components/DataManager/reducer.js +31 -4
  72. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  73. package/dist/admin/components/DataManager/reducer.mjs +31 -4
  74. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  75. package/dist/admin/components/DynamicZoneList.js +2 -1
  76. package/dist/admin/components/DynamicZoneList.js.map +1 -1
  77. package/dist/admin/components/DynamicZoneList.mjs +2 -1
  78. package/dist/admin/components/DynamicZoneList.mjs.map +1 -1
  79. package/dist/admin/components/FormModal/attributes/ConditionForm.js +2 -1
  80. package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
  81. package/dist/admin/components/FormModal/attributes/ConditionForm.mjs +2 -1
  82. package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
  83. package/dist/admin/components/FormModal/attributes/types.js +2 -2
  84. package/dist/admin/components/FormModal/attributes/types.js.map +1 -1
  85. package/dist/admin/components/FormModal/attributes/types.mjs +2 -2
  86. package/dist/admin/components/FormModal/attributes/types.mjs.map +1 -1
  87. package/dist/admin/components/FormModal/forms/forms.js +1 -1
  88. package/dist/admin/components/FormModal/forms/forms.js.map +1 -1
  89. package/dist/admin/components/FormModal/forms/forms.mjs +1 -1
  90. package/dist/admin/components/FormModal/forms/forms.mjs.map +1 -1
  91. package/dist/admin/components/GenericInputs.js +2 -1
  92. package/dist/admin/components/GenericInputs.js.map +1 -1
  93. package/dist/admin/components/GenericInputs.mjs +2 -1
  94. package/dist/admin/components/GenericInputs.mjs.map +1 -1
  95. package/dist/admin/components/TabForm.js.map +1 -1
  96. package/dist/admin/components/TabForm.mjs.map +1 -1
  97. package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +8 -0
  98. package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +20 -0
  99. package/dist/admin/utils/folderTelemetry.js.map +1 -1
  100. package/dist/admin/utils/folderTelemetry.mjs.map +1 -1
  101. package/dist/admin/utils/formAPI.js.map +1 -1
  102. package/dist/admin/utils/formAPI.mjs.map +1 -1
  103. package/dist/server/controllers/validation/schema.js +3 -2
  104. package/dist/server/controllers/validation/schema.js.map +1 -1
  105. package/dist/server/controllers/validation/schema.mjs +4 -3
  106. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  107. package/dist/server/register.js.map +1 -1
  108. package/dist/server/register.mjs.map +1 -1
  109. package/dist/server/services/migration-builder/index.js.map +1 -1
  110. package/dist/server/services/migration-builder/index.mjs.map +1 -1
  111. package/dist/server/services/schema.js +34 -1
  112. package/dist/server/services/schema.js.map +1 -1
  113. package/dist/server/services/schema.mjs +34 -1
  114. package/dist/server/services/schema.mjs.map +1 -1
  115. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  116. package/dist/server/src/register.d.ts.map +1 -1
  117. package/dist/server/src/services/migration-builder/index.d.ts.map +1 -1
  118. package/dist/server/src/services/schema-builder/types.d.ts.map +1 -1
  119. package/dist/server/src/services/schema.d.ts.map +1 -1
  120. package/dist/server/src/utils/uid-target.d.ts +18 -0
  121. package/dist/server/src/utils/uid-target.d.ts.map +1 -0
  122. package/dist/server/utils/uid-target.js +34 -0
  123. package/dist/server/utils/uid-target.js.map +1 -0
  124. package/dist/server/utils/uid-target.mjs +31 -0
  125. package/dist/server/utils/uid-target.mjs.map +1 -0
  126. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"Attachment.mjs","sources":["../../../../../../../admin/src/components/AIChat/components/Attachments/components/Attachment.tsx"],"sourcesContent":["import { ReactNode, createContext, useContext } from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { Trash, WarningCircle } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentContextValue {\n error?: string | null;\n}\n\nconst AttachmentContext = createContext<AttachmentContextValue>({ error: null });\n\nconst useAttachmentContext = () => useContext(AttachmentContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Root\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AttachmentRootProps {\n children: ReactNode;\n error?: string | null;\n minWidth?: string;\n maxWidth?: string;\n}\n\nconst StyledRoot = styled(Box)`\n &:hover {\n cursor: pointer;\n background: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\n// TODO: How to make this a button instead?\nconst Root = ({ children, error = null, minWidth, maxWidth }: AttachmentRootProps) => {\n return (\n <AttachmentContext.Provider value={{ error }}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n gap={2}\n minWidth={minWidth}\n maxWidth={maxWidth}\n >\n <StyledRoot\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n padding={2}\n width=\"100%\"\n >\n <Flex gap={2}>{children}</Flex>\n </StyledRoot>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger500\">\n {error}\n </Typography>\n )}\n </Flex>\n </AttachmentContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Preview\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentPreviewProps {\n children: ReactNode;\n}\n\nconst Preview = ({ children }: AttachmentPreviewProps) => {\n const { error } = useAttachmentContext();\n\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\">\n {error ? <WarningCircle fill=\"danger500\" /> : children}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Title\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentTitleProps {\n children: ReactNode;\n}\n\nconst Title = ({ children }: AttachmentTitleProps) => {\n return (\n <Box grow={1}>\n <Typography variant=\"omega\" ellipsis style={{ userSelect: 'none', maxWidth: '100px' }}>\n {children}\n </Typography>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Remove\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentRemoveProps {\n onClick: () => void;\n}\n\nconst Remove = ({ onClick }: AttachmentRemoveProps) => {\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\" shrink={0} onClick={onClick}>\n <Trash fill=\"neutral500\" />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Compound\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Attachment = {\n Root,\n Preview,\n Title,\n Remove,\n};\n\nexport { useAttachmentContext };\n"],"names":["AttachmentContext","createContext","error","useAttachmentContext","useContext","StyledRoot","styled","Box","theme","colors","neutral100","Root","children","minWidth","maxWidth","_jsx","Provider","value","_jsxs","Flex","direction","alignItems","gap","background","hasRadius","borderColor","borderStyle","borderWidth","padding","width","Typography","variant","textColor","Preview","justifyContent","WarningCircle","fill","Title","grow","ellipsis","style","userSelect","Remove","onClick","shrink","Trash","Attachment"],"mappings":";;;;;;AAcA,MAAMA,kCAAoBC,aAAAA,CAAsC;IAAEC,KAAAA,EAAO;AAAK,CAAA,CAAA;AAE9E,MAAMC,oBAAAA,GAAuB,IAAMC,UAAAA,CAAWJ,iBAAAA;AAa9C,MAAMK,UAAAA,GAAaC,MAAAA,CAAOC,GAAAA,CAAI;;;gBAGd,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;AAEzD,CAAC;AAED;AACA,MAAMC,IAAAA,GAAO,CAAC,EAAEC,QAAQ,EAAEV,KAAAA,GAAQ,IAAI,EAAEW,QAAQ,EAAEC,QAAQ,EAAuB,GAAA;IAC/E,qBACEC,GAAA,CAACf,kBAAkBgB,QAAQ,EAAA;QAACC,KAAAA,EAAO;AAAEf,YAAAA;AAAM,SAAA;AACzC,QAAA,QAAA,gBAAAgB,IAAA,CAACC,IAAAA,EAAAA;YACCC,SAAAA,EAAU,QAAA;YACVC,UAAAA,EAAW,YAAA;YACXC,GAAAA,EAAK,CAAA;YACLT,QAAAA,EAAUA,QAAAA;YACVC,QAAAA,EAAUA,QAAAA;;8BAEVC,GAAA,CAACV,UAAAA,EAAAA;oBACCkB,UAAAA,EAAW,UAAA;oBACXC,SAAS,EAAA,IAAA;oBACTC,WAAAA,EAAY,YAAA;oBACZC,WAAAA,EAAY,OAAA;oBACZC,WAAAA,EAAY,KAAA;oBACZC,OAAAA,EAAS,CAAA;oBACTC,KAAAA,EAAM,MAAA;AAEN,oBAAA,QAAA,gBAAAd,GAAA,CAACI,IAAAA,EAAAA;wBAAKG,GAAAA,EAAK,CAAA;AAAIV,wBAAAA,QAAAA,EAAAA;;;AAEhBV,gBAAAA,KAAAA,kBACCa,GAAA,CAACe,UAAAA,EAAAA;oBAAWC,OAAAA,EAAQ,IAAA;oBAAKC,SAAAA,EAAU,WAAA;AAChC9B,oBAAAA,QAAAA,EAAAA;;;;;AAMb,CAAA;AAUA,MAAM+B,OAAAA,GAAU,CAAC,EAAErB,QAAQ,EAA0B,GAAA;IACnD,MAAM,EAAEV,KAAK,EAAE,GAAGC,oBAAAA,EAAAA;AAElB,IAAA,qBACEY,GAAA,CAACI,IAAAA,EAAAA;QAAKE,UAAAA,EAAW,QAAA;QAASa,cAAAA,EAAe,QAAA;AACtChC,QAAAA,QAAAA,EAAAA,KAAAA,iBAAQa,GAAA,CAACoB,aAAAA,EAAAA;YAAcC,IAAAA,EAAK;AAAiBxB,SAAAA,CAAAA,GAAAA;;AAGpD,CAAA;AAUA,MAAMyB,KAAAA,GAAQ,CAAC,EAAEzB,QAAQ,EAAwB,GAAA;AAC/C,IAAA,qBACEG,GAAA,CAACR,GAAAA,EAAAA;QAAI+B,IAAAA,EAAM,CAAA;AACT,QAAA,QAAA,gBAAAvB,GAAA,CAACe,UAAAA,EAAAA;YAAWC,OAAAA,EAAQ,OAAA;YAAQQ,QAAQ,EAAA,IAAA;YAACC,KAAAA,EAAO;gBAAEC,UAAAA,EAAY,MAAA;gBAAQ3B,QAAAA,EAAU;AAAQ,aAAA;AACjFF,YAAAA,QAAAA,EAAAA;;;AAIT,CAAA;AAUA,MAAM8B,MAAAA,GAAS,CAAC,EAAEC,OAAO,EAAyB,GAAA;AAChD,IAAA,qBACE5B,GAAA,CAACI,IAAAA,EAAAA;QAAKE,UAAAA,EAAW,QAAA;QAASa,cAAAA,EAAe,QAAA;QAASU,MAAAA,EAAQ,CAAA;QAAGD,OAAAA,EAASA,OAAAA;AACpE,QAAA,QAAA,gBAAA5B,GAAA,CAAC8B,KAAAA,EAAAA;YAAMT,IAAAA,EAAK;;;AAGlB,CAAA;AAEA;;2GAIaU,UAAAA,GAAa;AACxBnC,IAAAA,IAAAA;AACAsB,IAAAA,OAAAA;AACAI,IAAAA,KAAAA;AACAK,IAAAA;AACF;;;;"}
1
+ {"version":3,"file":"Attachment.mjs","sources":["../../../../../../../admin/src/components/AIChat/components/Attachments/components/Attachment.tsx"],"sourcesContent":["import { ReactNode, createContext, useContext, useMemo } from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { Trash, WarningCircle } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentContextValue {\n error?: string | null;\n}\n\nconst AttachmentContext = createContext<AttachmentContextValue>({ error: null });\n\nconst useAttachmentContext = () => useContext(AttachmentContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Root\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AttachmentRootProps {\n children: ReactNode;\n error?: string | null;\n minWidth?: string;\n maxWidth?: string;\n}\n\nconst StyledRoot = styled(Box)`\n &:hover {\n cursor: pointer;\n background: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\n// TODO: How to make this a button instead?\nconst Root = ({ children, error = null, minWidth, maxWidth }: AttachmentRootProps) => {\n const contextValue = useMemo(() => ({ error }), [error]);\n\n return (\n <AttachmentContext.Provider value={contextValue}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n gap={2}\n minWidth={minWidth}\n maxWidth={maxWidth}\n >\n <StyledRoot\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n padding={2}\n width=\"100%\"\n >\n <Flex gap={2}>{children}</Flex>\n </StyledRoot>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger500\">\n {error}\n </Typography>\n )}\n </Flex>\n </AttachmentContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Preview\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentPreviewProps {\n children: ReactNode;\n}\n\nconst Preview = ({ children }: AttachmentPreviewProps) => {\n const { error } = useAttachmentContext();\n\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\">\n {error ? <WarningCircle fill=\"danger500\" /> : children}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Title\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentTitleProps {\n children: ReactNode;\n}\n\nconst Title = ({ children }: AttachmentTitleProps) => {\n return (\n <Box grow={1}>\n <Typography variant=\"omega\" ellipsis style={{ userSelect: 'none', maxWidth: '100px' }}>\n {children}\n </Typography>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Remove\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentRemoveProps {\n onClick: () => void;\n}\n\nconst Remove = ({ onClick }: AttachmentRemoveProps) => {\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\" shrink={0} onClick={onClick}>\n <Trash fill=\"neutral500\" />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Compound\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Attachment = {\n Root,\n Preview,\n Title,\n Remove,\n};\n\nexport { useAttachmentContext };\n"],"names":["AttachmentContext","createContext","error","useAttachmentContext","useContext","StyledRoot","styled","Box","theme","colors","neutral100","Root","children","minWidth","maxWidth","contextValue","useMemo","_jsx","Provider","value","_jsxs","Flex","direction","alignItems","gap","background","hasRadius","borderColor","borderStyle","borderWidth","padding","width","Typography","variant","textColor","Preview","justifyContent","WarningCircle","fill","Title","grow","ellipsis","style","userSelect","Remove","onClick","shrink","Trash","Attachment"],"mappings":"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"}
@@ -20,11 +20,16 @@ const AnimatedContent = styledComponents.styled(designSystem.Box)`
20
20
  `;
21
21
  const Collapsible = ({ children, defaultOpen = false })=>{
22
22
  const [open, setOpen] = React.useState(defaultOpen);
23
- return /*#__PURE__*/ jsxRuntime.jsx(CollapsibleContext.Provider, {
24
- value: {
23
+ const toggle = React.useCallback(()=>setOpen((prev)=>!prev), []);
24
+ const contextValue = React.useMemo(()=>({
25
25
  open,
26
- toggle: ()=>setOpen((prev)=>!prev)
27
- },
26
+ toggle
27
+ }), [
28
+ open,
29
+ toggle
30
+ ]);
31
+ return /*#__PURE__*/ jsxRuntime.jsx(CollapsibleContext.Provider, {
32
+ value: contextValue,
28
33
  children: children
29
34
  });
30
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Collapsible.js","sources":["../../../../../admin/src/components/AIChat/components/Collapsible.tsx"],"sourcesContent":["import { useState, createContext, useContext, useRef, useLayoutEffect } from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n}\n\nconst CollapsibleContext = createContext<CollapsibleContextValue | undefined>(undefined);\n\nexport const useCollapsible = () => {\n const context = useContext(CollapsibleContext);\n if (!context) {\n throw new Error('Collapsible components must be wrapped in <Collapsible />');\n }\n return context;\n};\n\nconst AnimatedContent = styled(Box)`\n overflow: hidden;\n transition: height ${({ theme }) => theme.motion.timings['200']}\n ${({ theme }) => theme.motion.easings.easeOutQuad};\n`;\n\nexport const Collapsible = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <CollapsibleContext.Provider value={{ open, toggle: () => setOpen((prev) => !prev) }}>\n {children}\n </CollapsibleContext.Provider>\n );\n};\n\nexport const CollapsibleTrigger = ({\n children,\n}: {\n children: React.ReactNode | ((props: { open: boolean }) => React.ReactNode);\n}) => {\n const { toggle, open } = useCollapsible();\n return (\n <Box onClick={toggle} style={{ cursor: 'pointer' }}>\n {typeof children === 'function' ? children({ open }) : children}\n </Box>\n );\n};\n\nexport const CollapsibleContent = ({ children }: { children: React.ReactNode }) => {\n const { open } = useCollapsible();\n const contentRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number>(0);\n\n useLayoutEffect(() => {\n if (contentRef.current) {\n const contentHeight = contentRef.current.scrollHeight;\n setHeight(contentHeight);\n }\n }, [children]);\n\n return (\n <AnimatedContent\n ref={contentRef}\n role=\"region\"\n aria-hidden={!open}\n style={{\n height: open ? `${height}px` : 0,\n visibility: height === 0 ? 'hidden' : 'visible',\n }}\n >\n {children}\n </AnimatedContent>\n );\n};\n"],"names":["CollapsibleContext","createContext","undefined","useCollapsible","context","useContext","Error","AnimatedContent","styled","Box","theme","motion","timings","easings","easeOutQuad","Collapsible","children","defaultOpen","open","setOpen","useState","_jsx","Provider","value","toggle","prev","CollapsibleTrigger","onClick","style","cursor","CollapsibleContent","contentRef","useRef","height","setHeight","useLayoutEffect","current","contentHeight","scrollHeight","ref","role","aria-hidden","visibility"],"mappings":";;;;;;;AAUA,MAAMA,mCAAqBC,mBAAAA,CAAmDC,SAAAA,CAAAA;MAEjEC,cAAAA,GAAiB,IAAA;AAC5B,IAAA,MAAMC,UAAUC,gBAAAA,CAAWL,kBAAAA,CAAAA;AAC3B,IAAA,IAAI,CAACI,OAAAA,EAAS;AACZ,QAAA,MAAM,IAAIE,KAAAA,CAAM,2DAAA,CAAA;AAClB,IAAA;IACA,OAAOF,OAAAA;AACT;AAEA,MAAMG,eAAAA,GAAkBC,uBAAAA,CAAOC,gBAAAA,CAAI;;qBAEd,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,OAAO,CAAC,KAAA,CAAM;IAC7D,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,OAAO,CAACC,WAAW,CAAC;AACtD,CAAC;AAEM,MAAMC,cAAc,CAAC,EAC1BC,QAAQ,EACRC,WAAAA,GAAc,KAAK,EAIpB,GAAA;AACC,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAAA,CAAQ,GAAGC,cAAAA,CAASH,WAAAA,CAAAA;IACjC,qBACEI,cAAA,CAACrB,mBAAmBsB,QAAQ,EAAA;QAACC,KAAAA,EAAO;AAAEL,YAAAA,IAAAA;AAAMM,YAAAA,MAAAA,EAAQ,IAAML,OAAAA,CAAQ,CAACM,IAAAA,GAAS,CAACA,IAAAA;AAAM,SAAA;AAChFT,QAAAA,QAAAA,EAAAA;;AAGP;AAEO,MAAMU,kBAAAA,GAAqB,CAAC,EACjCV,QAAQ,EAGT,GAAA;AACC,IAAA,MAAM,EAAEQ,MAAM,EAAEN,IAAI,EAAE,GAAGf,cAAAA,EAAAA;AACzB,IAAA,qBACEkB,cAAA,CAACZ,gBAAAA,EAAAA;QAAIkB,OAAAA,EAASH,MAAAA;QAAQI,KAAAA,EAAO;YAAEC,MAAAA,EAAQ;AAAU,SAAA;kBAC9C,OAAOb,QAAAA,KAAa,aAAaA,QAAAA,CAAS;AAAEE,YAAAA;SAAK,CAAA,GAAKF;;AAG7D;AAEO,MAAMc,kBAAAA,GAAqB,CAAC,EAAEd,QAAQ,EAAiC,GAAA;IAC5E,MAAM,EAAEE,IAAI,EAAE,GAAGf,cAAAA,EAAAA;AACjB,IAAA,MAAM4B,aAAaC,YAAAA,CAAuB,IAAA,CAAA;AAC1C,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAU,GAAGd,cAAAA,CAAiB,CAAA,CAAA;IAE7Ce,qBAAAA,CAAgB,IAAA;QACd,IAAIJ,UAAAA,CAAWK,OAAO,EAAE;AACtB,YAAA,MAAMC,aAAAA,GAAgBN,UAAAA,CAAWK,OAAO,CAACE,YAAY;YACrDJ,SAAAA,CAAUG,aAAAA,CAAAA;AACZ,QAAA;IACF,CAAA,EAAG;AAACrB,QAAAA;AAAS,KAAA,CAAA;AAEb,IAAA,qBACEK,cAAA,CAACd,eAAAA,EAAAA;QACCgC,GAAAA,EAAKR,UAAAA;QACLS,IAAAA,EAAK,QAAA;AACLC,QAAAA,aAAAA,EAAa,CAACvB,IAAAA;QACdU,KAAAA,EAAO;AACLK,YAAAA,MAAAA,EAAQf,IAAAA,GAAO,CAAA,EAAGe,MAAAA,CAAO,EAAE,CAAC,GAAG,CAAA;YAC/BS,UAAAA,EAAYT,MAAAA,KAAW,IAAI,QAAA,GAAW;AACxC,SAAA;AAECjB,QAAAA,QAAAA,EAAAA;;AAGP;;;;;;;"}
1
+ {"version":3,"file":"Collapsible.js","sources":["../../../../../admin/src/components/AIChat/components/Collapsible.tsx"],"sourcesContent":["import {\n useCallback,\n useMemo,\n useState,\n createContext,\n useContext,\n useRef,\n useLayoutEffect,\n} from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n}\n\nconst CollapsibleContext = createContext<CollapsibleContextValue | undefined>(undefined);\n\nexport const useCollapsible = () => {\n const context = useContext(CollapsibleContext);\n if (!context) {\n throw new Error('Collapsible components must be wrapped in <Collapsible />');\n }\n return context;\n};\n\nconst AnimatedContent = styled(Box)`\n overflow: hidden;\n transition: height ${({ theme }) => theme.motion.timings['200']}\n ${({ theme }) => theme.motion.easings.easeOutQuad};\n`;\n\nexport const Collapsible = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [open, setOpen] = useState(defaultOpen);\n const toggle = useCallback(() => setOpen((prev) => !prev), []);\n const contextValue = useMemo(() => ({ open, toggle }), [open, toggle]);\n\n return <CollapsibleContext.Provider value={contextValue}>{children}</CollapsibleContext.Provider>;\n};\n\nexport const CollapsibleTrigger = ({\n children,\n}: {\n children: React.ReactNode | ((props: { open: boolean }) => React.ReactNode);\n}) => {\n const { toggle, open } = useCollapsible();\n return (\n <Box onClick={toggle} style={{ cursor: 'pointer' }}>\n {typeof children === 'function' ? children({ open }) : children}\n </Box>\n );\n};\n\nexport const CollapsibleContent = ({ children }: { children: React.ReactNode }) => {\n const { open } = useCollapsible();\n const contentRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number>(0);\n\n useLayoutEffect(() => {\n if (contentRef.current) {\n const contentHeight = contentRef.current.scrollHeight;\n setHeight(contentHeight);\n }\n }, [children]);\n\n return (\n <AnimatedContent\n ref={contentRef}\n role=\"region\"\n aria-hidden={!open}\n style={{\n height: open ? `${height}px` : 0,\n visibility: height === 0 ? 'hidden' : 'visible',\n }}\n >\n {children}\n </AnimatedContent>\n );\n};\n"],"names":["CollapsibleContext","createContext","undefined","useCollapsible","context","useContext","Error","AnimatedContent","styled","Box","theme","motion","timings","easings","easeOutQuad","Collapsible","children","defaultOpen","open","setOpen","useState","toggle","useCallback","prev","contextValue","useMemo","_jsx","Provider","value","CollapsibleTrigger","onClick","style","cursor","CollapsibleContent","contentRef","useRef","height","setHeight","useLayoutEffect","current","contentHeight","scrollHeight","ref","role","aria-hidden","visibility"],"mappings":";;;;;;;AAkBA,MAAMA,mCAAqBC,mBAAAA,CAAmDC,SAAAA,CAAAA;MAEjEC,cAAAA,GAAiB,IAAA;AAC5B,IAAA,MAAMC,UAAUC,gBAAAA,CAAWL,kBAAAA,CAAAA;AAC3B,IAAA,IAAI,CAACI,OAAAA,EAAS;AACZ,QAAA,MAAM,IAAIE,KAAAA,CAAM,2DAAA,CAAA;AAClB,IAAA;IACA,OAAOF,OAAAA;AACT;AAEA,MAAMG,eAAAA,GAAkBC,uBAAAA,CAAOC,gBAAAA,CAAI;;qBAEd,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,OAAO,CAAC,KAAA,CAAM;IAC7D,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,OAAO,CAACC,WAAW,CAAC;AACtD,CAAC;AAEM,MAAMC,cAAc,CAAC,EAC1BC,QAAQ,EACRC,WAAAA,GAAc,KAAK,EAIpB,GAAA;AACC,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAAA,CAAQ,GAAGC,cAAAA,CAASH,WAAAA,CAAAA;IACjC,MAAMI,MAAAA,GAASC,kBAAY,IAAMH,OAAAA,CAAQ,CAACI,IAAAA,GAAS,CAACA,OAAO,EAAE,CAAA;IAC7D,MAAMC,YAAAA,GAAeC,aAAAA,CAAQ,KAAO;AAAEP,YAAAA,IAAAA;AAAMG,YAAAA;AAAO,SAAA,CAAA,EAAI;AAACH,QAAAA,IAAAA;AAAMG,QAAAA;AAAO,KAAA,CAAA;IAErE,qBAAOK,cAAA,CAAC1B,mBAAmB2B,QAAQ,EAAA;QAACC,KAAAA,EAAOJ,YAAAA;AAAeR,QAAAA,QAAAA,EAAAA;;AAC5D;AAEO,MAAMa,kBAAAA,GAAqB,CAAC,EACjCb,QAAQ,EAGT,GAAA;AACC,IAAA,MAAM,EAAEK,MAAM,EAAEH,IAAI,EAAE,GAAGf,cAAAA,EAAAA;AACzB,IAAA,qBACEuB,cAAA,CAACjB,gBAAAA,EAAAA;QAAIqB,OAAAA,EAAST,MAAAA;QAAQU,KAAAA,EAAO;YAAEC,MAAAA,EAAQ;AAAU,SAAA;kBAC9C,OAAOhB,QAAAA,KAAa,aAAaA,QAAAA,CAAS;AAAEE,YAAAA;SAAK,CAAA,GAAKF;;AAG7D;AAEO,MAAMiB,kBAAAA,GAAqB,CAAC,EAAEjB,QAAQ,EAAiC,GAAA;IAC5E,MAAM,EAAEE,IAAI,EAAE,GAAGf,cAAAA,EAAAA;AACjB,IAAA,MAAM+B,aAAaC,YAAAA,CAAuB,IAAA,CAAA;AAC1C,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAU,GAAGjB,cAAAA,CAAiB,CAAA,CAAA;IAE7CkB,qBAAAA,CAAgB,IAAA;QACd,IAAIJ,UAAAA,CAAWK,OAAO,EAAE;AACtB,YAAA,MAAMC,aAAAA,GAAgBN,UAAAA,CAAWK,OAAO,CAACE,YAAY;YACrDJ,SAAAA,CAAUG,aAAAA,CAAAA;AACZ,QAAA;IACF,CAAA,EAAG;AAACxB,QAAAA;AAAS,KAAA,CAAA;AAEb,IAAA,qBACEU,cAAA,CAACnB,eAAAA,EAAAA;QACCmC,GAAAA,EAAKR,UAAAA;QACLS,IAAAA,EAAK,QAAA;AACLC,QAAAA,aAAAA,EAAa,CAAC1B,IAAAA;QACda,KAAAA,EAAO;AACLK,YAAAA,MAAAA,EAAQlB,IAAAA,GAAO,CAAA,EAAGkB,MAAAA,CAAO,EAAE,CAAC,GAAG,CAAA;YAC/BS,UAAAA,EAAYT,MAAAA,KAAW,IAAI,QAAA,GAAW;AACxC,SAAA;AAECpB,QAAAA,QAAAA,EAAAA;;AAGP;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { useState, useRef, useLayoutEffect, createContext, useContext } from 'react';
2
+ import { useState, useCallback, useMemo, useRef, useLayoutEffect, createContext, useContext } from 'react';
3
3
  import { Box } from '@strapi/design-system';
4
4
  import { styled } from 'styled-components';
5
5
 
@@ -18,11 +18,16 @@ const AnimatedContent = styled(Box)`
18
18
  `;
19
19
  const Collapsible = ({ children, defaultOpen = false })=>{
20
20
  const [open, setOpen] = useState(defaultOpen);
21
- return /*#__PURE__*/ jsx(CollapsibleContext.Provider, {
22
- value: {
21
+ const toggle = useCallback(()=>setOpen((prev)=>!prev), []);
22
+ const contextValue = useMemo(()=>({
23
23
  open,
24
- toggle: ()=>setOpen((prev)=>!prev)
25
- },
24
+ toggle
25
+ }), [
26
+ open,
27
+ toggle
28
+ ]);
29
+ return /*#__PURE__*/ jsx(CollapsibleContext.Provider, {
30
+ value: contextValue,
26
31
  children: children
27
32
  });
28
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Collapsible.mjs","sources":["../../../../../admin/src/components/AIChat/components/Collapsible.tsx"],"sourcesContent":["import { useState, createContext, useContext, useRef, useLayoutEffect } from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n}\n\nconst CollapsibleContext = createContext<CollapsibleContextValue | undefined>(undefined);\n\nexport const useCollapsible = () => {\n const context = useContext(CollapsibleContext);\n if (!context) {\n throw new Error('Collapsible components must be wrapped in <Collapsible />');\n }\n return context;\n};\n\nconst AnimatedContent = styled(Box)`\n overflow: hidden;\n transition: height ${({ theme }) => theme.motion.timings['200']}\n ${({ theme }) => theme.motion.easings.easeOutQuad};\n`;\n\nexport const Collapsible = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <CollapsibleContext.Provider value={{ open, toggle: () => setOpen((prev) => !prev) }}>\n {children}\n </CollapsibleContext.Provider>\n );\n};\n\nexport const CollapsibleTrigger = ({\n children,\n}: {\n children: React.ReactNode | ((props: { open: boolean }) => React.ReactNode);\n}) => {\n const { toggle, open } = useCollapsible();\n return (\n <Box onClick={toggle} style={{ cursor: 'pointer' }}>\n {typeof children === 'function' ? children({ open }) : children}\n </Box>\n );\n};\n\nexport const CollapsibleContent = ({ children }: { children: React.ReactNode }) => {\n const { open } = useCollapsible();\n const contentRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number>(0);\n\n useLayoutEffect(() => {\n if (contentRef.current) {\n const contentHeight = contentRef.current.scrollHeight;\n setHeight(contentHeight);\n }\n }, [children]);\n\n return (\n <AnimatedContent\n ref={contentRef}\n role=\"region\"\n aria-hidden={!open}\n style={{\n height: open ? `${height}px` : 0,\n visibility: height === 0 ? 'hidden' : 'visible',\n }}\n >\n {children}\n </AnimatedContent>\n );\n};\n"],"names":["CollapsibleContext","createContext","undefined","useCollapsible","context","useContext","Error","AnimatedContent","styled","Box","theme","motion","timings","easings","easeOutQuad","Collapsible","children","defaultOpen","open","setOpen","useState","_jsx","Provider","value","toggle","prev","CollapsibleTrigger","onClick","style","cursor","CollapsibleContent","contentRef","useRef","height","setHeight","useLayoutEffect","current","contentHeight","scrollHeight","ref","role","aria-hidden","visibility"],"mappings":";;;;;AAUA,MAAMA,mCAAqBC,aAAAA,CAAmDC,SAAAA,CAAAA;MAEjEC,cAAAA,GAAiB,IAAA;AAC5B,IAAA,MAAMC,UAAUC,UAAAA,CAAWL,kBAAAA,CAAAA;AAC3B,IAAA,IAAI,CAACI,OAAAA,EAAS;AACZ,QAAA,MAAM,IAAIE,KAAAA,CAAM,2DAAA,CAAA;AAClB,IAAA;IACA,OAAOF,OAAAA;AACT;AAEA,MAAMG,eAAAA,GAAkBC,MAAAA,CAAOC,GAAAA,CAAI;;qBAEd,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,OAAO,CAAC,KAAA,CAAM;IAC7D,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,OAAO,CAACC,WAAW,CAAC;AACtD,CAAC;AAEM,MAAMC,cAAc,CAAC,EAC1BC,QAAQ,EACRC,WAAAA,GAAc,KAAK,EAIpB,GAAA;AACC,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAAA,CAAQ,GAAGC,QAAAA,CAASH,WAAAA,CAAAA;IACjC,qBACEI,GAAA,CAACrB,mBAAmBsB,QAAQ,EAAA;QAACC,KAAAA,EAAO;AAAEL,YAAAA,IAAAA;AAAMM,YAAAA,MAAAA,EAAQ,IAAML,OAAAA,CAAQ,CAACM,IAAAA,GAAS,CAACA,IAAAA;AAAM,SAAA;AAChFT,QAAAA,QAAAA,EAAAA;;AAGP;AAEO,MAAMU,kBAAAA,GAAqB,CAAC,EACjCV,QAAQ,EAGT,GAAA;AACC,IAAA,MAAM,EAAEQ,MAAM,EAAEN,IAAI,EAAE,GAAGf,cAAAA,EAAAA;AACzB,IAAA,qBACEkB,GAAA,CAACZ,GAAAA,EAAAA;QAAIkB,OAAAA,EAASH,MAAAA;QAAQI,KAAAA,EAAO;YAAEC,MAAAA,EAAQ;AAAU,SAAA;kBAC9C,OAAOb,QAAAA,KAAa,aAAaA,QAAAA,CAAS;AAAEE,YAAAA;SAAK,CAAA,GAAKF;;AAG7D;AAEO,MAAMc,kBAAAA,GAAqB,CAAC,EAAEd,QAAQ,EAAiC,GAAA;IAC5E,MAAM,EAAEE,IAAI,EAAE,GAAGf,cAAAA,EAAAA;AACjB,IAAA,MAAM4B,aAAaC,MAAAA,CAAuB,IAAA,CAAA;AAC1C,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAU,GAAGd,QAAAA,CAAiB,CAAA,CAAA;IAE7Ce,eAAAA,CAAgB,IAAA;QACd,IAAIJ,UAAAA,CAAWK,OAAO,EAAE;AACtB,YAAA,MAAMC,aAAAA,GAAgBN,UAAAA,CAAWK,OAAO,CAACE,YAAY;YACrDJ,SAAAA,CAAUG,aAAAA,CAAAA;AACZ,QAAA;IACF,CAAA,EAAG;AAACrB,QAAAA;AAAS,KAAA,CAAA;AAEb,IAAA,qBACEK,GAAA,CAACd,eAAAA,EAAAA;QACCgC,GAAAA,EAAKR,UAAAA;QACLS,IAAAA,EAAK,QAAA;AACLC,QAAAA,aAAAA,EAAa,CAACvB,IAAAA;QACdU,KAAAA,EAAO;AACLK,YAAAA,MAAAA,EAAQf,IAAAA,GAAO,CAAA,EAAGe,MAAAA,CAAO,EAAE,CAAC,GAAG,CAAA;YAC/BS,UAAAA,EAAYT,MAAAA,KAAW,IAAI,QAAA,GAAW;AACxC,SAAA;AAECjB,QAAAA,QAAAA,EAAAA;;AAGP;;;;"}
1
+ {"version":3,"file":"Collapsible.mjs","sources":["../../../../../admin/src/components/AIChat/components/Collapsible.tsx"],"sourcesContent":["import {\n useCallback,\n useMemo,\n useState,\n createContext,\n useContext,\n useRef,\n useLayoutEffect,\n} from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\ninterface CollapsibleContextValue {\n open: boolean;\n toggle: () => void;\n}\n\nconst CollapsibleContext = createContext<CollapsibleContextValue | undefined>(undefined);\n\nexport const useCollapsible = () => {\n const context = useContext(CollapsibleContext);\n if (!context) {\n throw new Error('Collapsible components must be wrapped in <Collapsible />');\n }\n return context;\n};\n\nconst AnimatedContent = styled(Box)`\n overflow: hidden;\n transition: height ${({ theme }) => theme.motion.timings['200']}\n ${({ theme }) => theme.motion.easings.easeOutQuad};\n`;\n\nexport const Collapsible = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [open, setOpen] = useState(defaultOpen);\n const toggle = useCallback(() => setOpen((prev) => !prev), []);\n const contextValue = useMemo(() => ({ open, toggle }), [open, toggle]);\n\n return <CollapsibleContext.Provider value={contextValue}>{children}</CollapsibleContext.Provider>;\n};\n\nexport const CollapsibleTrigger = ({\n children,\n}: {\n children: React.ReactNode | ((props: { open: boolean }) => React.ReactNode);\n}) => {\n const { toggle, open } = useCollapsible();\n return (\n <Box onClick={toggle} style={{ cursor: 'pointer' }}>\n {typeof children === 'function' ? children({ open }) : children}\n </Box>\n );\n};\n\nexport const CollapsibleContent = ({ children }: { children: React.ReactNode }) => {\n const { open } = useCollapsible();\n const contentRef = useRef<HTMLDivElement>(null);\n const [height, setHeight] = useState<number>(0);\n\n useLayoutEffect(() => {\n if (contentRef.current) {\n const contentHeight = contentRef.current.scrollHeight;\n setHeight(contentHeight);\n }\n }, [children]);\n\n return (\n <AnimatedContent\n ref={contentRef}\n role=\"region\"\n aria-hidden={!open}\n style={{\n height: open ? `${height}px` : 0,\n visibility: height === 0 ? 'hidden' : 'visible',\n }}\n >\n {children}\n </AnimatedContent>\n );\n};\n"],"names":["CollapsibleContext","createContext","undefined","useCollapsible","context","useContext","Error","AnimatedContent","styled","Box","theme","motion","timings","easings","easeOutQuad","Collapsible","children","defaultOpen","open","setOpen","useState","toggle","useCallback","prev","contextValue","useMemo","_jsx","Provider","value","CollapsibleTrigger","onClick","style","cursor","CollapsibleContent","contentRef","useRef","height","setHeight","useLayoutEffect","current","contentHeight","scrollHeight","ref","role","aria-hidden","visibility"],"mappings":";;;;;AAkBA,MAAMA,mCAAqBC,aAAAA,CAAmDC,SAAAA,CAAAA;MAEjEC,cAAAA,GAAiB,IAAA;AAC5B,IAAA,MAAMC,UAAUC,UAAAA,CAAWL,kBAAAA,CAAAA;AAC3B,IAAA,IAAI,CAACI,OAAAA,EAAS;AACZ,QAAA,MAAM,IAAIE,KAAAA,CAAM,2DAAA,CAAA;AAClB,IAAA;IACA,OAAOF,OAAAA;AACT;AAEA,MAAMG,eAAAA,GAAkBC,MAAAA,CAAOC,GAAAA,CAAI;;qBAEd,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,OAAO,CAAC,KAAA,CAAM;IAC7D,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,OAAO,CAACC,WAAW,CAAC;AACtD,CAAC;AAEM,MAAMC,cAAc,CAAC,EAC1BC,QAAQ,EACRC,WAAAA,GAAc,KAAK,EAIpB,GAAA;AACC,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAAA,CAAQ,GAAGC,QAAAA,CAASH,WAAAA,CAAAA;IACjC,MAAMI,MAAAA,GAASC,YAAY,IAAMH,OAAAA,CAAQ,CAACI,IAAAA,GAAS,CAACA,OAAO,EAAE,CAAA;IAC7D,MAAMC,YAAAA,GAAeC,OAAAA,CAAQ,KAAO;AAAEP,YAAAA,IAAAA;AAAMG,YAAAA;AAAO,SAAA,CAAA,EAAI;AAACH,QAAAA,IAAAA;AAAMG,QAAAA;AAAO,KAAA,CAAA;IAErE,qBAAOK,GAAA,CAAC1B,mBAAmB2B,QAAQ,EAAA;QAACC,KAAAA,EAAOJ,YAAAA;AAAeR,QAAAA,QAAAA,EAAAA;;AAC5D;AAEO,MAAMa,kBAAAA,GAAqB,CAAC,EACjCb,QAAQ,EAGT,GAAA;AACC,IAAA,MAAM,EAAEK,MAAM,EAAEH,IAAI,EAAE,GAAGf,cAAAA,EAAAA;AACzB,IAAA,qBACEuB,GAAA,CAACjB,GAAAA,EAAAA;QAAIqB,OAAAA,EAAST,MAAAA;QAAQU,KAAAA,EAAO;YAAEC,MAAAA,EAAQ;AAAU,SAAA;kBAC9C,OAAOhB,QAAAA,KAAa,aAAaA,QAAAA,CAAS;AAAEE,YAAAA;SAAK,CAAA,GAAKF;;AAG7D;AAEO,MAAMiB,kBAAAA,GAAqB,CAAC,EAAEjB,QAAQ,EAAiC,GAAA;IAC5E,MAAM,EAAEE,IAAI,EAAE,GAAGf,cAAAA,EAAAA;AACjB,IAAA,MAAM+B,aAAaC,MAAAA,CAAuB,IAAA,CAAA;AAC1C,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAU,GAAGjB,QAAAA,CAAiB,CAAA,CAAA;IAE7CkB,eAAAA,CAAgB,IAAA;QACd,IAAIJ,UAAAA,CAAWK,OAAO,EAAE;AACtB,YAAA,MAAMC,aAAAA,GAAgBN,UAAAA,CAAWK,OAAO,CAACE,YAAY;YACrDJ,SAAAA,CAAUG,aAAAA,CAAAA;AACZ,QAAA;IACF,CAAA,EAAG;AAACxB,QAAAA;AAAS,KAAA,CAAA;AAEb,IAAA,qBACEU,GAAA,CAACnB,eAAAA,EAAAA;QACCmC,GAAAA,EAAKR,UAAAA;QACLS,IAAAA,EAAK,QAAA;AACLC,QAAAA,aAAAA,EAAa,CAAC1B,IAAAA;QACda,KAAAA,EAAO;AACLK,YAAAA,MAAAA,EAAQlB,IAAAA,GAAO,CAAA,EAAGkB,MAAAA,CAAO,EAAE,CAAC,GAAG,CAAA;YAC/BS,UAAAA,EAAYT,MAAAA,KAAW,IAAI,QAAA,GAAW;AACxC,SAAA;AAECpB,QAAAA,QAAAA,EAAAA;;AAGP;;;;"}
@@ -5,6 +5,10 @@ var React = require('react');
5
5
  var designSystem = require('@strapi/design-system');
6
6
  var reactDropzone = require('react-dropzone');
7
7
 
8
+ const DEFAULT_ON_ADD_FILES = ()=>{};
9
+ const DEFAULT_ACCEPT = {
10
+ 'image/*': []
11
+ };
8
12
  const useClipboardPasteImages = ({ onAddFiles, isEnabled = false })=>{
9
13
  const handlePaste = React.useCallback(async (e)=>{
10
14
  if (!isEnabled) return;
@@ -41,9 +45,7 @@ const useClipboardPasteImages = ({ onAddFiles, isEnabled = false })=>{
41
45
  };
42
46
  const DropzoneContext = /*#__PURE__*/ React.createContext({});
43
47
  const useDropzoneContext = ()=>React.useContext(DropzoneContext);
44
- const Root = ({ children, isEnabled = true, onAddFiles = ()=>{}, accept = {
45
- 'image/*': []
46
- }, ...props })=>{
48
+ const Root = ({ children, isEnabled = true, onAddFiles = DEFAULT_ON_ADD_FILES, accept = DEFAULT_ACCEPT, ...props })=>{
47
49
  // Use clipboard paste hook for handling clipboard events
48
50
  useClipboardPasteImages({
49
51
  onAddFiles,
@@ -55,12 +57,17 @@ const Root = ({ children, isEnabled = true, onAddFiles = ()=>{}, accept = {
55
57
  noKeyboard: true,
56
58
  accept
57
59
  });
58
- return /*#__PURE__*/ jsxRuntime.jsx(DropzoneContext.Provider, {
59
- value: {
60
+ const contextValue = React.useMemo(()=>({
60
61
  isEnabled,
61
62
  isDragActive,
62
63
  onAddFiles
63
- },
64
+ }), [
65
+ isEnabled,
66
+ isDragActive,
67
+ onAddFiles
68
+ ]);
69
+ return /*#__PURE__*/ jsxRuntime.jsx(DropzoneContext.Provider, {
70
+ value: contextValue,
64
71
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
65
72
  direction: "column",
66
73
  alignItems: "flex-start",
@@ -1 +1 @@
1
- {"version":3,"file":"Dropzone.js","sources":["../../../../../admin/src/components/AIChat/components/Dropzone.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect } from 'react';\n\nimport { Flex, Box, Typography } from '@strapi/design-system';\nimport { useDropzone } from 'react-dropzone';\n\n/* -------------------------------------------------------------------------------------------------\n * Hooks\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UseClipboardPasteProps {\n onAddFiles: (files: File[]) => void;\n isEnabled?: boolean;\n accept?: {\n [key: string]: string[];\n };\n}\n\nexport const useClipboardPasteImages = ({\n onAddFiles,\n isEnabled = false,\n}: UseClipboardPasteProps) => {\n const handlePaste = useCallback(\n async (e: ClipboardEvent) => {\n if (!isEnabled) return;\n // Try to get items from clipboard\n const items = e.clipboardData?.items;\n\n if (!items || items.length === 0) return;\n\n const files: File[] = [];\n\n // Process clipboard items\n for (const item of items) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file && file.type.startsWith('image/')) {\n files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n onAddFiles(files);\n e.preventDefault(); // Prevent the default paste behavior\n }\n },\n [isEnabled, onAddFiles]\n );\n\n // Set up the paste event listener\n useEffect(() => {\n document.addEventListener('paste', handlePaste);\n return () => {\n document.removeEventListener('paste', handlePaste);\n };\n }, [handlePaste]);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Context\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface DropzoneContextValue {\n isEnabled?: boolean;\n isDragActive?: boolean;\n onAddFiles?: (files: File[]) => void;\n}\n\nconst DropzoneContext = createContext<DropzoneContextValue>({});\n\nexport const useDropzoneContext = () => useContext(DropzoneContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Root\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface DropzoneRootProps extends React.ComponentPropsWithoutRef<typeof Flex> {\n children: React.ReactNode;\n isEnabled?: boolean;\n onAddFiles?: (files: File[]) => void;\n accept?: {\n [key: string]: string[];\n };\n}\n\nexport const Root = ({\n children,\n isEnabled = true,\n onAddFiles = () => {},\n accept = { 'image/*': [] },\n ...props\n}: DropzoneRootProps) => {\n // Use clipboard paste hook for handling clipboard events\n useClipboardPasteImages({ onAddFiles, isEnabled, accept });\n\n // Use dropzone for drag and drop functionality\n const { getRootProps, isDragActive } = useDropzone({\n onDrop: onAddFiles,\n noClick: true,\n noKeyboard: true,\n accept,\n });\n\n return (\n <DropzoneContext.Provider\n value={{\n isEnabled,\n isDragActive,\n onAddFiles,\n }}\n >\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n width=\"100%\"\n position=\"relative\"\n {...getRootProps()}\n {...props}\n >\n {children}\n </Flex>\n </DropzoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Area\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DropzoneAreaProps extends React.ComponentPropsWithoutRef<typeof Flex> {\n error?: string | null;\n title?: string;\n}\n\nconst Area = ({ error, title, ...props }: DropzoneAreaProps) => {\n const { isEnabled, isDragActive } = useDropzoneContext();\n\n // If not dragging, don't render the dropzone area\n if (!isDragActive) {\n return null;\n }\n\n const displayTitle = title || 'Drop images here';\n\n return (\n <Flex\n position=\"absolute\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n zIndex={2}\n cursor={isEnabled ? 'pointer' : 'not-allowed'}\n width=\"100%\"\n height=\"100%\"\n borderStyle=\"dashed\"\n borderColor={error ? 'danger600' : 'primary500'}\n background={error ? 'danger100' : 'primary100'}\n hasRadius\n padding={7}\n justifyContent=\"center\"\n direction=\"column\"\n alignItems=\"center\"\n gap={2}\n {...props}\n >\n <Box width=\"24px\" height=\"24px\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M19.5 13.572L12 6.072L4.5 13.572\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 6.072V20.072\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.9998 20.072H20.0001\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Box>\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {displayTitle}\n </Typography>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger600\">\n {error}\n </Typography>\n )}\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Compound\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Dropzone = {\n Root,\n Area,\n useDropzoneContext,\n};\n"],"names":["useClipboardPasteImages","onAddFiles","isEnabled","handlePaste","useCallback","e","items","clipboardData","length","files","item","kind","file","getAsFile","type","startsWith","push","preventDefault","useEffect","document","addEventListener","removeEventListener","DropzoneContext","createContext","useDropzoneContext","useContext","Root","children","accept","props","getRootProps","isDragActive","useDropzone","onDrop","noClick","noKeyboard","_jsx","Provider","value","Flex","direction","alignItems","width","position","Area","error","title","displayTitle","_jsxs","top","left","right","bottom","zIndex","cursor","height","borderStyle","borderColor","background","hasRadius","padding","justifyContent","gap","Box","svg","viewBox","fill","xmlns","path","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","Typography","variant","textColor","textAlign","Dropzone"],"mappings":"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"}
1
+ {"version":3,"file":"Dropzone.js","sources":["../../../../../admin/src/components/AIChat/components/Dropzone.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo } from 'react';\n\nimport { Flex, Box, Typography } from '@strapi/design-system';\nimport { useDropzone } from 'react-dropzone';\n\nconst DEFAULT_ON_ADD_FILES: NonNullable<DropzoneRootProps['onAddFiles']> = () => {};\nconst DEFAULT_ACCEPT: NonNullable<DropzoneRootProps['accept']> = { 'image/*': [] };\n\n/* -------------------------------------------------------------------------------------------------\n * Hooks\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UseClipboardPasteProps {\n onAddFiles: (files: File[]) => void;\n isEnabled?: boolean;\n accept?: {\n [key: string]: string[];\n };\n}\n\nexport const useClipboardPasteImages = ({\n onAddFiles,\n isEnabled = false,\n}: UseClipboardPasteProps) => {\n const handlePaste = useCallback(\n async (e: ClipboardEvent) => {\n if (!isEnabled) return;\n // Try to get items from clipboard\n const items = e.clipboardData?.items;\n\n if (!items || items.length === 0) return;\n\n const files: File[] = [];\n\n // Process clipboard items\n for (const item of items) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file && file.type.startsWith('image/')) {\n files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n onAddFiles(files);\n e.preventDefault(); // Prevent the default paste behavior\n }\n },\n [isEnabled, onAddFiles]\n );\n\n // Set up the paste event listener\n useEffect(() => {\n document.addEventListener('paste', handlePaste);\n return () => {\n document.removeEventListener('paste', handlePaste);\n };\n }, [handlePaste]);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Context\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface DropzoneContextValue {\n isEnabled?: boolean;\n isDragActive?: boolean;\n onAddFiles?: (files: File[]) => void;\n}\n\nconst DropzoneContext = createContext<DropzoneContextValue>({});\n\nexport const useDropzoneContext = () => useContext(DropzoneContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Root\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface DropzoneRootProps extends React.ComponentPropsWithoutRef<typeof Flex> {\n children: React.ReactNode;\n isEnabled?: boolean;\n onAddFiles?: (files: File[]) => void;\n accept?: {\n [key: string]: string[];\n };\n}\n\nexport const Root = ({\n children,\n isEnabled = true,\n onAddFiles = DEFAULT_ON_ADD_FILES,\n accept = DEFAULT_ACCEPT,\n ...props\n}: DropzoneRootProps) => {\n // Use clipboard paste hook for handling clipboard events\n useClipboardPasteImages({ onAddFiles, isEnabled, accept });\n\n // Use dropzone for drag and drop functionality\n const { getRootProps, isDragActive } = useDropzone({\n onDrop: onAddFiles,\n noClick: true,\n noKeyboard: true,\n accept,\n });\n const contextValue = useMemo(\n () => ({ isEnabled, isDragActive, onAddFiles }),\n [isEnabled, isDragActive, onAddFiles]\n );\n\n return (\n <DropzoneContext.Provider value={contextValue}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n width=\"100%\"\n position=\"relative\"\n {...getRootProps()}\n {...props}\n >\n {children}\n </Flex>\n </DropzoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Area\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DropzoneAreaProps extends React.ComponentPropsWithoutRef<typeof Flex> {\n error?: string | null;\n title?: string;\n}\n\nconst Area = ({ error, title, ...props }: DropzoneAreaProps) => {\n const { isEnabled, isDragActive } = useDropzoneContext();\n\n // If not dragging, don't render the dropzone area\n if (!isDragActive) {\n return null;\n }\n\n const displayTitle = title || 'Drop images here';\n\n return (\n <Flex\n position=\"absolute\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n zIndex={2}\n cursor={isEnabled ? 'pointer' : 'not-allowed'}\n width=\"100%\"\n height=\"100%\"\n borderStyle=\"dashed\"\n borderColor={error ? 'danger600' : 'primary500'}\n background={error ? 'danger100' : 'primary100'}\n hasRadius\n padding={7}\n justifyContent=\"center\"\n direction=\"column\"\n alignItems=\"center\"\n gap={2}\n {...props}\n >\n <Box width=\"24px\" height=\"24px\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M19.5 13.572L12 6.072L4.5 13.572\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 6.072V20.072\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.9998 20.072H20.0001\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Box>\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {displayTitle}\n </Typography>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger600\">\n {error}\n </Typography>\n )}\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Compound\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Dropzone = {\n Root,\n Area,\n useDropzoneContext,\n};\n"],"names":["DEFAULT_ON_ADD_FILES","DEFAULT_ACCEPT","useClipboardPasteImages","onAddFiles","isEnabled","handlePaste","useCallback","e","items","clipboardData","length","files","item","kind","file","getAsFile","type","startsWith","push","preventDefault","useEffect","document","addEventListener","removeEventListener","DropzoneContext","createContext","useDropzoneContext","useContext","Root","children","accept","props","getRootProps","isDragActive","useDropzone","onDrop","noClick","noKeyboard","contextValue","useMemo","_jsx","Provider","value","Flex","direction","alignItems","width","position","Area","error","title","displayTitle","_jsxs","top","left","right","bottom","zIndex","cursor","height","borderStyle","borderColor","background","hasRadius","padding","justifyContent","gap","Box","svg","viewBox","fill","xmlns","path","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","Typography","variant","textColor","textAlign","Dropzone"],"mappings":"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"}
@@ -1,8 +1,12 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useCallback, useEffect, createContext, useContext } from 'react';
2
+ import { useMemo, useCallback, useEffect, createContext, useContext } from 'react';
3
3
  import { Flex, Box, Typography } from '@strapi/design-system';
4
4
  import { useDropzone } from 'react-dropzone';
5
5
 
6
+ const DEFAULT_ON_ADD_FILES = ()=>{};
7
+ const DEFAULT_ACCEPT = {
8
+ 'image/*': []
9
+ };
6
10
  const useClipboardPasteImages = ({ onAddFiles, isEnabled = false })=>{
7
11
  const handlePaste = useCallback(async (e)=>{
8
12
  if (!isEnabled) return;
@@ -39,9 +43,7 @@ const useClipboardPasteImages = ({ onAddFiles, isEnabled = false })=>{
39
43
  };
40
44
  const DropzoneContext = /*#__PURE__*/ createContext({});
41
45
  const useDropzoneContext = ()=>useContext(DropzoneContext);
42
- const Root = ({ children, isEnabled = true, onAddFiles = ()=>{}, accept = {
43
- 'image/*': []
44
- }, ...props })=>{
46
+ const Root = ({ children, isEnabled = true, onAddFiles = DEFAULT_ON_ADD_FILES, accept = DEFAULT_ACCEPT, ...props })=>{
45
47
  // Use clipboard paste hook for handling clipboard events
46
48
  useClipboardPasteImages({
47
49
  onAddFiles,
@@ -53,12 +55,17 @@ const Root = ({ children, isEnabled = true, onAddFiles = ()=>{}, accept = {
53
55
  noKeyboard: true,
54
56
  accept
55
57
  });
56
- return /*#__PURE__*/ jsx(DropzoneContext.Provider, {
57
- value: {
58
+ const contextValue = useMemo(()=>({
58
59
  isEnabled,
59
60
  isDragActive,
60
61
  onAddFiles
61
- },
62
+ }), [
63
+ isEnabled,
64
+ isDragActive,
65
+ onAddFiles
66
+ ]);
67
+ return /*#__PURE__*/ jsx(DropzoneContext.Provider, {
68
+ value: contextValue,
62
69
  children: /*#__PURE__*/ jsx(Flex, {
63
70
  direction: "column",
64
71
  alignItems: "flex-start",
@@ -1 +1 @@
1
- {"version":3,"file":"Dropzone.mjs","sources":["../../../../../admin/src/components/AIChat/components/Dropzone.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect } from 'react';\n\nimport { Flex, Box, Typography } from '@strapi/design-system';\nimport { useDropzone } from 'react-dropzone';\n\n/* -------------------------------------------------------------------------------------------------\n * Hooks\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UseClipboardPasteProps {\n onAddFiles: (files: File[]) => void;\n isEnabled?: boolean;\n accept?: {\n [key: string]: string[];\n };\n}\n\nexport const useClipboardPasteImages = ({\n onAddFiles,\n isEnabled = false,\n}: UseClipboardPasteProps) => {\n const handlePaste = useCallback(\n async (e: ClipboardEvent) => {\n if (!isEnabled) return;\n // Try to get items from clipboard\n const items = e.clipboardData?.items;\n\n if (!items || items.length === 0) return;\n\n const files: File[] = [];\n\n // Process clipboard items\n for (const item of items) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file && file.type.startsWith('image/')) {\n files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n onAddFiles(files);\n e.preventDefault(); // Prevent the default paste behavior\n }\n },\n [isEnabled, onAddFiles]\n );\n\n // Set up the paste event listener\n useEffect(() => {\n document.addEventListener('paste', handlePaste);\n return () => {\n document.removeEventListener('paste', handlePaste);\n };\n }, [handlePaste]);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Context\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface DropzoneContextValue {\n isEnabled?: boolean;\n isDragActive?: boolean;\n onAddFiles?: (files: File[]) => void;\n}\n\nconst DropzoneContext = createContext<DropzoneContextValue>({});\n\nexport const useDropzoneContext = () => useContext(DropzoneContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Root\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface DropzoneRootProps extends React.ComponentPropsWithoutRef<typeof Flex> {\n children: React.ReactNode;\n isEnabled?: boolean;\n onAddFiles?: (files: File[]) => void;\n accept?: {\n [key: string]: string[];\n };\n}\n\nexport const Root = ({\n children,\n isEnabled = true,\n onAddFiles = () => {},\n accept = { 'image/*': [] },\n ...props\n}: DropzoneRootProps) => {\n // Use clipboard paste hook for handling clipboard events\n useClipboardPasteImages({ onAddFiles, isEnabled, accept });\n\n // Use dropzone for drag and drop functionality\n const { getRootProps, isDragActive } = useDropzone({\n onDrop: onAddFiles,\n noClick: true,\n noKeyboard: true,\n accept,\n });\n\n return (\n <DropzoneContext.Provider\n value={{\n isEnabled,\n isDragActive,\n onAddFiles,\n }}\n >\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n width=\"100%\"\n position=\"relative\"\n {...getRootProps()}\n {...props}\n >\n {children}\n </Flex>\n </DropzoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Area\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DropzoneAreaProps extends React.ComponentPropsWithoutRef<typeof Flex> {\n error?: string | null;\n title?: string;\n}\n\nconst Area = ({ error, title, ...props }: DropzoneAreaProps) => {\n const { isEnabled, isDragActive } = useDropzoneContext();\n\n // If not dragging, don't render the dropzone area\n if (!isDragActive) {\n return null;\n }\n\n const displayTitle = title || 'Drop images here';\n\n return (\n <Flex\n position=\"absolute\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n zIndex={2}\n cursor={isEnabled ? 'pointer' : 'not-allowed'}\n width=\"100%\"\n height=\"100%\"\n borderStyle=\"dashed\"\n borderColor={error ? 'danger600' : 'primary500'}\n background={error ? 'danger100' : 'primary100'}\n hasRadius\n padding={7}\n justifyContent=\"center\"\n direction=\"column\"\n alignItems=\"center\"\n gap={2}\n {...props}\n >\n <Box width=\"24px\" height=\"24px\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M19.5 13.572L12 6.072L4.5 13.572\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 6.072V20.072\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.9998 20.072H20.0001\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Box>\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {displayTitle}\n </Typography>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger600\">\n {error}\n </Typography>\n )}\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Compound\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Dropzone = {\n Root,\n Area,\n useDropzoneContext,\n};\n"],"names":["useClipboardPasteImages","onAddFiles","isEnabled","handlePaste","useCallback","e","items","clipboardData","length","files","item","kind","file","getAsFile","type","startsWith","push","preventDefault","useEffect","document","addEventListener","removeEventListener","DropzoneContext","createContext","useDropzoneContext","useContext","Root","children","accept","props","getRootProps","isDragActive","useDropzone","onDrop","noClick","noKeyboard","_jsx","Provider","value","Flex","direction","alignItems","width","position","Area","error","title","displayTitle","_jsxs","top","left","right","bottom","zIndex","cursor","height","borderStyle","borderColor","background","hasRadius","padding","justifyContent","gap","Box","svg","viewBox","fill","xmlns","path","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","Typography","variant","textColor","textAlign","Dropzone"],"mappings":"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"}
1
+ {"version":3,"file":"Dropzone.mjs","sources":["../../../../../admin/src/components/AIChat/components/Dropzone.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo } from 'react';\n\nimport { Flex, Box, Typography } from '@strapi/design-system';\nimport { useDropzone } from 'react-dropzone';\n\nconst DEFAULT_ON_ADD_FILES: NonNullable<DropzoneRootProps['onAddFiles']> = () => {};\nconst DEFAULT_ACCEPT: NonNullable<DropzoneRootProps['accept']> = { 'image/*': [] };\n\n/* -------------------------------------------------------------------------------------------------\n * Hooks\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UseClipboardPasteProps {\n onAddFiles: (files: File[]) => void;\n isEnabled?: boolean;\n accept?: {\n [key: string]: string[];\n };\n}\n\nexport const useClipboardPasteImages = ({\n onAddFiles,\n isEnabled = false,\n}: UseClipboardPasteProps) => {\n const handlePaste = useCallback(\n async (e: ClipboardEvent) => {\n if (!isEnabled) return;\n // Try to get items from clipboard\n const items = e.clipboardData?.items;\n\n if (!items || items.length === 0) return;\n\n const files: File[] = [];\n\n // Process clipboard items\n for (const item of items) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file && file.type.startsWith('image/')) {\n files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n onAddFiles(files);\n e.preventDefault(); // Prevent the default paste behavior\n }\n },\n [isEnabled, onAddFiles]\n );\n\n // Set up the paste event listener\n useEffect(() => {\n document.addEventListener('paste', handlePaste);\n return () => {\n document.removeEventListener('paste', handlePaste);\n };\n }, [handlePaste]);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Context\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface DropzoneContextValue {\n isEnabled?: boolean;\n isDragActive?: boolean;\n onAddFiles?: (files: File[]) => void;\n}\n\nconst DropzoneContext = createContext<DropzoneContextValue>({});\n\nexport const useDropzoneContext = () => useContext(DropzoneContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Root\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface DropzoneRootProps extends React.ComponentPropsWithoutRef<typeof Flex> {\n children: React.ReactNode;\n isEnabled?: boolean;\n onAddFiles?: (files: File[]) => void;\n accept?: {\n [key: string]: string[];\n };\n}\n\nexport const Root = ({\n children,\n isEnabled = true,\n onAddFiles = DEFAULT_ON_ADD_FILES,\n accept = DEFAULT_ACCEPT,\n ...props\n}: DropzoneRootProps) => {\n // Use clipboard paste hook for handling clipboard events\n useClipboardPasteImages({ onAddFiles, isEnabled, accept });\n\n // Use dropzone for drag and drop functionality\n const { getRootProps, isDragActive } = useDropzone({\n onDrop: onAddFiles,\n noClick: true,\n noKeyboard: true,\n accept,\n });\n const contextValue = useMemo(\n () => ({ isEnabled, isDragActive, onAddFiles }),\n [isEnabled, isDragActive, onAddFiles]\n );\n\n return (\n <DropzoneContext.Provider value={contextValue}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n width=\"100%\"\n position=\"relative\"\n {...getRootProps()}\n {...props}\n >\n {children}\n </Flex>\n </DropzoneContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Area\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DropzoneAreaProps extends React.ComponentPropsWithoutRef<typeof Flex> {\n error?: string | null;\n title?: string;\n}\n\nconst Area = ({ error, title, ...props }: DropzoneAreaProps) => {\n const { isEnabled, isDragActive } = useDropzoneContext();\n\n // If not dragging, don't render the dropzone area\n if (!isDragActive) {\n return null;\n }\n\n const displayTitle = title || 'Drop images here';\n\n return (\n <Flex\n position=\"absolute\"\n top={0}\n left={0}\n right={0}\n bottom={0}\n zIndex={2}\n cursor={isEnabled ? 'pointer' : 'not-allowed'}\n width=\"100%\"\n height=\"100%\"\n borderStyle=\"dashed\"\n borderColor={error ? 'danger600' : 'primary500'}\n background={error ? 'danger100' : 'primary100'}\n hasRadius\n padding={7}\n justifyContent=\"center\"\n direction=\"column\"\n alignItems=\"center\"\n gap={2}\n {...props}\n >\n <Box width=\"24px\" height=\"24px\">\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M19.5 13.572L12 6.072L4.5 13.572\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 6.072V20.072\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3.9998 20.072H20.0001\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </Box>\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {displayTitle}\n </Typography>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger600\">\n {error}\n </Typography>\n )}\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Dropzone Compound\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Dropzone = {\n Root,\n Area,\n useDropzoneContext,\n};\n"],"names":["DEFAULT_ON_ADD_FILES","DEFAULT_ACCEPT","useClipboardPasteImages","onAddFiles","isEnabled","handlePaste","useCallback","e","items","clipboardData","length","files","item","kind","file","getAsFile","type","startsWith","push","preventDefault","useEffect","document","addEventListener","removeEventListener","DropzoneContext","createContext","useDropzoneContext","useContext","Root","children","accept","props","getRootProps","isDragActive","useDropzone","onDrop","noClick","noKeyboard","contextValue","useMemo","_jsx","Provider","value","Flex","direction","alignItems","width","position","Area","error","title","displayTitle","_jsxs","top","left","right","bottom","zIndex","cursor","height","borderStyle","borderColor","background","hasRadius","padding","justifyContent","gap","Box","svg","viewBox","fill","xmlns","path","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","Typography","variant","textColor","textAlign","Dropzone"],"mappings":"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"}
@@ -7,6 +7,7 @@ var Icons = require('@strapi/icons');
7
7
  var styledComponents = require('styled-components');
8
8
  var animations = require('./animations.js');
9
9
 
10
+ const DEFAULT_ON_TOGGLE = ()=>{};
10
11
  const PanelContext = /*#__PURE__*/ React.createContext({
11
12
  size: 'md',
12
13
  position: 'bottom-right',
@@ -78,14 +79,20 @@ const PanelContainer = styledComponents.styled(designSystem.Box)`
78
79
  }
79
80
  }
80
81
  `;
81
- const Root = ({ children, size = 'md', position = 'bottom-right', isOpen = false, onToggle = ()=>{}, toggleIcon })=>{
82
- return /*#__PURE__*/ jsxRuntime.jsx(PanelContext.Provider, {
83
- value: {
82
+ const Root = ({ children, size = 'md', position = 'bottom-right', isOpen = false, onToggle = DEFAULT_ON_TOGGLE, toggleIcon })=>{
83
+ const contextValue = React.useMemo(()=>({
84
84
  size,
85
85
  position,
86
86
  isOpen,
87
87
  onToggle
88
- },
88
+ }), [
89
+ size,
90
+ position,
91
+ isOpen,
92
+ onToggle
93
+ ]);
94
+ return /*#__PURE__*/ jsxRuntime.jsx(PanelContext.Provider, {
95
+ value: contextValue,
89
96
  children: /*#__PURE__*/ jsxRuntime.jsxs(FixedWrapper, {
90
97
  $position: position,
91
98
  children: [
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingPanel.js","sources":["../../../../../admin/src/components/AIChat/components/FloatingPanel.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nimport { Box, Flex, IconButton } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { ANIMATIONS } from './animations';\n\ntype PanelSize = 'sm' | 'md' | 'lg';\ntype PanelPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\ninterface PanelContextValue {\n size: PanelSize;\n position: PanelPosition;\n isOpen: boolean;\n onToggle: () => void;\n}\n\nconst PanelContext = createContext<PanelContextValue>({\n size: 'md',\n position: 'bottom-right',\n isOpen: false,\n onToggle: () => {},\n});\n\nconst PANEL_SIZES: Record<PanelSize, { width: string; height: string }> = {\n sm: { width: '350px', height: '500px' },\n md: { width: '480px', height: '600px' },\n lg: { width: '600px', height: '700px' },\n};\n\nconst PANEL_POSITIONS: Record<PanelPosition, { [key: string]: number }> = {\n 'bottom-right': { bottom: 4, right: 4 },\n 'bottom-left': { bottom: 4, left: 4 },\n 'top-right': { top: 4, right: 4 },\n 'top-left': { top: 4, left: 4 },\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panel Root\n * -----------------------------------------------------------------------------------------------*/\ninterface RootProps {\n children: React.ReactNode;\n size?: PanelSize;\n position?: PanelPosition;\n isOpen?: boolean;\n onToggle?: () => void;\n toggleIcon?: React.ReactNode;\n}\n\nconst FixedWrapper = styled(Box)<{ $position: PanelPosition }>`\n position: fixed;\n display: flex;\n flex-direction: column;\n z-index: 11;\n align-items: ${({ $position }) => ($position.includes('right') ? 'flex-end' : 'flex-start')};\n ${({ $position, theme }) =>\n Object.entries(PANEL_POSITIONS[$position]).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: theme.spaces[value],\n }),\n {}\n )}\n`;\n\nconst PanelContainer = styled(Box)<{ $size: PanelSize; $position: PanelPosition }>`\n width: ${({ $size }) => PANEL_SIZES[$size].width};\n max-height: 85vh;\n max-width: 85vw;\n display: flex;\n flex-direction: column;\n height: ${({ $size }) => PANEL_SIZES[$size].height};\n\n @media (prefers-reduced-motion: no-preference) {\n animation-duration: 200ms;\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n\n &[data-state='open'] {\n animation-name: ${({ $position }) =>\n $position.startsWith('top') ? ANIMATIONS.slideDownIn : ANIMATIONS.slideUpIn};\n }\n\n &[data-state='closed'] {\n animation-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);\n animation-name: ${({ $position }) =>\n $position.startsWith('top') ? ANIMATIONS.slideDownOut : ANIMATIONS.slideUpOut};\n }\n }\n`;\n\nconst Root = ({\n children,\n size = 'md',\n position = 'bottom-right',\n isOpen = false,\n onToggle = () => {},\n toggleIcon,\n}: RootProps) => {\n return (\n <PanelContext.Provider value={{ size, position, isOpen, onToggle }}>\n <FixedWrapper $position={position}>\n {isOpen ? (\n <PanelContainer\n $size={size}\n $position={position}\n background=\"neutral0\"\n shadow=\"popupShadow\"\n hasRadius\n borderColor=\"neutral200\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n {children}\n </PanelContainer>\n ) : null}\n {toggleIcon && !isOpen && toggleIcon}\n </FixedWrapper>\n </PanelContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\nconst Header = ({ children }: { children: React.ReactNode }) => (\n // Adjust padding to fit title and right icons\n <Box padding={[2, 2, 2, 4]} borderColor=\"neutral150\" borderStyle=\"solid\" borderWidth=\"0 0 1px 0\">\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n {children}\n </Flex>\n </Box>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Body\n * -----------------------------------------------------------------------------------------------*/\nconst Body = ({ children }: { children: React.ReactNode }) => {\n return (\n <Box padding={4} flex=\"1\" overflow=\"auto\">\n {children}\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Footer\n * -----------------------------------------------------------------------------------------------*/\nconst Footer = ({ children }: { children: React.ReactNode }) => <Box padding={4}>{children}</Box>;\n\n/* -------------------------------------------------------------------------------------------------\n * Close Panel\n * -----------------------------------------------------------------------------------------------*/\nconst Close = ({ label }: { label?: string }) => {\n const { onToggle } = usePanel();\n\n return (\n <IconButton onClick={onToggle} variant=\"ghost\" label={label || 'Close'}>\n <Cross />\n </IconButton>\n );\n};\n\nexport const Panel = {\n Root,\n Header,\n Body,\n Footer,\n Close,\n};\n\nexport const usePanel = () => useContext(PanelContext);\n"],"names":["PanelContext","createContext","size","position","isOpen","onToggle","PANEL_SIZES","sm","width","height","md","lg","PANEL_POSITIONS","bottom","right","left","top","FixedWrapper","styled","Box","$position","includes","theme","Object","entries","reduce","acc","key","value","spaces","PanelContainer","$size","startsWith","ANIMATIONS","slideDownIn","slideUpIn","slideDownOut","slideUpOut","Root","children","toggleIcon","_jsx","Provider","_jsxs","background","shadow","hasRadius","borderColor","borderStyle","borderWidth","data-state","Header","padding","Flex","justifyContent","alignItems","Body","flex","overflow","Footer","Close","label","usePanel","IconButton","onClick","variant","Cross","Panel","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"FloatingPanel.js","sources":["../../../../../admin/src/components/AIChat/components/FloatingPanel.tsx"],"sourcesContent":["import { createContext, useContext, useMemo } from 'react';\n\nimport { Box, Flex, IconButton } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { ANIMATIONS } from './animations';\n\nconst DEFAULT_ON_TOGGLE: NonNullable<RootProps['onToggle']> = () => {};\n\ntype PanelSize = 'sm' | 'md' | 'lg';\ntype PanelPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\ninterface PanelContextValue {\n size: PanelSize;\n position: PanelPosition;\n isOpen: boolean;\n onToggle: () => void;\n}\n\nconst PanelContext = createContext<PanelContextValue>({\n size: 'md',\n position: 'bottom-right',\n isOpen: false,\n onToggle: () => {},\n});\n\nconst PANEL_SIZES: Record<PanelSize, { width: string; height: string }> = {\n sm: { width: '350px', height: '500px' },\n md: { width: '480px', height: '600px' },\n lg: { width: '600px', height: '700px' },\n};\n\nconst PANEL_POSITIONS: Record<PanelPosition, { [key: string]: number }> = {\n 'bottom-right': { bottom: 4, right: 4 },\n 'bottom-left': { bottom: 4, left: 4 },\n 'top-right': { top: 4, right: 4 },\n 'top-left': { top: 4, left: 4 },\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panel Root\n * -----------------------------------------------------------------------------------------------*/\ninterface RootProps {\n children: React.ReactNode;\n size?: PanelSize;\n position?: PanelPosition;\n isOpen?: boolean;\n onToggle?: () => void;\n toggleIcon?: React.ReactNode;\n}\n\nconst FixedWrapper = styled(Box)<{ $position: PanelPosition }>`\n position: fixed;\n display: flex;\n flex-direction: column;\n z-index: 11;\n align-items: ${({ $position }) => ($position.includes('right') ? 'flex-end' : 'flex-start')};\n ${({ $position, theme }) =>\n Object.entries(PANEL_POSITIONS[$position]).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: theme.spaces[value],\n }),\n {}\n )}\n`;\n\nconst PanelContainer = styled(Box)<{ $size: PanelSize; $position: PanelPosition }>`\n width: ${({ $size }) => PANEL_SIZES[$size].width};\n max-height: 85vh;\n max-width: 85vw;\n display: flex;\n flex-direction: column;\n height: ${({ $size }) => PANEL_SIZES[$size].height};\n\n @media (prefers-reduced-motion: no-preference) {\n animation-duration: 200ms;\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n\n &[data-state='open'] {\n animation-name: ${({ $position }) =>\n $position.startsWith('top') ? ANIMATIONS.slideDownIn : ANIMATIONS.slideUpIn};\n }\n\n &[data-state='closed'] {\n animation-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);\n animation-name: ${({ $position }) =>\n $position.startsWith('top') ? ANIMATIONS.slideDownOut : ANIMATIONS.slideUpOut};\n }\n }\n`;\n\nconst Root = ({\n children,\n size = 'md',\n position = 'bottom-right',\n isOpen = false,\n onToggle = DEFAULT_ON_TOGGLE,\n toggleIcon,\n}: RootProps) => {\n const contextValue = useMemo(\n () => ({ size, position, isOpen, onToggle }),\n [size, position, isOpen, onToggle]\n );\n\n return (\n <PanelContext.Provider value={contextValue}>\n <FixedWrapper $position={position}>\n {isOpen ? (\n <PanelContainer\n $size={size}\n $position={position}\n background=\"neutral0\"\n shadow=\"popupShadow\"\n hasRadius\n borderColor=\"neutral200\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n {children}\n </PanelContainer>\n ) : null}\n {toggleIcon && !isOpen && toggleIcon}\n </FixedWrapper>\n </PanelContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\nconst Header = ({ children }: { children: React.ReactNode }) => (\n // Adjust padding to fit title and right icons\n <Box padding={[2, 2, 2, 4]} borderColor=\"neutral150\" borderStyle=\"solid\" borderWidth=\"0 0 1px 0\">\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n {children}\n </Flex>\n </Box>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Body\n * -----------------------------------------------------------------------------------------------*/\nconst Body = ({ children }: { children: React.ReactNode }) => {\n return (\n <Box padding={4} flex=\"1\" overflow=\"auto\">\n {children}\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Footer\n * -----------------------------------------------------------------------------------------------*/\nconst Footer = ({ children }: { children: React.ReactNode }) => <Box padding={4}>{children}</Box>;\n\n/* -------------------------------------------------------------------------------------------------\n * Close Panel\n * -----------------------------------------------------------------------------------------------*/\nconst Close = ({ label }: { label?: string }) => {\n const { onToggle } = usePanel();\n\n return (\n <IconButton onClick={onToggle} variant=\"ghost\" label={label || 'Close'}>\n <Cross />\n </IconButton>\n );\n};\n\nexport const Panel = {\n Root,\n Header,\n Body,\n Footer,\n Close,\n};\n\nexport const usePanel = () => useContext(PanelContext);\n"],"names":["DEFAULT_ON_TOGGLE","PanelContext","createContext","size","position","isOpen","onToggle","PANEL_SIZES","sm","width","height","md","lg","PANEL_POSITIONS","bottom","right","left","top","FixedWrapper","styled","Box","$position","includes","theme","Object","entries","reduce","acc","key","value","spaces","PanelContainer","$size","startsWith","ANIMATIONS","slideDownIn","slideUpIn","slideDownOut","slideUpOut","Root","children","toggleIcon","contextValue","useMemo","_jsx","Provider","_jsxs","background","shadow","hasRadius","borderColor","borderStyle","borderWidth","data-state","Header","padding","Flex","justifyContent","alignItems","Body","flex","overflow","Footer","Close","label","usePanel","IconButton","onClick","variant","Cross","Panel","useContext"],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { createContext, useContext } from 'react';
2
+ import { useMemo, createContext, useContext } from 'react';
3
3
  import { Box, Flex, IconButton } from '@strapi/design-system';
4
4
  import { Cross } from '@strapi/icons';
5
5
  import { styled } from 'styled-components';
6
6
  import { ANIMATIONS } from './animations.mjs';
7
7
 
8
+ const DEFAULT_ON_TOGGLE = ()=>{};
8
9
  const PanelContext = /*#__PURE__*/ createContext({
9
10
  size: 'md',
10
11
  position: 'bottom-right',
@@ -76,14 +77,20 @@ const PanelContainer = styled(Box)`
76
77
  }
77
78
  }
78
79
  `;
79
- const Root = ({ children, size = 'md', position = 'bottom-right', isOpen = false, onToggle = ()=>{}, toggleIcon })=>{
80
- return /*#__PURE__*/ jsx(PanelContext.Provider, {
81
- value: {
80
+ const Root = ({ children, size = 'md', position = 'bottom-right', isOpen = false, onToggle = DEFAULT_ON_TOGGLE, toggleIcon })=>{
81
+ const contextValue = useMemo(()=>({
82
82
  size,
83
83
  position,
84
84
  isOpen,
85
85
  onToggle
86
- },
86
+ }), [
87
+ size,
88
+ position,
89
+ isOpen,
90
+ onToggle
91
+ ]);
92
+ return /*#__PURE__*/ jsx(PanelContext.Provider, {
93
+ value: contextValue,
87
94
  children: /*#__PURE__*/ jsxs(FixedWrapper, {
88
95
  $position: position,
89
96
  children: [
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingPanel.mjs","sources":["../../../../../admin/src/components/AIChat/components/FloatingPanel.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nimport { Box, Flex, IconButton } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { ANIMATIONS } from './animations';\n\ntype PanelSize = 'sm' | 'md' | 'lg';\ntype PanelPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\ninterface PanelContextValue {\n size: PanelSize;\n position: PanelPosition;\n isOpen: boolean;\n onToggle: () => void;\n}\n\nconst PanelContext = createContext<PanelContextValue>({\n size: 'md',\n position: 'bottom-right',\n isOpen: false,\n onToggle: () => {},\n});\n\nconst PANEL_SIZES: Record<PanelSize, { width: string; height: string }> = {\n sm: { width: '350px', height: '500px' },\n md: { width: '480px', height: '600px' },\n lg: { width: '600px', height: '700px' },\n};\n\nconst PANEL_POSITIONS: Record<PanelPosition, { [key: string]: number }> = {\n 'bottom-right': { bottom: 4, right: 4 },\n 'bottom-left': { bottom: 4, left: 4 },\n 'top-right': { top: 4, right: 4 },\n 'top-left': { top: 4, left: 4 },\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panel Root\n * -----------------------------------------------------------------------------------------------*/\ninterface RootProps {\n children: React.ReactNode;\n size?: PanelSize;\n position?: PanelPosition;\n isOpen?: boolean;\n onToggle?: () => void;\n toggleIcon?: React.ReactNode;\n}\n\nconst FixedWrapper = styled(Box)<{ $position: PanelPosition }>`\n position: fixed;\n display: flex;\n flex-direction: column;\n z-index: 11;\n align-items: ${({ $position }) => ($position.includes('right') ? 'flex-end' : 'flex-start')};\n ${({ $position, theme }) =>\n Object.entries(PANEL_POSITIONS[$position]).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: theme.spaces[value],\n }),\n {}\n )}\n`;\n\nconst PanelContainer = styled(Box)<{ $size: PanelSize; $position: PanelPosition }>`\n width: ${({ $size }) => PANEL_SIZES[$size].width};\n max-height: 85vh;\n max-width: 85vw;\n display: flex;\n flex-direction: column;\n height: ${({ $size }) => PANEL_SIZES[$size].height};\n\n @media (prefers-reduced-motion: no-preference) {\n animation-duration: 200ms;\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n\n &[data-state='open'] {\n animation-name: ${({ $position }) =>\n $position.startsWith('top') ? ANIMATIONS.slideDownIn : ANIMATIONS.slideUpIn};\n }\n\n &[data-state='closed'] {\n animation-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);\n animation-name: ${({ $position }) =>\n $position.startsWith('top') ? ANIMATIONS.slideDownOut : ANIMATIONS.slideUpOut};\n }\n }\n`;\n\nconst Root = ({\n children,\n size = 'md',\n position = 'bottom-right',\n isOpen = false,\n onToggle = () => {},\n toggleIcon,\n}: RootProps) => {\n return (\n <PanelContext.Provider value={{ size, position, isOpen, onToggle }}>\n <FixedWrapper $position={position}>\n {isOpen ? (\n <PanelContainer\n $size={size}\n $position={position}\n background=\"neutral0\"\n shadow=\"popupShadow\"\n hasRadius\n borderColor=\"neutral200\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n {children}\n </PanelContainer>\n ) : null}\n {toggleIcon && !isOpen && toggleIcon}\n </FixedWrapper>\n </PanelContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\nconst Header = ({ children }: { children: React.ReactNode }) => (\n // Adjust padding to fit title and right icons\n <Box padding={[2, 2, 2, 4]} borderColor=\"neutral150\" borderStyle=\"solid\" borderWidth=\"0 0 1px 0\">\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n {children}\n </Flex>\n </Box>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Body\n * -----------------------------------------------------------------------------------------------*/\nconst Body = ({ children }: { children: React.ReactNode }) => {\n return (\n <Box padding={4} flex=\"1\" overflow=\"auto\">\n {children}\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Footer\n * -----------------------------------------------------------------------------------------------*/\nconst Footer = ({ children }: { children: React.ReactNode }) => <Box padding={4}>{children}</Box>;\n\n/* -------------------------------------------------------------------------------------------------\n * Close Panel\n * -----------------------------------------------------------------------------------------------*/\nconst Close = ({ label }: { label?: string }) => {\n const { onToggle } = usePanel();\n\n return (\n <IconButton onClick={onToggle} variant=\"ghost\" label={label || 'Close'}>\n <Cross />\n </IconButton>\n );\n};\n\nexport const Panel = {\n Root,\n Header,\n Body,\n Footer,\n Close,\n};\n\nexport const usePanel = () => useContext(PanelContext);\n"],"names":["PanelContext","createContext","size","position","isOpen","onToggle","PANEL_SIZES","sm","width","height","md","lg","PANEL_POSITIONS","bottom","right","left","top","FixedWrapper","styled","Box","$position","includes","theme","Object","entries","reduce","acc","key","value","spaces","PanelContainer","$size","startsWith","ANIMATIONS","slideDownIn","slideUpIn","slideDownOut","slideUpOut","Root","children","toggleIcon","_jsx","Provider","_jsxs","background","shadow","hasRadius","borderColor","borderStyle","borderWidth","data-state","Header","padding","Flex","justifyContent","alignItems","Body","flex","overflow","Footer","Close","label","usePanel","IconButton","onClick","variant","Cross","Panel","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"FloatingPanel.mjs","sources":["../../../../../admin/src/components/AIChat/components/FloatingPanel.tsx"],"sourcesContent":["import { createContext, useContext, useMemo } from 'react';\n\nimport { Box, Flex, IconButton } from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { ANIMATIONS } from './animations';\n\nconst DEFAULT_ON_TOGGLE: NonNullable<RootProps['onToggle']> = () => {};\n\ntype PanelSize = 'sm' | 'md' | 'lg';\ntype PanelPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\ninterface PanelContextValue {\n size: PanelSize;\n position: PanelPosition;\n isOpen: boolean;\n onToggle: () => void;\n}\n\nconst PanelContext = createContext<PanelContextValue>({\n size: 'md',\n position: 'bottom-right',\n isOpen: false,\n onToggle: () => {},\n});\n\nconst PANEL_SIZES: Record<PanelSize, { width: string; height: string }> = {\n sm: { width: '350px', height: '500px' },\n md: { width: '480px', height: '600px' },\n lg: { width: '600px', height: '700px' },\n};\n\nconst PANEL_POSITIONS: Record<PanelPosition, { [key: string]: number }> = {\n 'bottom-right': { bottom: 4, right: 4 },\n 'bottom-left': { bottom: 4, left: 4 },\n 'top-right': { top: 4, right: 4 },\n 'top-left': { top: 4, left: 4 },\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panel Root\n * -----------------------------------------------------------------------------------------------*/\ninterface RootProps {\n children: React.ReactNode;\n size?: PanelSize;\n position?: PanelPosition;\n isOpen?: boolean;\n onToggle?: () => void;\n toggleIcon?: React.ReactNode;\n}\n\nconst FixedWrapper = styled(Box)<{ $position: PanelPosition }>`\n position: fixed;\n display: flex;\n flex-direction: column;\n z-index: 11;\n align-items: ${({ $position }) => ($position.includes('right') ? 'flex-end' : 'flex-start')};\n ${({ $position, theme }) =>\n Object.entries(PANEL_POSITIONS[$position]).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: theme.spaces[value],\n }),\n {}\n )}\n`;\n\nconst PanelContainer = styled(Box)<{ $size: PanelSize; $position: PanelPosition }>`\n width: ${({ $size }) => PANEL_SIZES[$size].width};\n max-height: 85vh;\n max-width: 85vw;\n display: flex;\n flex-direction: column;\n height: ${({ $size }) => PANEL_SIZES[$size].height};\n\n @media (prefers-reduced-motion: no-preference) {\n animation-duration: 200ms;\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n\n &[data-state='open'] {\n animation-name: ${({ $position }) =>\n $position.startsWith('top') ? ANIMATIONS.slideDownIn : ANIMATIONS.slideUpIn};\n }\n\n &[data-state='closed'] {\n animation-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);\n animation-name: ${({ $position }) =>\n $position.startsWith('top') ? ANIMATIONS.slideDownOut : ANIMATIONS.slideUpOut};\n }\n }\n`;\n\nconst Root = ({\n children,\n size = 'md',\n position = 'bottom-right',\n isOpen = false,\n onToggle = DEFAULT_ON_TOGGLE,\n toggleIcon,\n}: RootProps) => {\n const contextValue = useMemo(\n () => ({ size, position, isOpen, onToggle }),\n [size, position, isOpen, onToggle]\n );\n\n return (\n <PanelContext.Provider value={contextValue}>\n <FixedWrapper $position={position}>\n {isOpen ? (\n <PanelContainer\n $size={size}\n $position={position}\n background=\"neutral0\"\n shadow=\"popupShadow\"\n hasRadius\n borderColor=\"neutral200\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n {children}\n </PanelContainer>\n ) : null}\n {toggleIcon && !isOpen && toggleIcon}\n </FixedWrapper>\n </PanelContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\nconst Header = ({ children }: { children: React.ReactNode }) => (\n // Adjust padding to fit title and right icons\n <Box padding={[2, 2, 2, 4]} borderColor=\"neutral150\" borderStyle=\"solid\" borderWidth=\"0 0 1px 0\">\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n {children}\n </Flex>\n </Box>\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Body\n * -----------------------------------------------------------------------------------------------*/\nconst Body = ({ children }: { children: React.ReactNode }) => {\n return (\n <Box padding={4} flex=\"1\" overflow=\"auto\">\n {children}\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Footer\n * -----------------------------------------------------------------------------------------------*/\nconst Footer = ({ children }: { children: React.ReactNode }) => <Box padding={4}>{children}</Box>;\n\n/* -------------------------------------------------------------------------------------------------\n * Close Panel\n * -----------------------------------------------------------------------------------------------*/\nconst Close = ({ label }: { label?: string }) => {\n const { onToggle } = usePanel();\n\n return (\n <IconButton onClick={onToggle} variant=\"ghost\" label={label || 'Close'}>\n <Cross />\n </IconButton>\n );\n};\n\nexport const Panel = {\n Root,\n Header,\n Body,\n Footer,\n Close,\n};\n\nexport const usePanel = () => useContext(PanelContext);\n"],"names":["DEFAULT_ON_TOGGLE","PanelContext","createContext","size","position","isOpen","onToggle","PANEL_SIZES","sm","width","height","md","lg","PANEL_POSITIONS","bottom","right","left","top","FixedWrapper","styled","Box","$position","includes","theme","Object","entries","reduce","acc","key","value","spaces","PanelContainer","$size","startsWith","ANIMATIONS","slideDownIn","slideUpIn","slideDownOut","slideUpOut","Root","children","toggleIcon","contextValue","useMemo","_jsx","Provider","_jsxs","background","shadow","hasRadius","borderColor","borderStyle","borderWidth","data-state","Header","padding","Flex","justifyContent","alignItems","Body","flex","overflow","Footer","Close","label","usePanel","IconButton","onClick","variant","Cross","Panel","useContext"],"mappings":"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"}
@@ -118,19 +118,28 @@ const ImageModal = ({ src, alt, onClose })=>{
118
118
  * -----------------------------------------------------------------------------------------------*/ // Root component that provides context
119
119
  const Root = ({ children, src, alt, onClose, defaultOpen = false })=>{
120
120
  const [isOpen, setIsOpen] = React.useState(defaultOpen);
121
- const open = ()=>setIsOpen(true);
122
- const close = ()=>{
121
+ const open = React.useCallback(()=>setIsOpen(true), []);
122
+ const close = React.useCallback(()=>{
123
123
  setIsOpen(false);
124
124
  onClose?.();
125
- };
126
- return /*#__PURE__*/ jsxRuntime.jsxs(FullScreenImageContext.Provider, {
127
- value: {
125
+ }, [
126
+ onClose
127
+ ]);
128
+ const contextValue = React.useMemo(()=>({
128
129
  isOpen,
129
130
  open,
130
131
  close,
131
132
  src,
132
133
  alt
133
- },
134
+ }), [
135
+ isOpen,
136
+ open,
137
+ close,
138
+ src,
139
+ alt
140
+ ]);
141
+ return /*#__PURE__*/ jsxRuntime.jsxs(FullScreenImageContext.Provider, {
142
+ value: contextValue,
134
143
  children: [
135
144
  children,
136
145
  isOpen && /*#__PURE__*/ jsxRuntime.jsx(ImageModal, {
@@ -182,8 +191,7 @@ const Trigger = ({ children, asChild = false })=>{
182
191
  * Export
183
192
  * -----------------------------------------------------------------------------------------------*/ const FullScreenImage = {
184
193
  Root,
185
- Trigger
186
- };
194
+ Trigger};
187
195
 
188
196
  exports.FullScreenImage = FullScreenImage;
189
197
  exports.setOpacity = setOpacity;