@intlayer/design-system 6.1.5 → 6.1.6
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.
- package/dist/.vite/manifest.json +13 -9
- package/dist/Form-CriPBaZk.js.map +1 -1
- package/dist/Form-DJrUK3mm.cjs.map +1 -1
- package/dist/components/Accordion/Accordion.cjs +51 -15
- package/dist/components/Accordion/Accordion.cjs.map +1 -1
- package/dist/components/Accordion/Accordion.d.ts +44 -5
- package/dist/components/Accordion/Accordion.d.ts.map +1 -1
- package/dist/components/Accordion/Accordion.mjs +52 -16
- package/dist/components/Accordion/Accordion.mjs.map +1 -1
- package/dist/components/Avatar/index.cjs +114 -31
- package/dist/components/Avatar/index.cjs.map +1 -1
- package/dist/components/Avatar/index.d.ts +46 -2
- package/dist/components/Avatar/index.d.ts.map +1 -1
- package/dist/components/Avatar/index.mjs +115 -32
- package/dist/components/Avatar/index.mjs.map +1 -1
- package/dist/components/Badge/index.cjs +88 -9
- package/dist/components/Badge/index.cjs.map +1 -1
- package/dist/components/Badge/index.d.ts +80 -2
- package/dist/components/Badge/index.d.ts.map +1 -1
- package/dist/components/Badge/index.mjs +89 -10
- package/dist/components/Badge/index.mjs.map +1 -1
- package/dist/components/Breadcrumb/index.cjs +124 -59
- package/dist/components/Breadcrumb/index.cjs.map +1 -1
- package/dist/components/Breadcrumb/index.d.ts +89 -5
- package/dist/components/Breadcrumb/index.d.ts.map +1 -1
- package/dist/components/Breadcrumb/index.mjs +124 -59
- package/dist/components/Breadcrumb/index.mjs.map +1 -1
- package/dist/components/Button/Button.cjs +44 -25
- package/dist/components/Button/Button.cjs.map +1 -1
- package/dist/components/Button/Button.d.ts +95 -1
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Button/Button.mjs +44 -25
- package/dist/components/Button/Button.mjs.map +1 -1
- package/dist/components/ClickOutsideDiv/index.cjs +38 -7
- package/dist/components/ClickOutsideDiv/index.cjs.map +1 -1
- package/dist/components/ClickOutsideDiv/index.d.ts +13 -0
- package/dist/components/ClickOutsideDiv/index.d.ts.map +1 -1
- package/dist/components/ClickOutsideDiv/index.mjs +39 -8
- package/dist/components/ClickOutsideDiv/index.mjs.map +1 -1
- package/dist/components/Container/index.cjs +2 -0
- package/dist/components/Container/index.cjs.map +1 -1
- package/dist/components/Container/index.d.ts +42 -0
- package/dist/components/Container/index.d.ts.map +1 -1
- package/dist/components/Container/index.mjs +2 -0
- package/dist/components/Container/index.mjs.map +1 -1
- package/dist/components/ContentEditor/ContentEditor.cjs +80 -33
- package/dist/components/ContentEditor/ContentEditor.cjs.map +1 -1
- package/dist/components/ContentEditor/ContentEditor.d.ts +29 -0
- package/dist/components/ContentEditor/ContentEditor.d.ts.map +1 -1
- package/dist/components/ContentEditor/ContentEditor.mjs +80 -33
- package/dist/components/ContentEditor/ContentEditor.mjs.map +1 -1
- package/dist/components/ContentEditor/ContentEditorInput.cjs +58 -31
- package/dist/components/ContentEditor/ContentEditorInput.cjs.map +1 -1
- package/dist/components/ContentEditor/ContentEditorInput.d.ts +33 -0
- package/dist/components/ContentEditor/ContentEditorInput.d.ts.map +1 -1
- package/dist/components/ContentEditor/ContentEditorInput.mjs +58 -31
- package/dist/components/ContentEditor/ContentEditorInput.mjs.map +1 -1
- package/dist/components/ContentEditor/ContentEditorTextArea.cjs +58 -30
- package/dist/components/ContentEditor/ContentEditorTextArea.cjs.map +1 -1
- package/dist/components/ContentEditor/ContentEditorTextArea.d.ts +35 -0
- package/dist/components/ContentEditor/ContentEditorTextArea.d.ts.map +1 -1
- package/dist/components/ContentEditor/ContentEditorTextArea.mjs +59 -31
- package/dist/components/ContentEditor/ContentEditorTextArea.mjs.map +1 -1
- package/dist/components/ContentEditor/index.cjs +4 -0
- package/dist/components/ContentEditor/index.cjs.map +1 -1
- package/dist/components/ContentEditor/index.d.ts +2 -0
- package/dist/components/ContentEditor/index.d.ts.map +1 -1
- package/dist/components/ContentEditor/index.mjs +5 -1
- package/dist/components/ContentEditor/index.mjs.map +1 -1
- package/dist/components/ContentSelector/ContentSelector.cjs +9 -1
- package/dist/components/ContentSelector/ContentSelector.cjs.map +1 -1
- package/dist/components/ContentSelector/ContentSelector.d.ts +167 -0
- package/dist/components/ContentSelector/ContentSelector.d.ts.map +1 -1
- package/dist/components/ContentSelector/ContentSelector.mjs +9 -1
- package/dist/components/ContentSelector/ContentSelector.mjs.map +1 -1
- package/dist/components/CopyButton/index.cjs +23 -8
- package/dist/components/CopyButton/index.cjs.map +1 -1
- package/dist/components/CopyButton/index.d.ts +78 -0
- package/dist/components/CopyButton/index.d.ts.map +1 -1
- package/dist/components/CopyButton/index.mjs +23 -8
- package/dist/components/CopyButton/index.mjs.map +1 -1
- package/dist/components/CopyToClipboard/index.cjs +58 -22
- package/dist/components/CopyToClipboard/index.cjs.map +1 -1
- package/dist/components/CopyToClipboard/index.d.ts +68 -2
- package/dist/components/CopyToClipboard/index.d.ts.map +1 -1
- package/dist/components/CopyToClipboard/index.mjs +59 -23
- package/dist/components/CopyToClipboard/index.mjs.map +1 -1
- package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.cjs +4 -2
- package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.cjs.map +1 -1
- package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts +1 -0
- package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts.map +1 -1
- package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +4 -2
- package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs.map +1 -1
- package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.cjs +2 -2
- package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.cjs.map +1 -1
- package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +2 -2
- package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs.map +1 -1
- package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.cjs +3 -0
- package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.cjs.map +1 -1
- package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.d.ts +1 -0
- package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.d.ts.map +1 -1
- package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +3 -0
- package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs.map +1 -1
- package/dist/components/DropDown/index.cjs +6 -4
- package/dist/components/DropDown/index.cjs.map +1 -1
- package/dist/components/DropDown/index.d.ts +92 -15
- package/dist/components/DropDown/index.d.ts.map +1 -1
- package/dist/components/DropDown/index.mjs +6 -4
- package/dist/components/DropDown/index.mjs.map +1 -1
- package/dist/components/EditableField/EditableFieldInput.cjs.map +1 -1
- package/dist/components/EditableField/EditableFieldInput.d.ts +38 -0
- package/dist/components/EditableField/EditableFieldInput.d.ts.map +1 -1
- package/dist/components/EditableField/EditableFieldInput.mjs.map +1 -1
- package/dist/components/EditableField/EditableFieldLayout.cjs +10 -2
- package/dist/components/EditableField/EditableFieldLayout.cjs.map +1 -1
- package/dist/components/EditableField/EditableFieldLayout.d.ts.map +1 -1
- package/dist/components/EditableField/EditableFieldLayout.mjs +10 -2
- package/dist/components/EditableField/EditableFieldLayout.mjs.map +1 -1
- package/dist/components/EditableField/EditableFieldTextArea.cjs.map +1 -1
- package/dist/components/EditableField/EditableFieldTextArea.d.ts +42 -0
- package/dist/components/EditableField/EditableFieldTextArea.d.ts.map +1 -1
- package/dist/components/EditableField/EditableFieldTextArea.mjs.map +1 -1
- package/dist/components/ExpandCollapse/ExpandCollapse.cjs.map +1 -1
- package/dist/components/ExpandCollapse/ExpandCollapse.d.ts +58 -0
- package/dist/components/ExpandCollapse/ExpandCollapse.d.ts.map +1 -1
- package/dist/components/ExpandCollapse/ExpandCollapse.mjs.map +1 -1
- package/dist/components/Footer/index.cjs.map +1 -1
- package/dist/components/Footer/index.d.ts +101 -0
- package/dist/components/Footer/index.d.ts.map +1 -1
- package/dist/components/Footer/index.mjs.map +1 -1
- package/dist/components/Form/elements/MultiselectElement.d.ts.map +1 -1
- package/dist/components/Form/elements/SelectElement.d.ts.map +1 -1
- package/dist/components/Form/elements/SwitchSelectorElement.d.ts.map +1 -1
- package/dist/components/Headers/index.cjs.map +1 -1
- package/dist/components/Headers/index.d.ts +69 -2
- package/dist/components/Headers/index.d.ts.map +1 -1
- package/dist/components/Headers/index.mjs.map +1 -1
- package/dist/components/HeightResizer/index.cjs +10 -7
- package/dist/components/HeightResizer/index.cjs.map +1 -1
- package/dist/components/HeightResizer/index.d.ts +89 -0
- package/dist/components/HeightResizer/index.d.ts.map +1 -1
- package/dist/components/HeightResizer/index.mjs +10 -7
- package/dist/components/HeightResizer/index.mjs.map +1 -1
- package/dist/components/InformationTag/index.cjs.map +1 -1
- package/dist/components/InformationTag/index.d.ts +72 -0
- package/dist/components/InformationTag/index.d.ts.map +1 -1
- package/dist/components/InformationTag/index.mjs.map +1 -1
- package/dist/components/KeyboardScreenAdapter/index.cjs.map +1 -1
- package/dist/components/KeyboardScreenAdapter/index.d.ts +100 -0
- package/dist/components/KeyboardScreenAdapter/index.d.ts.map +1 -1
- package/dist/components/KeyboardScreenAdapter/index.mjs.map +1 -1
- package/dist/components/Label/index.cjs +25 -3
- package/dist/components/Label/index.cjs.map +1 -1
- package/dist/components/Label/index.d.ts +65 -1
- package/dist/components/Label/index.d.ts.map +1 -1
- package/dist/components/Label/index.mjs +26 -4
- package/dist/components/Label/index.mjs.map +1 -1
- package/dist/components/Link/Link.cjs +0 -4
- package/dist/components/Link/Link.cjs.map +1 -1
- package/dist/components/Link/Link.d.ts +169 -0
- package/dist/components/Link/Link.d.ts.map +1 -1
- package/dist/components/Link/Link.mjs +0 -4
- package/dist/components/Link/Link.mjs.map +1 -1
- package/dist/components/Loader/index.cjs.map +1 -1
- package/dist/components/Loader/index.d.ts +82 -11
- package/dist/components/Loader/index.d.ts.map +1 -1
- package/dist/components/Loader/index.mjs.map +1 -1
- package/dist/components/Loader/spinner.cjs.map +1 -1
- package/dist/components/Loader/spinner.d.ts +56 -0
- package/dist/components/Loader/spinner.d.ts.map +1 -1
- package/dist/components/Loader/spinner.mjs.map +1 -1
- package/dist/components/MarkDownRender/MarkDownRender.cjs +0 -1
- package/dist/components/MarkDownRender/MarkDownRender.cjs.map +1 -1
- package/dist/components/MarkDownRender/MarkDownRender.d.ts +147 -0
- package/dist/components/MarkDownRender/MarkDownRender.d.ts.map +1 -1
- package/dist/components/MarkDownRender/MarkDownRender.mjs +0 -1
- package/dist/components/MarkDownRender/MarkDownRender.mjs.map +1 -1
- package/dist/components/MarkDownRender/processor.cjs +12 -9
- package/dist/components/MarkDownRender/processor.cjs.map +1 -1
- package/dist/components/MarkDownRender/processor.d.ts.map +1 -1
- package/dist/components/MarkDownRender/processor.mjs +12 -9
- package/dist/components/MarkDownRender/processor.mjs.map +1 -1
- package/dist/components/MaxHeightSmoother/index.cjs.map +1 -1
- package/dist/components/MaxHeightSmoother/index.d.ts +152 -0
- package/dist/components/MaxHeightSmoother/index.d.ts.map +1 -1
- package/dist/components/MaxHeightSmoother/index.mjs.map +1 -1
- package/dist/components/Modal/Modal.cjs +5 -0
- package/dist/components/Modal/Modal.cjs.map +1 -1
- package/dist/components/Modal/Modal.d.ts +81 -3
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.mjs +5 -0
- package/dist/components/Modal/Modal.mjs.map +1 -1
- package/dist/components/Navbar/Burger.cjs.map +1 -1
- package/dist/components/Navbar/Burger.d.ts +54 -0
- package/dist/components/Navbar/Burger.d.ts.map +1 -1
- package/dist/components/Navbar/Burger.mjs.map +1 -1
- package/dist/components/Navbar/DesktopNavbar.cjs.map +1 -1
- package/dist/components/Navbar/DesktopNavbar.d.ts +78 -0
- package/dist/components/Navbar/DesktopNavbar.d.ts.map +1 -1
- package/dist/components/Navbar/DesktopNavbar.mjs.map +1 -1
- package/dist/components/Navbar/MobileNavbar.cjs.map +1 -1
- package/dist/components/Navbar/MobileNavbar.d.ts +88 -0
- package/dist/components/Navbar/MobileNavbar.d.ts.map +1 -1
- package/dist/components/Navbar/MobileNavbar.mjs.map +1 -1
- package/dist/components/Navbar/index.cjs.map +1 -1
- package/dist/components/Navbar/index.d.ts +69 -0
- package/dist/components/Navbar/index.d.ts.map +1 -1
- package/dist/components/Navbar/index.mjs.map +1 -1
- package/dist/components/Navbar/useNavigation.cjs +8 -1
- package/dist/components/Navbar/useNavigation.cjs.map +1 -1
- package/dist/components/Navbar/useNavigation.d.ts +83 -0
- package/dist/components/Navbar/useNavigation.d.ts.map +1 -1
- package/dist/components/Navbar/useNavigation.mjs +8 -1
- package/dist/components/Navbar/useNavigation.mjs.map +1 -1
- package/dist/components/Pattern/DotPattern.cjs.map +1 -1
- package/dist/components/Pattern/DotPattern.d.ts +101 -0
- package/dist/components/Pattern/DotPattern.d.ts.map +1 -1
- package/dist/components/Pattern/DotPattern.mjs.map +1 -1
- package/dist/components/Pattern/GridPattern.cjs.map +1 -1
- package/dist/components/Pattern/GridPattern.d.ts +114 -0
- package/dist/components/Pattern/GridPattern.d.ts.map +1 -1
- package/dist/components/Pattern/GridPattern.mjs.map +1 -1
- package/dist/components/Pattern/SpotLight.cjs.map +1 -1
- package/dist/components/Pattern/SpotLight.d.ts +125 -0
- package/dist/components/Pattern/SpotLight.d.ts.map +1 -1
- package/dist/components/Pattern/SpotLight.mjs.map +1 -1
- package/dist/components/Popover/index.cjs +10 -10
- package/dist/components/Popover/index.cjs.map +1 -1
- package/dist/components/Popover/index.d.ts +110 -15
- package/dist/components/Popover/index.d.ts.map +1 -1
- package/dist/components/Popover/index.mjs +10 -10
- package/dist/components/Popover/index.mjs.map +1 -1
- package/dist/components/PressableSpan/PressableSpan.cjs +22 -5
- package/dist/components/PressableSpan/PressableSpan.cjs.map +1 -1
- package/dist/components/PressableSpan/PressableSpan.d.ts +105 -3
- package/dist/components/PressableSpan/PressableSpan.d.ts.map +1 -1
- package/dist/components/PressableSpan/PressableSpan.mjs +22 -5
- package/dist/components/PressableSpan/PressableSpan.mjs.map +1 -1
- package/dist/components/RightDrawer/RightDrawer.cjs.map +1 -1
- package/dist/components/RightDrawer/RightDrawer.d.ts +182 -0
- package/dist/components/RightDrawer/RightDrawer.d.ts.map +1 -1
- package/dist/components/RightDrawer/RightDrawer.mjs.map +1 -1
- package/dist/components/RightDrawer/isElementAtTopAndNotCovered.cjs.map +1 -1
- package/dist/components/RightDrawer/isElementAtTopAndNotCovered.d.ts +44 -0
- package/dist/components/RightDrawer/isElementAtTopAndNotCovered.d.ts.map +1 -1
- package/dist/components/RightDrawer/isElementAtTopAndNotCovered.mjs.map +1 -1
- package/dist/components/RightDrawer/useRightDrawerStore.cjs.map +1 -1
- package/dist/components/RightDrawer/useRightDrawerStore.d.ts +102 -0
- package/dist/components/RightDrawer/useRightDrawerStore.d.ts.map +1 -1
- package/dist/components/RightDrawer/useRightDrawerStore.mjs.map +1 -1
- package/dist/components/Select/Multiselect.cjs.map +1 -1
- package/dist/components/Select/Multiselect.d.ts +125 -18
- package/dist/components/Select/Multiselect.d.ts.map +1 -1
- package/dist/components/Select/Multiselect.mjs.map +1 -1
- package/dist/components/Select/Select.cjs.map +1 -1
- package/dist/components/Select/Select.d.ts +214 -7
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.mjs.map +1 -1
- package/dist/components/SwitchSelector/index.cjs.map +1 -1
- package/dist/components/SwitchSelector/index.d.ts +157 -8
- package/dist/components/SwitchSelector/index.d.ts.map +1 -1
- package/dist/components/SwitchSelector/index.mjs.map +1 -1
- package/dist/components/Table/Table.cjs.map +1 -1
- package/dist/components/Table/Table.d.ts +184 -0
- package/dist/components/Table/Table.d.ts.map +1 -1
- package/dist/components/Table/Table.mjs.map +1 -1
- package/dist/components/Tag/index.cjs.map +1 -1
- package/dist/components/Tag/index.d.ts +223 -0
- package/dist/components/Tag/index.d.ts.map +1 -1
- package/dist/components/Tag/index.mjs.map +1 -1
- package/dist/components/TextArea/AutoSizeTextArea.cjs.map +1 -1
- package/dist/components/TextArea/AutoSizeTextArea.d.ts +91 -0
- package/dist/components/TextArea/AutoSizeTextArea.d.ts.map +1 -1
- package/dist/components/TextArea/AutoSizeTextArea.mjs.map +1 -1
- package/dist/components/TextArea/AutocompleteTextArea.cjs.map +1 -1
- package/dist/components/TextArea/AutocompleteTextArea.d.ts +145 -0
- package/dist/components/TextArea/AutocompleteTextArea.d.ts.map +1 -1
- package/dist/components/TextArea/AutocompleteTextArea.mjs.map +1 -1
- package/dist/components/TextArea/TextArea.cjs.map +1 -1
- package/dist/components/TextArea/TextArea.d.ts +74 -0
- package/dist/components/TextArea/TextArea.d.ts.map +1 -1
- package/dist/components/TextArea/TextArea.mjs.map +1 -1
- package/dist/components/Toaster/Toast.cjs +4 -0
- package/dist/components/Toaster/Toast.cjs.map +1 -1
- package/dist/components/Toaster/Toast.d.ts +148 -2
- package/dist/components/Toaster/Toast.d.ts.map +1 -1
- package/dist/components/Toaster/Toast.mjs +4 -0
- package/dist/components/Toaster/Toast.mjs.map +1 -1
- package/dist/components/Toaster/Toaster.cjs.map +1 -1
- package/dist/components/Toaster/Toaster.d.ts +42 -0
- package/dist/components/Toaster/Toaster.d.ts.map +1 -1
- package/dist/components/Toaster/Toaster.mjs.map +1 -1
- package/dist/components/Toaster/useToast.cjs.map +1 -1
- package/dist/components/Toaster/useToast.d.ts +199 -2
- package/dist/components/Toaster/useToast.d.ts.map +1 -1
- package/dist/components/Toaster/useToast.mjs.map +1 -1
- package/dist/components/WithResizer/index.cjs.map +1 -1
- package/dist/components/WithResizer/index.d.ts +143 -0
- package/dist/components/WithResizer/index.d.ts.map +1 -1
- package/dist/components/WithResizer/index.mjs.map +1 -1
- package/dist/components/index.cjs +2 -2
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.mjs +4 -4
- package/dist/components/index.mjs.map +1 -1
- package/dist/hooks/auth.cjs +2 -2
- package/dist/hooks/auth.cjs.map +1 -1
- package/dist/hooks/auth.mjs +2 -2
- package/dist/hooks/auth.mjs.map +1 -1
- package/dist/hooks/reactQuery.cjs +2 -1
- package/dist/hooks/reactQuery.cjs.map +1 -1
- package/dist/hooks/reactQuery.d.ts +1 -1
- package/dist/hooks/reactQuery.d.ts.map +1 -1
- package/dist/hooks/reactQuery.mjs +2 -1
- package/dist/hooks/reactQuery.mjs.map +1 -1
- package/dist/hooks/useAuth/useOAuth2.cjs +3 -3
- package/dist/hooks/useAuth/useOAuth2.cjs.map +1 -1
- package/dist/hooks/useAuth/useOAuth2.mjs +3 -3
- package/dist/hooks/useAuth/useOAuth2.mjs.map +1 -1
- package/dist/hooks/useAuth/useSession.cjs +3 -3
- package/dist/hooks/useAuth/useSession.cjs.map +1 -1
- package/dist/hooks/useAuth/useSession.mjs +3 -3
- package/dist/hooks/useAuth/useSession.mjs.map +1 -1
- package/dist/utils/image.cjs +30 -0
- package/dist/utils/image.cjs.map +1 -0
- package/dist/utils/image.d.ts +37 -0
- package/dist/utils/image.d.ts.map +1 -0
- package/dist/utils/image.mjs +30 -0
- package/dist/utils/image.mjs.map +1 -0
- package/package.json +20 -18
- package/dist/utils/capitalize.cjs +0 -10
- package/dist/utils/capitalize.cjs.map +0 -1
- package/dist/utils/capitalize.d.ts +0 -2
- package/dist/utils/capitalize.d.ts.map +0 -1
- package/dist/utils/capitalize.mjs +0 -10
- package/dist/utils/capitalize.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ContentEditor/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ContentEditor/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { ContentEditor } from "./ContentEditor.mjs";
|
|
2
|
+
import { ContentEditorInput } from "./ContentEditorInput.mjs";
|
|
3
|
+
import { ContentEditorTextArea } from "./ContentEditorTextArea.mjs";
|
|
2
4
|
export {
|
|
3
|
-
ContentEditor
|
|
5
|
+
ContentEditor,
|
|
6
|
+
ContentEditorInput,
|
|
7
|
+
ContentEditorTextArea
|
|
4
8
|
};
|
|
5
9
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -7,13 +7,21 @@ const ContentSelector = ({
|
|
|
7
7
|
children,
|
|
8
8
|
onSelect,
|
|
9
9
|
onUnselect,
|
|
10
|
-
isSelecting
|
|
10
|
+
isSelecting,
|
|
11
|
+
pressDuration,
|
|
12
|
+
className,
|
|
13
|
+
"aria-label": ariaLabel,
|
|
14
|
+
"aria-describedby": ariaDescribedBy
|
|
11
15
|
}) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
12
16
|
components_PressableSpan_PressableSpan.PressableSpan,
|
|
13
17
|
{
|
|
14
18
|
onPress: onSelect,
|
|
15
19
|
onClickOutside: onUnselect,
|
|
16
20
|
isSelecting,
|
|
21
|
+
pressDuration,
|
|
22
|
+
className,
|
|
23
|
+
"aria-label": ariaLabel,
|
|
24
|
+
"aria-describedby": ariaDescribedBy,
|
|
17
25
|
children
|
|
18
26
|
}
|
|
19
27
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentSelector.cjs","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, ReactNode } from 'react';\nimport { PressableSpan } from '../PressableSpan';\n\ntype ContentSelectorProps = {\n children: ReactNode;\n onSelect: () => void;\n onUnselect?: () => void;\n isSelecting?: boolean;\n};\n\nexport const ContentSelector: FC<ContentSelectorProps> = ({\n children,\n onSelect,\n onUnselect,\n isSelecting,\n}) => (\n <PressableSpan\n onPress={onSelect}\n onClickOutside={onUnselect}\n isSelecting={isSelecting}\n >\n {children}\n </PressableSpan>\n);\n"],"names":["jsx","PressableSpan"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"ContentSelector.cjs","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, ReactNode } from 'react';\nimport { PressableSpan } from '../PressableSpan';\n\n/**\n * Props for the ContentSelector component\n */\ntype ContentSelectorProps = {\n /**\n * The content to be displayed and made selectable\n * @example\n * ```tsx\n * <ContentSelector onSelect={() => startEditing()}>\n * <h1>Selectable Heading</h1>\n * </ContentSelector>\n * ```\n */\n children: ReactNode;\n\n /**\n * Callback function triggered when content is selected via long press or keyboard\n * @example\n * ```tsx\n * <ContentSelector\n * onSelect={() => setEditMode(true)}\n * onUnselect={() => setEditMode(false)}\n * >\n * Click content to edit\n * </ContentSelector>\n * ```\n */\n onSelect: () => void;\n\n /**\n * Optional callback function triggered when clicking outside the selected content\n * Used to deselect the content and exit edit/selection mode\n * @example\n * ```tsx\n * <ContentSelector\n * onSelect={() => enterEditMode()}\n * onUnselect={() => exitEditMode()}\n * >\n * Editable content with auto-deselect\n * </ContentSelector>\n * ```\n */\n onUnselect?: () => void;\n\n /**\n * External control for the selection state\n * When provided, overrides the internal selection state\n * @example\n * ```tsx\n * <ContentSelector\n * isSelecting={isInEditMode}\n * onSelect={() => {}}\n * >\n * Externally controlled content\n * </ContentSelector>\n * ```\n */\n isSelecting?: boolean;\n\n /**\n * Duration in milliseconds for long press detection\n * @default 400\n * @example\n * ```tsx\n * <ContentSelector\n * pressDuration={600}\n * onSelect={() => activateSlowSelection()}\n * >\n * Requires longer press\n * </ContentSelector>\n * ```\n */\n pressDuration?: number;\n\n /**\n * Additional CSS classes for styling the selectable content\n * @example\n * ```tsx\n * <ContentSelector\n * className=\"border-2 border-dashed border-blue-300\"\n * onSelect={() => {}}\n * >\n * Styled selectable content\n * </ContentSelector>\n * ```\n */\n className?: string;\n\n /**\n * ARIA label for accessibility\n * Provides context about what happens when the content is selected\n * @example\n * ```tsx\n * <ContentSelector\n * aria-label=\"Select to edit this content\"\n * onSelect={() => {}}\n * >\n * Content with accessibility context\n * </ContentSelector>\n * ```\n */\n 'aria-label'?: string;\n\n /**\n * ID of element providing additional description\n * @example\n * ```tsx\n * <ContentSelector\n * aria-describedby=\"help-text\"\n * onSelect={() => {}}\n * >\n * Content with help\n * </ContentSelector>\n * <div id=\"help-text\">Long press to edit</div>\n * ```\n */\n 'aria-describedby'?: string;\n};\n\n/**\n * ContentSelector - A higher-level wrapper around PressableSpan for content selection\n *\n * This component provides a semantic interface for making any content selectable through\n * long press gestures. It's specifically designed for content management interfaces\n * where users need to select text, images, or other elements to perform actions like\n * editing, moving, or applying operations.\n *\n * ## Key Features\n * - **Content Selection**: Makes any React content selectable via long press\n * - **Visual Feedback**: Inherits outline-based selection indicators from PressableSpan\n * - **Accessibility**: Full keyboard navigation and screen reader support\n * - **Click Outside**: Automatic deselection when clicking elsewhere\n * - **External Control**: Can be controlled externally for complex selection states\n *\n * ## Use Cases\n * - Content management systems with inline editing\n * - Text and media selection interfaces\n * - Interactive documentation with selectable sections\n * - Dashboard widgets with configurable content\n * - Form builders with selectable form elements\n *\n * ## Accessibility\n * - Inherits all accessibility features from PressableSpan\n * - Keyboard navigation with Tab, Enter, Space, and Escape\n * - Screen reader announcements for selection states\n * - Focus management and proper ARIA attributes\n *\n * @example\n * Basic content selection:\n * ```tsx\n * <ContentSelector onSelect={() => setIsEditing(true)}>\n * <p>This paragraph becomes selectable</p>\n * </ContentSelector>\n * ```\n *\n * @example\n * With deselection handling:\n * ```tsx\n * <ContentSelector\n * onSelect={() => setSelectedContent(contentId)}\n * onUnselect={() => setSelectedContent(null)}\n * >\n * <div className=\"content-block\">\n * <h2>Selectable Content Block</h2>\n * <p>Long press to select this entire block</p>\n * </div>\n * </ContentSelector>\n * ```\n *\n * @example\n * Controlled selection state:\n * ```tsx\n * <ContentSelector\n * isSelecting={selectedItems.includes(itemId)}\n * onSelect={() => selectItem(itemId)}\n * onUnselect={() => deselectItem(itemId)}\n * >\n * <ContentCard data={cardData} />\n * </ContentSelector>\n * ```\n */\n\nexport const ContentSelector: FC<ContentSelectorProps> = ({\n children,\n onSelect,\n onUnselect,\n isSelecting,\n pressDuration,\n className,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n}) => (\n <PressableSpan\n onPress={onSelect}\n onClickOutside={onUnselect}\n isSelecting={isSelecting}\n pressDuration={pressDuration}\n className={className}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {children}\n </PressableSpan>\n);\n"],"names":["jsx","PressableSpan"],"mappings":";;;;;AA2LO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,oBAAoB;AACtB,MACEA,2BAAAA;AAAAA,EAACC,uCAAAA;AAAAA,EAAA;AAAA,IACC,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAY;AAAA,IACZ,oBAAkB;AAAA,IAEjB;AAAA,EAAA;AACH;;"}
|
|
@@ -1,10 +1,177 @@
|
|
|
1
1
|
import { FC, ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Props for the ContentSelector component
|
|
4
|
+
*/
|
|
2
5
|
type ContentSelectorProps = {
|
|
6
|
+
/**
|
|
7
|
+
* The content to be displayed and made selectable
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* <ContentSelector onSelect={() => startEditing()}>
|
|
11
|
+
* <h1>Selectable Heading</h1>
|
|
12
|
+
* </ContentSelector>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
3
15
|
children: ReactNode;
|
|
16
|
+
/**
|
|
17
|
+
* Callback function triggered when content is selected via long press or keyboard
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <ContentSelector
|
|
21
|
+
* onSelect={() => setEditMode(true)}
|
|
22
|
+
* onUnselect={() => setEditMode(false)}
|
|
23
|
+
* >
|
|
24
|
+
* Click content to edit
|
|
25
|
+
* </ContentSelector>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
4
28
|
onSelect: () => void;
|
|
29
|
+
/**
|
|
30
|
+
* Optional callback function triggered when clicking outside the selected content
|
|
31
|
+
* Used to deselect the content and exit edit/selection mode
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* <ContentSelector
|
|
35
|
+
* onSelect={() => enterEditMode()}
|
|
36
|
+
* onUnselect={() => exitEditMode()}
|
|
37
|
+
* >
|
|
38
|
+
* Editable content with auto-deselect
|
|
39
|
+
* </ContentSelector>
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
5
42
|
onUnselect?: () => void;
|
|
43
|
+
/**
|
|
44
|
+
* External control for the selection state
|
|
45
|
+
* When provided, overrides the internal selection state
|
|
46
|
+
* @example
|
|
47
|
+
* ```tsx
|
|
48
|
+
* <ContentSelector
|
|
49
|
+
* isSelecting={isInEditMode}
|
|
50
|
+
* onSelect={() => {}}
|
|
51
|
+
* >
|
|
52
|
+
* Externally controlled content
|
|
53
|
+
* </ContentSelector>
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
6
56
|
isSelecting?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Duration in milliseconds for long press detection
|
|
59
|
+
* @default 400
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* <ContentSelector
|
|
63
|
+
* pressDuration={600}
|
|
64
|
+
* onSelect={() => activateSlowSelection()}
|
|
65
|
+
* >
|
|
66
|
+
* Requires longer press
|
|
67
|
+
* </ContentSelector>
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
pressDuration?: number;
|
|
71
|
+
/**
|
|
72
|
+
* Additional CSS classes for styling the selectable content
|
|
73
|
+
* @example
|
|
74
|
+
* ```tsx
|
|
75
|
+
* <ContentSelector
|
|
76
|
+
* className="border-2 border-dashed border-blue-300"
|
|
77
|
+
* onSelect={() => {}}
|
|
78
|
+
* >
|
|
79
|
+
* Styled selectable content
|
|
80
|
+
* </ContentSelector>
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
className?: string;
|
|
84
|
+
/**
|
|
85
|
+
* ARIA label for accessibility
|
|
86
|
+
* Provides context about what happens when the content is selected
|
|
87
|
+
* @example
|
|
88
|
+
* ```tsx
|
|
89
|
+
* <ContentSelector
|
|
90
|
+
* aria-label="Select to edit this content"
|
|
91
|
+
* onSelect={() => {}}
|
|
92
|
+
* >
|
|
93
|
+
* Content with accessibility context
|
|
94
|
+
* </ContentSelector>
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
'aria-label'?: string;
|
|
98
|
+
/**
|
|
99
|
+
* ID of element providing additional description
|
|
100
|
+
* @example
|
|
101
|
+
* ```tsx
|
|
102
|
+
* <ContentSelector
|
|
103
|
+
* aria-describedby="help-text"
|
|
104
|
+
* onSelect={() => {}}
|
|
105
|
+
* >
|
|
106
|
+
* Content with help
|
|
107
|
+
* </ContentSelector>
|
|
108
|
+
* <div id="help-text">Long press to edit</div>
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
'aria-describedby'?: string;
|
|
7
112
|
};
|
|
113
|
+
/**
|
|
114
|
+
* ContentSelector - A higher-level wrapper around PressableSpan for content selection
|
|
115
|
+
*
|
|
116
|
+
* This component provides a semantic interface for making any content selectable through
|
|
117
|
+
* long press gestures. It's specifically designed for content management interfaces
|
|
118
|
+
* where users need to select text, images, or other elements to perform actions like
|
|
119
|
+
* editing, moving, or applying operations.
|
|
120
|
+
*
|
|
121
|
+
* ## Key Features
|
|
122
|
+
* - **Content Selection**: Makes any React content selectable via long press
|
|
123
|
+
* - **Visual Feedback**: Inherits outline-based selection indicators from PressableSpan
|
|
124
|
+
* - **Accessibility**: Full keyboard navigation and screen reader support
|
|
125
|
+
* - **Click Outside**: Automatic deselection when clicking elsewhere
|
|
126
|
+
* - **External Control**: Can be controlled externally for complex selection states
|
|
127
|
+
*
|
|
128
|
+
* ## Use Cases
|
|
129
|
+
* - Content management systems with inline editing
|
|
130
|
+
* - Text and media selection interfaces
|
|
131
|
+
* - Interactive documentation with selectable sections
|
|
132
|
+
* - Dashboard widgets with configurable content
|
|
133
|
+
* - Form builders with selectable form elements
|
|
134
|
+
*
|
|
135
|
+
* ## Accessibility
|
|
136
|
+
* - Inherits all accessibility features from PressableSpan
|
|
137
|
+
* - Keyboard navigation with Tab, Enter, Space, and Escape
|
|
138
|
+
* - Screen reader announcements for selection states
|
|
139
|
+
* - Focus management and proper ARIA attributes
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* Basic content selection:
|
|
143
|
+
* ```tsx
|
|
144
|
+
* <ContentSelector onSelect={() => setIsEditing(true)}>
|
|
145
|
+
* <p>This paragraph becomes selectable</p>
|
|
146
|
+
* </ContentSelector>
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* With deselection handling:
|
|
151
|
+
* ```tsx
|
|
152
|
+
* <ContentSelector
|
|
153
|
+
* onSelect={() => setSelectedContent(contentId)}
|
|
154
|
+
* onUnselect={() => setSelectedContent(null)}
|
|
155
|
+
* >
|
|
156
|
+
* <div className="content-block">
|
|
157
|
+
* <h2>Selectable Content Block</h2>
|
|
158
|
+
* <p>Long press to select this entire block</p>
|
|
159
|
+
* </div>
|
|
160
|
+
* </ContentSelector>
|
|
161
|
+
* ```
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* Controlled selection state:
|
|
165
|
+
* ```tsx
|
|
166
|
+
* <ContentSelector
|
|
167
|
+
* isSelecting={selectedItems.includes(itemId)}
|
|
168
|
+
* onSelect={() => selectItem(itemId)}
|
|
169
|
+
* onUnselect={() => deselectItem(itemId)}
|
|
170
|
+
* >
|
|
171
|
+
* <ContentCard data={cardData} />
|
|
172
|
+
* </ContentSelector>
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
8
175
|
export declare const ContentSelector: FC<ContentSelectorProps>;
|
|
9
176
|
export {};
|
|
10
177
|
//# sourceMappingURL=ContentSelector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentSelector.d.ts","sourceRoot":"","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ContentSelector.d.ts","sourceRoot":"","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C;;GAEG;AACH,KAAK,oBAAoB,GAAG;IAC1B;;;;;;;;OAQG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;;;;;;;;OAWG;IACH,QAAQ,EAAE,MAAM,IAAI,CAAC;IAErB;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IAExB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;;;;OAYG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAEH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAqBpD,CAAC"}
|
|
@@ -5,13 +5,21 @@ const ContentSelector = ({
|
|
|
5
5
|
children,
|
|
6
6
|
onSelect,
|
|
7
7
|
onUnselect,
|
|
8
|
-
isSelecting
|
|
8
|
+
isSelecting,
|
|
9
|
+
pressDuration,
|
|
10
|
+
className,
|
|
11
|
+
"aria-label": ariaLabel,
|
|
12
|
+
"aria-describedby": ariaDescribedBy
|
|
9
13
|
}) => /* @__PURE__ */ jsx(
|
|
10
14
|
PressableSpan,
|
|
11
15
|
{
|
|
12
16
|
onPress: onSelect,
|
|
13
17
|
onClickOutside: onUnselect,
|
|
14
18
|
isSelecting,
|
|
19
|
+
pressDuration,
|
|
20
|
+
className,
|
|
21
|
+
"aria-label": ariaLabel,
|
|
22
|
+
"aria-describedby": ariaDescribedBy,
|
|
15
23
|
children
|
|
16
24
|
}
|
|
17
25
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentSelector.mjs","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, ReactNode } from 'react';\nimport { PressableSpan } from '../PressableSpan';\n\ntype ContentSelectorProps = {\n children: ReactNode;\n onSelect: () => void;\n onUnselect?: () => void;\n isSelecting?: boolean;\n};\n\nexport const ContentSelector: FC<ContentSelectorProps> = ({\n children,\n onSelect,\n onUnselect,\n isSelecting,\n}) => (\n <PressableSpan\n onPress={onSelect}\n onClickOutside={onUnselect}\n isSelecting={isSelecting}\n >\n {children}\n </PressableSpan>\n);\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ContentSelector.mjs","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, ReactNode } from 'react';\nimport { PressableSpan } from '../PressableSpan';\n\n/**\n * Props for the ContentSelector component\n */\ntype ContentSelectorProps = {\n /**\n * The content to be displayed and made selectable\n * @example\n * ```tsx\n * <ContentSelector onSelect={() => startEditing()}>\n * <h1>Selectable Heading</h1>\n * </ContentSelector>\n * ```\n */\n children: ReactNode;\n\n /**\n * Callback function triggered when content is selected via long press or keyboard\n * @example\n * ```tsx\n * <ContentSelector\n * onSelect={() => setEditMode(true)}\n * onUnselect={() => setEditMode(false)}\n * >\n * Click content to edit\n * </ContentSelector>\n * ```\n */\n onSelect: () => void;\n\n /**\n * Optional callback function triggered when clicking outside the selected content\n * Used to deselect the content and exit edit/selection mode\n * @example\n * ```tsx\n * <ContentSelector\n * onSelect={() => enterEditMode()}\n * onUnselect={() => exitEditMode()}\n * >\n * Editable content with auto-deselect\n * </ContentSelector>\n * ```\n */\n onUnselect?: () => void;\n\n /**\n * External control for the selection state\n * When provided, overrides the internal selection state\n * @example\n * ```tsx\n * <ContentSelector\n * isSelecting={isInEditMode}\n * onSelect={() => {}}\n * >\n * Externally controlled content\n * </ContentSelector>\n * ```\n */\n isSelecting?: boolean;\n\n /**\n * Duration in milliseconds for long press detection\n * @default 400\n * @example\n * ```tsx\n * <ContentSelector\n * pressDuration={600}\n * onSelect={() => activateSlowSelection()}\n * >\n * Requires longer press\n * </ContentSelector>\n * ```\n */\n pressDuration?: number;\n\n /**\n * Additional CSS classes for styling the selectable content\n * @example\n * ```tsx\n * <ContentSelector\n * className=\"border-2 border-dashed border-blue-300\"\n * onSelect={() => {}}\n * >\n * Styled selectable content\n * </ContentSelector>\n * ```\n */\n className?: string;\n\n /**\n * ARIA label for accessibility\n * Provides context about what happens when the content is selected\n * @example\n * ```tsx\n * <ContentSelector\n * aria-label=\"Select to edit this content\"\n * onSelect={() => {}}\n * >\n * Content with accessibility context\n * </ContentSelector>\n * ```\n */\n 'aria-label'?: string;\n\n /**\n * ID of element providing additional description\n * @example\n * ```tsx\n * <ContentSelector\n * aria-describedby=\"help-text\"\n * onSelect={() => {}}\n * >\n * Content with help\n * </ContentSelector>\n * <div id=\"help-text\">Long press to edit</div>\n * ```\n */\n 'aria-describedby'?: string;\n};\n\n/**\n * ContentSelector - A higher-level wrapper around PressableSpan for content selection\n *\n * This component provides a semantic interface for making any content selectable through\n * long press gestures. It's specifically designed for content management interfaces\n * where users need to select text, images, or other elements to perform actions like\n * editing, moving, or applying operations.\n *\n * ## Key Features\n * - **Content Selection**: Makes any React content selectable via long press\n * - **Visual Feedback**: Inherits outline-based selection indicators from PressableSpan\n * - **Accessibility**: Full keyboard navigation and screen reader support\n * - **Click Outside**: Automatic deselection when clicking elsewhere\n * - **External Control**: Can be controlled externally for complex selection states\n *\n * ## Use Cases\n * - Content management systems with inline editing\n * - Text and media selection interfaces\n * - Interactive documentation with selectable sections\n * - Dashboard widgets with configurable content\n * - Form builders with selectable form elements\n *\n * ## Accessibility\n * - Inherits all accessibility features from PressableSpan\n * - Keyboard navigation with Tab, Enter, Space, and Escape\n * - Screen reader announcements for selection states\n * - Focus management and proper ARIA attributes\n *\n * @example\n * Basic content selection:\n * ```tsx\n * <ContentSelector onSelect={() => setIsEditing(true)}>\n * <p>This paragraph becomes selectable</p>\n * </ContentSelector>\n * ```\n *\n * @example\n * With deselection handling:\n * ```tsx\n * <ContentSelector\n * onSelect={() => setSelectedContent(contentId)}\n * onUnselect={() => setSelectedContent(null)}\n * >\n * <div className=\"content-block\">\n * <h2>Selectable Content Block</h2>\n * <p>Long press to select this entire block</p>\n * </div>\n * </ContentSelector>\n * ```\n *\n * @example\n * Controlled selection state:\n * ```tsx\n * <ContentSelector\n * isSelecting={selectedItems.includes(itemId)}\n * onSelect={() => selectItem(itemId)}\n * onUnselect={() => deselectItem(itemId)}\n * >\n * <ContentCard data={cardData} />\n * </ContentSelector>\n * ```\n */\n\nexport const ContentSelector: FC<ContentSelectorProps> = ({\n children,\n onSelect,\n onUnselect,\n isSelecting,\n pressDuration,\n className,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n}) => (\n <PressableSpan\n onPress={onSelect}\n onClickOutside={onUnselect}\n isSelecting={isSelecting}\n pressDuration={pressDuration}\n className={className}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {children}\n </PressableSpan>\n);\n"],"names":[],"mappings":";;;AA2LO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,oBAAoB;AACtB,MACE;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAY;AAAA,IACZ,oBAAkB;AAAA,IAEjB;AAAA,EAAA;AACH;"}
|
|
@@ -8,21 +8,32 @@ const reactIntlayer = require("react-intlayer");
|
|
|
8
8
|
const components_Button_Button = require("../Button/Button.cjs");
|
|
9
9
|
const CopyButton = ({ content, ...props }) => {
|
|
10
10
|
const [copied, setCopied] = ReactExports.useState(false);
|
|
11
|
+
const [error, setError] = ReactExports.useState(false);
|
|
11
12
|
const { label } = reactIntlayer.useIntlayer("copy-button");
|
|
12
13
|
const handleCopy = async () => {
|
|
13
14
|
try {
|
|
15
|
+
setError(false);
|
|
14
16
|
await navigator.clipboard.writeText(content);
|
|
15
17
|
setCopied(true);
|
|
16
|
-
} catch (
|
|
17
|
-
console.error("Failed to copy text: ",
|
|
18
|
+
} catch (error2) {
|
|
19
|
+
console.error("Failed to copy text: ", error2);
|
|
20
|
+
setError(true);
|
|
18
21
|
}
|
|
19
22
|
};
|
|
20
23
|
ReactExports.useEffect(() => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
if (copied || error) {
|
|
25
|
+
const timer = setTimeout(() => {
|
|
26
|
+
setCopied(false);
|
|
27
|
+
setError(false);
|
|
28
|
+
}, 1e3);
|
|
29
|
+
return () => clearTimeout(timer);
|
|
30
|
+
}
|
|
31
|
+
}, [copied, error]);
|
|
32
|
+
const getAriaLabel = () => {
|
|
33
|
+
if (copied) return "Content copied to clipboard";
|
|
34
|
+
if (error) return "Failed to copy content";
|
|
35
|
+
return props.label ?? label.value;
|
|
36
|
+
};
|
|
26
37
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
27
38
|
components_Button_Button.Button,
|
|
28
39
|
{
|
|
@@ -31,8 +42,12 @@ const CopyButton = ({ content, ...props }) => {
|
|
|
31
42
|
variant: components_Button_Button.ButtonVariant.HOVERABLE,
|
|
32
43
|
color: components_Button_Button.ButtonColor.TEXT,
|
|
33
44
|
size: components_Button_Button.ButtonSize.ICON_SM,
|
|
45
|
+
tabIndex: 0,
|
|
46
|
+
title: getAriaLabel(),
|
|
34
47
|
...props,
|
|
35
|
-
label:
|
|
48
|
+
label: getAriaLabel(),
|
|
49
|
+
"aria-describedby": copied ? "copy-success" : error ? "copy-error" : void 0,
|
|
50
|
+
className: `${props.className || ""} ${error ? "text-red-500" : copied ? "text-green-500" : ""}`
|
|
36
51
|
}
|
|
37
52
|
);
|
|
38
53
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/CopyButton/index.tsx"],"sourcesContent":["'use client';\n\nimport { CopyCheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState, type FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport {\n Button,\n ButtonColor,\n ButtonProps,\n ButtonSize,\n ButtonVariant,\n} from '../Button';\n\ntype CopyButtonProps = {\n content: string;\n} & Partial<ButtonProps>;\n\nexport const CopyButton: FC<CopyButtonProps> = ({ content, ...props }) => {\n const [copied, setCopied] = useState(false);\n const { label } = useIntlayer('copy-button');\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n } catch (error) {\n console.error('Failed to copy text: ', error);\n }\n };\n\n useEffect(() => {\n const timer = setTimeout(() => {\n
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/CopyButton/index.tsx"],"sourcesContent":["'use client';\n\nimport { CopyCheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState, type FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport {\n Button,\n ButtonColor,\n ButtonProps,\n ButtonSize,\n ButtonVariant,\n} from '../Button';\n\n/**\n * Props for the CopyButton component\n */\ntype CopyButtonProps = {\n /**\n * The text content to copy to the clipboard\n * @example\n * ```tsx\n * <CopyButton content=\"Hello World!\" />\n * ```\n */\n content: string;\n} & Partial<ButtonProps>;\n\n/**\n * CopyButton - A specialized button component for copying text to the clipboard\n *\n * This component provides a user-friendly way to copy text content to the system clipboard\n * with visual feedback and accessibility features. It uses the modern Clipboard API with\n * fallback error handling, and provides clear visual indication of successful copy operations.\n *\n * ## Key Features\n * - **Clipboard Integration**: Uses modern Clipboard API for reliable text copying\n * - **Visual Feedback**: Icon changes from copy to check mark on successful copy\n * - **Auto-Reset**: Automatically reverts to copy icon after 1 second\n * - **Error Handling**: Graceful error handling with console logging\n * - **Accessibility**: Full keyboard navigation and screen reader support\n * - **Internationalization**: Multi-language support via Intlayer\n *\n * ## Use Cases\n * - Code snippet copying in documentation\n * - Sharing URLs or links\n * - Copying configuration values\n * - Form data duplication\n * - API key or token copying\n * - Text content sharing in interfaces\n *\n * ## Accessibility\n * - Uses semantic button element with proper ARIA labeling\n * - Keyboard accessible (Tab, Enter, Space)\n * - Screen reader announces copy actions\n * - Focus management with visible indicators\n * - Proper error state handling for assistive technologies\n *\n * ## Browser Compatibility\n * - Requires modern browsers with Clipboard API support\n * - Falls back gracefully with error logging for unsupported browsers\n * - Works in secure contexts (HTTPS) as required by Clipboard API\n *\n * @example\n * Basic usage:\n * ```tsx\n * <CopyButton content=\"Text to copy\" />\n * ```\n *\n * @example\n * With custom styling and label:\n * ```tsx\n * <CopyButton\n * content=\"https://example.com/api/endpoint\"\n * label=\"Copy API endpoint\"\n * variant={ButtonVariant.OUTLINE}\n * color={ButtonColor.PRIMARY}\n * size={ButtonSize.ICON_MD}\n * />\n * ```\n *\n * @example\n * In a code block context:\n * ```tsx\n * <div className=\"relative\">\n * <pre className=\"bg-gray-100 p-4 rounded\">\n * <code>npm install @intlayer/design-system</code>\n * </pre>\n * <CopyButton\n * content=\"npm install @intlayer/design-system\"\n * className=\"absolute top-2 right-2\"\n * label=\"Copy installation command\"\n * />\n * </div>\n * ```\n */\n\nexport const CopyButton: FC<CopyButtonProps> = ({ content, ...props }) => {\n const [copied, setCopied] = useState(false);\n const [error, setError] = useState(false);\n const { label } = useIntlayer('copy-button');\n\n const handleCopy = async () => {\n try {\n setError(false);\n await navigator.clipboard.writeText(content);\n setCopied(true);\n } catch (error) {\n console.error('Failed to copy text: ', error);\n setError(true);\n }\n };\n\n useEffect(() => {\n if (copied || error) {\n const timer = setTimeout(() => {\n setCopied(false);\n setError(false);\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [copied, error]);\n\n // Determine the current state for accessibility\n const getAriaLabel = () => {\n if (copied) return 'Content copied to clipboard';\n if (error) return 'Failed to copy content';\n return props.label ?? label.value;\n };\n\n return (\n <Button\n Icon={copied ? CopyCheckIcon : CopyIcon}\n onClick={handleCopy}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n size={ButtonSize.ICON_SM}\n tabIndex={0}\n title={getAriaLabel()}\n {...props}\n label={getAriaLabel()}\n aria-describedby={\n copied ? 'copy-success' : error ? 'copy-error' : undefined\n }\n className={`${props.className || ''} ${error ? 'text-red-500' : copied ? 'text-green-500' : ''}`}\n />\n );\n};\n"],"names":["useState","useIntlayer","error","useEffect","jsx","Button","CopyCheckIcon","CopyIcon","ButtonVariant","ButtonColor","ButtonSize"],"mappings":";;;;;;;;AAgGO,MAAM,aAAkC,CAAC,EAAE,SAAS,GAAG,YAAY;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAIA,aAAAA,SAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,IAAIA,aAAAA,SAAS,KAAK;AACxC,QAAM,EAAE,MAAA,IAAUC,cAAAA,YAAY,aAAa;AAE3C,QAAM,aAAa,YAAY;AAC7B,QAAI;AACF,eAAS,KAAK;AACd,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,gBAAU,IAAI;AAAA,IAChB,SAASC,QAAO;AACd,cAAQ,MAAM,yBAAyBA,MAAK;AAC5C,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAEAC,eAAAA,UAAU,MAAM;AACd,QAAI,UAAU,OAAO;AACnB,YAAM,QAAQ,WAAW,MAAM;AAC7B,kBAAU,KAAK;AACf,iBAAS,KAAK;AAAA,MAChB,GAAG,GAAI;AACP,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAGlB,QAAM,eAAe,MAAM;AACzB,QAAI,OAAQ,QAAO;AACnB,QAAI,MAAO,QAAO;AAClB,WAAO,MAAM,SAAS,MAAM;AAAA,EAC9B;AAEA,SACEC,2BAAAA;AAAAA,IAACC,yBAAAA;AAAAA,IAAA;AAAA,MACC,MAAM,SAASC,YAAAA,gBAAgBC,YAAAA;AAAAA,MAC/B,SAAS;AAAA,MACT,SAASC,yBAAAA,cAAc;AAAA,MACvB,OAAOC,yBAAAA,YAAY;AAAA,MACnB,MAAMC,yBAAAA,WAAW;AAAA,MACjB,UAAU;AAAA,MACV,OAAO,aAAA;AAAA,MACN,GAAG;AAAA,MACJ,OAAO,aAAA;AAAA,MACP,oBACE,SAAS,iBAAiB,QAAQ,eAAe;AAAA,MAEnD,WAAW,GAAG,MAAM,aAAa,EAAE,IAAI,QAAQ,iBAAiB,SAAS,mBAAmB,EAAE;AAAA,IAAA;AAAA,EAAA;AAGpG;;"}
|
|
@@ -1,8 +1,86 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
2
|
import { ButtonProps } from '../Button';
|
|
3
|
+
/**
|
|
4
|
+
* Props for the CopyButton component
|
|
5
|
+
*/
|
|
3
6
|
type CopyButtonProps = {
|
|
7
|
+
/**
|
|
8
|
+
* The text content to copy to the clipboard
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* <CopyButton content="Hello World!" />
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
4
14
|
content: string;
|
|
5
15
|
} & Partial<ButtonProps>;
|
|
16
|
+
/**
|
|
17
|
+
* CopyButton - A specialized button component for copying text to the clipboard
|
|
18
|
+
*
|
|
19
|
+
* This component provides a user-friendly way to copy text content to the system clipboard
|
|
20
|
+
* with visual feedback and accessibility features. It uses the modern Clipboard API with
|
|
21
|
+
* fallback error handling, and provides clear visual indication of successful copy operations.
|
|
22
|
+
*
|
|
23
|
+
* ## Key Features
|
|
24
|
+
* - **Clipboard Integration**: Uses modern Clipboard API for reliable text copying
|
|
25
|
+
* - **Visual Feedback**: Icon changes from copy to check mark on successful copy
|
|
26
|
+
* - **Auto-Reset**: Automatically reverts to copy icon after 1 second
|
|
27
|
+
* - **Error Handling**: Graceful error handling with console logging
|
|
28
|
+
* - **Accessibility**: Full keyboard navigation and screen reader support
|
|
29
|
+
* - **Internationalization**: Multi-language support via Intlayer
|
|
30
|
+
*
|
|
31
|
+
* ## Use Cases
|
|
32
|
+
* - Code snippet copying in documentation
|
|
33
|
+
* - Sharing URLs or links
|
|
34
|
+
* - Copying configuration values
|
|
35
|
+
* - Form data duplication
|
|
36
|
+
* - API key or token copying
|
|
37
|
+
* - Text content sharing in interfaces
|
|
38
|
+
*
|
|
39
|
+
* ## Accessibility
|
|
40
|
+
* - Uses semantic button element with proper ARIA labeling
|
|
41
|
+
* - Keyboard accessible (Tab, Enter, Space)
|
|
42
|
+
* - Screen reader announces copy actions
|
|
43
|
+
* - Focus management with visible indicators
|
|
44
|
+
* - Proper error state handling for assistive technologies
|
|
45
|
+
*
|
|
46
|
+
* ## Browser Compatibility
|
|
47
|
+
* - Requires modern browsers with Clipboard API support
|
|
48
|
+
* - Falls back gracefully with error logging for unsupported browsers
|
|
49
|
+
* - Works in secure contexts (HTTPS) as required by Clipboard API
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* Basic usage:
|
|
53
|
+
* ```tsx
|
|
54
|
+
* <CopyButton content="Text to copy" />
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* With custom styling and label:
|
|
59
|
+
* ```tsx
|
|
60
|
+
* <CopyButton
|
|
61
|
+
* content="https://example.com/api/endpoint"
|
|
62
|
+
* label="Copy API endpoint"
|
|
63
|
+
* variant={ButtonVariant.OUTLINE}
|
|
64
|
+
* color={ButtonColor.PRIMARY}
|
|
65
|
+
* size={ButtonSize.ICON_MD}
|
|
66
|
+
* />
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* In a code block context:
|
|
71
|
+
* ```tsx
|
|
72
|
+
* <div className="relative">
|
|
73
|
+
* <pre className="bg-gray-100 p-4 rounded">
|
|
74
|
+
* <code>npm install @intlayer/design-system</code>
|
|
75
|
+
* </pre>
|
|
76
|
+
* <CopyButton
|
|
77
|
+
* content="npm install @intlayer/design-system"
|
|
78
|
+
* className="absolute top-2 right-2"
|
|
79
|
+
* label="Copy installation command"
|
|
80
|
+
* />
|
|
81
|
+
* </div>
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
6
84
|
export declare const CopyButton: FC<CopyButtonProps>;
|
|
7
85
|
export {};
|
|
8
86
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CopyButton/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,EAGL,WAAW,EAGZ,MAAM,WAAW,CAAC;AAEnB,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEzB,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CopyButton/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,EAGL,WAAW,EAGZ,MAAM,WAAW,CAAC;AAEnB;;GAEG;AACH,KAAK,eAAe,GAAG;IACrB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AAEH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAkD1C,CAAC"}
|
|
@@ -6,21 +6,32 @@ import { useIntlayer } from "react-intlayer";
|
|
|
6
6
|
import { Button, ButtonSize, ButtonColor, ButtonVariant } from "../Button/Button.mjs";
|
|
7
7
|
const CopyButton = ({ content, ...props }) => {
|
|
8
8
|
const [copied, setCopied] = useState(false);
|
|
9
|
+
const [error, setError] = useState(false);
|
|
9
10
|
const { label } = useIntlayer("copy-button");
|
|
10
11
|
const handleCopy = async () => {
|
|
11
12
|
try {
|
|
13
|
+
setError(false);
|
|
12
14
|
await navigator.clipboard.writeText(content);
|
|
13
15
|
setCopied(true);
|
|
14
|
-
} catch (
|
|
15
|
-
console.error("Failed to copy text: ",
|
|
16
|
+
} catch (error2) {
|
|
17
|
+
console.error("Failed to copy text: ", error2);
|
|
18
|
+
setError(true);
|
|
16
19
|
}
|
|
17
20
|
};
|
|
18
21
|
useEffect(() => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
if (copied || error) {
|
|
23
|
+
const timer = setTimeout(() => {
|
|
24
|
+
setCopied(false);
|
|
25
|
+
setError(false);
|
|
26
|
+
}, 1e3);
|
|
27
|
+
return () => clearTimeout(timer);
|
|
28
|
+
}
|
|
29
|
+
}, [copied, error]);
|
|
30
|
+
const getAriaLabel = () => {
|
|
31
|
+
if (copied) return "Content copied to clipboard";
|
|
32
|
+
if (error) return "Failed to copy content";
|
|
33
|
+
return props.label ?? label.value;
|
|
34
|
+
};
|
|
24
35
|
return /* @__PURE__ */ jsx(
|
|
25
36
|
Button,
|
|
26
37
|
{
|
|
@@ -29,8 +40,12 @@ const CopyButton = ({ content, ...props }) => {
|
|
|
29
40
|
variant: ButtonVariant.HOVERABLE,
|
|
30
41
|
color: ButtonColor.TEXT,
|
|
31
42
|
size: ButtonSize.ICON_SM,
|
|
43
|
+
tabIndex: 0,
|
|
44
|
+
title: getAriaLabel(),
|
|
32
45
|
...props,
|
|
33
|
-
label:
|
|
46
|
+
label: getAriaLabel(),
|
|
47
|
+
"aria-describedby": copied ? "copy-success" : error ? "copy-error" : void 0,
|
|
48
|
+
className: `${props.className || ""} ${error ? "text-red-500" : copied ? "text-green-500" : ""}`
|
|
34
49
|
}
|
|
35
50
|
);
|
|
36
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/components/CopyButton/index.tsx"],"sourcesContent":["'use client';\n\nimport { CopyCheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState, type FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport {\n Button,\n ButtonColor,\n ButtonProps,\n ButtonSize,\n ButtonVariant,\n} from '../Button';\n\ntype CopyButtonProps = {\n content: string;\n} & Partial<ButtonProps>;\n\nexport const CopyButton: FC<CopyButtonProps> = ({ content, ...props }) => {\n const [copied, setCopied] = useState(false);\n const { label } = useIntlayer('copy-button');\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n } catch (error) {\n console.error('Failed to copy text: ', error);\n }\n };\n\n useEffect(() => {\n const timer = setTimeout(() => {\n
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/components/CopyButton/index.tsx"],"sourcesContent":["'use client';\n\nimport { CopyCheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState, type FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport {\n Button,\n ButtonColor,\n ButtonProps,\n ButtonSize,\n ButtonVariant,\n} from '../Button';\n\n/**\n * Props for the CopyButton component\n */\ntype CopyButtonProps = {\n /**\n * The text content to copy to the clipboard\n * @example\n * ```tsx\n * <CopyButton content=\"Hello World!\" />\n * ```\n */\n content: string;\n} & Partial<ButtonProps>;\n\n/**\n * CopyButton - A specialized button component for copying text to the clipboard\n *\n * This component provides a user-friendly way to copy text content to the system clipboard\n * with visual feedback and accessibility features. It uses the modern Clipboard API with\n * fallback error handling, and provides clear visual indication of successful copy operations.\n *\n * ## Key Features\n * - **Clipboard Integration**: Uses modern Clipboard API for reliable text copying\n * - **Visual Feedback**: Icon changes from copy to check mark on successful copy\n * - **Auto-Reset**: Automatically reverts to copy icon after 1 second\n * - **Error Handling**: Graceful error handling with console logging\n * - **Accessibility**: Full keyboard navigation and screen reader support\n * - **Internationalization**: Multi-language support via Intlayer\n *\n * ## Use Cases\n * - Code snippet copying in documentation\n * - Sharing URLs or links\n * - Copying configuration values\n * - Form data duplication\n * - API key or token copying\n * - Text content sharing in interfaces\n *\n * ## Accessibility\n * - Uses semantic button element with proper ARIA labeling\n * - Keyboard accessible (Tab, Enter, Space)\n * - Screen reader announces copy actions\n * - Focus management with visible indicators\n * - Proper error state handling for assistive technologies\n *\n * ## Browser Compatibility\n * - Requires modern browsers with Clipboard API support\n * - Falls back gracefully with error logging for unsupported browsers\n * - Works in secure contexts (HTTPS) as required by Clipboard API\n *\n * @example\n * Basic usage:\n * ```tsx\n * <CopyButton content=\"Text to copy\" />\n * ```\n *\n * @example\n * With custom styling and label:\n * ```tsx\n * <CopyButton\n * content=\"https://example.com/api/endpoint\"\n * label=\"Copy API endpoint\"\n * variant={ButtonVariant.OUTLINE}\n * color={ButtonColor.PRIMARY}\n * size={ButtonSize.ICON_MD}\n * />\n * ```\n *\n * @example\n * In a code block context:\n * ```tsx\n * <div className=\"relative\">\n * <pre className=\"bg-gray-100 p-4 rounded\">\n * <code>npm install @intlayer/design-system</code>\n * </pre>\n * <CopyButton\n * content=\"npm install @intlayer/design-system\"\n * className=\"absolute top-2 right-2\"\n * label=\"Copy installation command\"\n * />\n * </div>\n * ```\n */\n\nexport const CopyButton: FC<CopyButtonProps> = ({ content, ...props }) => {\n const [copied, setCopied] = useState(false);\n const [error, setError] = useState(false);\n const { label } = useIntlayer('copy-button');\n\n const handleCopy = async () => {\n try {\n setError(false);\n await navigator.clipboard.writeText(content);\n setCopied(true);\n } catch (error) {\n console.error('Failed to copy text: ', error);\n setError(true);\n }\n };\n\n useEffect(() => {\n if (copied || error) {\n const timer = setTimeout(() => {\n setCopied(false);\n setError(false);\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [copied, error]);\n\n // Determine the current state for accessibility\n const getAriaLabel = () => {\n if (copied) return 'Content copied to clipboard';\n if (error) return 'Failed to copy content';\n return props.label ?? label.value;\n };\n\n return (\n <Button\n Icon={copied ? CopyCheckIcon : CopyIcon}\n onClick={handleCopy}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n size={ButtonSize.ICON_SM}\n tabIndex={0}\n title={getAriaLabel()}\n {...props}\n label={getAriaLabel()}\n aria-describedby={\n copied ? 'copy-success' : error ? 'copy-error' : undefined\n }\n className={`${props.className || ''} ${error ? 'text-red-500' : copied ? 'text-green-500' : ''}`}\n />\n );\n};\n"],"names":["error"],"mappings":";;;;;;AAgGO,MAAM,aAAkC,CAAC,EAAE,SAAS,GAAG,YAAY;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK;AACxC,QAAM,EAAE,MAAA,IAAU,YAAY,aAAa;AAE3C,QAAM,aAAa,YAAY;AAC7B,QAAI;AACF,eAAS,KAAK;AACd,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,gBAAU,IAAI;AAAA,IAChB,SAASA,QAAO;AACd,cAAQ,MAAM,yBAAyBA,MAAK;AAC5C,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QAAI,UAAU,OAAO;AACnB,YAAM,QAAQ,WAAW,MAAM;AAC7B,kBAAU,KAAK;AACf,iBAAS,KAAK;AAAA,MAChB,GAAG,GAAI;AACP,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAGlB,QAAM,eAAe,MAAM;AACzB,QAAI,OAAQ,QAAO;AACnB,QAAI,MAAO,QAAO;AAClB,WAAO,MAAM,SAAS,MAAM;AAAA,EAC9B;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM,SAAS,gBAAgB;AAAA,MAC/B,SAAS;AAAA,MACT,SAAS,cAAc;AAAA,MACvB,OAAO,YAAY;AAAA,MACnB,MAAM,WAAW;AAAA,MACjB,UAAU;AAAA,MACV,OAAO,aAAA;AAAA,MACN,GAAG;AAAA,MACJ,OAAO,aAAA;AAAA,MACP,oBACE,SAAS,iBAAiB,QAAQ,eAAe;AAAA,MAEnD,WAAW,GAAG,MAAM,aAAa,EAAE,IAAI,QAAQ,iBAAiB,SAAS,mBAAmB,EAAE;AAAA,IAAA;AAAA,EAAA;AAGpG;"}
|
|
@@ -8,44 +8,80 @@ const utils_cn = require("../../utils/cn.cjs");
|
|
|
8
8
|
const CopyToClipboard = ({
|
|
9
9
|
text,
|
|
10
10
|
children,
|
|
11
|
-
className
|
|
11
|
+
className,
|
|
12
|
+
"aria-label": ariaLabel = "Copy to clipboard",
|
|
13
|
+
"aria-copied-label": ariaCopiedLabel = "Copied to clipboard",
|
|
14
|
+
feedbackDuration = 2e3,
|
|
15
|
+
onCopySuccess,
|
|
16
|
+
onCopyError
|
|
12
17
|
}) => {
|
|
13
18
|
const [isCopied, setIsCopied] = ReactExports.useState(false);
|
|
14
|
-
const
|
|
15
|
-
|
|
19
|
+
const [copyError, setCopyError] = ReactExports.useState(null);
|
|
20
|
+
const handleCopy = async () => {
|
|
21
|
+
if (!text) return;
|
|
22
|
+
try {
|
|
23
|
+
setCopyError(null);
|
|
24
|
+
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
25
|
+
await navigator.clipboard.writeText(text);
|
|
26
|
+
} else {
|
|
27
|
+
const textArea = document.createElement("textarea");
|
|
28
|
+
textArea.value = text;
|
|
29
|
+
textArea.style.position = "fixed";
|
|
30
|
+
textArea.style.left = "-999999px";
|
|
31
|
+
textArea.style.top = "-999999px";
|
|
32
|
+
document.body.appendChild(textArea);
|
|
33
|
+
textArea.focus();
|
|
34
|
+
textArea.select();
|
|
35
|
+
document.execCommand("copy");
|
|
36
|
+
document.body.removeChild(textArea);
|
|
37
|
+
}
|
|
16
38
|
setIsCopied(true);
|
|
17
|
-
setTimeout(() => setIsCopied(false),
|
|
18
|
-
|
|
39
|
+
setTimeout(() => setIsCopied(false), feedbackDuration);
|
|
40
|
+
onCopySuccess?.();
|
|
41
|
+
} catch (error) {
|
|
42
|
+
const errorMessage = error instanceof Error ? error.message : "Failed to copy to clipboard";
|
|
43
|
+
setCopyError(errorMessage);
|
|
44
|
+
onCopyError?.(error instanceof Error ? error : new Error(errorMessage));
|
|
45
|
+
setTimeout(() => setCopyError(null), feedbackDuration);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const handleKeyDown = (event) => {
|
|
49
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
50
|
+
event.preventDefault();
|
|
51
|
+
handleCopy();
|
|
52
|
+
}
|
|
19
53
|
};
|
|
54
|
+
const currentAriaLabel = copyError ? `Error copying to clipboard: ${copyError}` : isCopied ? ariaCopiedLabel : ariaLabel;
|
|
55
|
+
const IconComponent = copyError ? lucideReact.CopyIcon : isCopied ? lucideReact.CopyCheck : lucideReact.CopyIcon;
|
|
20
56
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
21
57
|
"span",
|
|
22
58
|
{
|
|
23
59
|
className: utils_cn.cn(
|
|
24
|
-
"inline-
|
|
60
|
+
"inline-flex gap-2 hover:cursor-pointer hover:bg-neutral/10 rounded-md p-0.5",
|
|
25
61
|
className
|
|
26
62
|
),
|
|
27
63
|
onClick: handleCopy,
|
|
64
|
+
onKeyDown: handleKeyDown,
|
|
65
|
+
role: "button",
|
|
66
|
+
tabIndex: 0,
|
|
67
|
+
"aria-label": currentAriaLabel,
|
|
68
|
+
"aria-pressed": isCopied,
|
|
69
|
+
"data-testid": "copy-to-clipboard",
|
|
28
70
|
children: [
|
|
29
71
|
children,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
{
|
|
33
|
-
size: 12,
|
|
34
|
-
"aria-label": "copied",
|
|
35
|
-
role: "button",
|
|
36
|
-
"data-testid": "copy-to-clipboard",
|
|
37
|
-
className: "ml-1 mt-1"
|
|
38
|
-
}
|
|
39
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
40
|
-
lucideReact.CopyIcon,
|
|
72
|
+
text && /* @__PURE__ */ jsxRuntime.jsx(
|
|
73
|
+
IconComponent,
|
|
41
74
|
{
|
|
42
75
|
size: 12,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
76
|
+
className: utils_cn.cn(
|
|
77
|
+
"ml-1 transition-colors duration-200",
|
|
78
|
+
copyError && "text-destructive",
|
|
79
|
+
isCopied && "text-success",
|
|
80
|
+
!copyError && !isCopied && "text-muted-foreground hover:text-foreground"
|
|
81
|
+
),
|
|
82
|
+
"aria-hidden": "true"
|
|
47
83
|
}
|
|
48
|
-
)
|
|
84
|
+
)
|
|
49
85
|
]
|
|
50
86
|
}
|
|
51
87
|
);
|