@namroodinc/liquid-editorial 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +67 -2
- package/dist/chunks/Icon-CGY1FNXT.js +77 -0
- package/dist/chunks/Icon-CGY1FNXT.js.map +1 -0
- package/dist/chunks/Icon-CWsA1W83.cjs +2 -0
- package/dist/chunks/Icon-CWsA1W83.cjs.map +1 -0
- package/dist/components/AssetGrid/index.cjs +2 -0
- package/dist/components/AssetGrid/index.cjs.map +1 -0
- package/dist/components/AssetGrid/index.d.cts +54 -0
- package/dist/components/AssetGrid/index.d.cts.map +1 -0
- package/dist/components/AssetGrid/index.d.ts +54 -0
- package/dist/components/AssetGrid/index.d.ts.map +1 -0
- package/dist/components/AssetGrid/index.js +137 -0
- package/dist/components/AssetGrid/index.js.map +1 -0
- package/dist/components/AssetGrid/style.css +196 -0
- package/dist/components/Avatar/index.cjs +2 -0
- package/dist/components/Avatar/index.cjs.map +1 -0
- package/dist/components/Avatar/index.d.cts +24 -0
- package/dist/components/Avatar/index.d.cts.map +1 -0
- package/dist/components/Avatar/index.d.ts +24 -0
- package/dist/components/Avatar/index.d.ts.map +1 -0
- package/dist/components/Avatar/index.js +43 -0
- package/dist/components/Avatar/index.js.map +1 -0
- package/dist/components/Avatar/style.css +70 -0
- package/dist/components/Badge/index.cjs +2 -0
- package/dist/components/Badge/index.cjs.map +1 -0
- package/dist/components/Badge/index.d.cts +25 -0
- package/dist/components/Badge/index.d.cts.map +1 -0
- package/dist/components/Badge/index.d.ts +25 -0
- package/dist/components/Badge/index.d.ts.map +1 -0
- package/dist/components/Badge/index.js +28 -0
- package/dist/components/Badge/index.js.map +1 -0
- package/dist/components/Badge/style.css +103 -0
- package/dist/components/Board/index.cjs +2 -0
- package/dist/components/Board/index.cjs.map +1 -0
- package/dist/components/Board/index.d.cts +62 -0
- package/dist/components/Board/index.d.cts.map +1 -0
- package/dist/components/Board/index.d.ts +62 -0
- package/dist/components/Board/index.d.ts.map +1 -0
- package/dist/components/Board/index.js +227 -0
- package/dist/components/Board/index.js.map +1 -0
- package/dist/components/Board/style.css +145 -0
- package/dist/components/Button/index.cjs +2 -0
- package/dist/components/Button/index.cjs.map +1 -0
- package/dist/components/Button/index.d.cts +22 -0
- package/dist/components/Button/index.d.cts.map +1 -0
- package/dist/components/Button/index.d.ts +22 -0
- package/dist/components/Button/index.d.ts.map +1 -0
- package/dist/components/Button/index.js +37 -0
- package/dist/components/Button/index.js.map +1 -0
- package/dist/components/Button/style.css +139 -0
- package/dist/components/ButtonGroup/index.cjs +2 -0
- package/dist/components/ButtonGroup/index.cjs.map +1 -0
- package/dist/components/ButtonGroup/index.d.cts +17 -0
- package/dist/components/ButtonGroup/index.d.cts.map +1 -0
- package/dist/components/ButtonGroup/index.d.ts +17 -0
- package/dist/components/ButtonGroup/index.d.ts.map +1 -0
- package/dist/components/ButtonGroup/index.js +18 -0
- package/dist/components/ButtonGroup/index.js.map +1 -0
- package/dist/components/ButtonGroup/style.css +66 -0
- package/dist/components/Choice/index.cjs +2 -0
- package/dist/components/Choice/index.cjs.map +1 -0
- package/dist/components/Choice/index.d.cts +25 -0
- package/dist/components/Choice/index.d.cts.map +1 -0
- package/dist/components/Choice/index.d.ts +25 -0
- package/dist/components/Choice/index.d.ts.map +1 -0
- package/dist/components/Choice/index.js +58 -0
- package/dist/components/Choice/index.js.map +1 -0
- package/dist/components/Choice/style.css +96 -0
- package/dist/components/Container/index.cjs +2 -0
- package/dist/components/Container/index.cjs.map +1 -0
- package/dist/components/Container/index.d.cts +19 -0
- package/dist/components/Container/index.d.cts.map +1 -0
- package/dist/components/Container/index.d.ts +19 -0
- package/dist/components/Container/index.d.ts.map +1 -0
- package/dist/components/Container/index.js +20 -0
- package/dist/components/Container/index.js.map +1 -0
- package/dist/components/Container/style.css +41 -0
- package/dist/components/DatePicker/index.cjs +2 -0
- package/dist/components/DatePicker/index.cjs.map +1 -0
- package/dist/components/DatePicker/index.d.cts +57 -0
- package/dist/components/DatePicker/index.d.cts.map +1 -0
- package/dist/components/DatePicker/index.d.ts +57 -0
- package/dist/components/DatePicker/index.d.ts.map +1 -0
- package/dist/components/DatePicker/index.js +248 -0
- package/dist/components/DatePicker/index.js.map +1 -0
- package/dist/components/DatePicker/style.css +149 -0
- package/dist/components/Drawer/index.cjs +2 -0
- package/dist/components/Drawer/index.cjs.map +1 -0
- package/dist/components/Drawer/index.d.cts +23 -0
- package/dist/components/Drawer/index.d.cts.map +1 -0
- package/dist/components/Drawer/index.d.ts +23 -0
- package/dist/components/Drawer/index.d.ts.map +1 -0
- package/dist/components/Drawer/index.js +85 -0
- package/dist/components/Drawer/index.js.map +1 -0
- package/dist/components/Drawer/style.css +147 -0
- package/dist/components/EntryPicker/index.cjs +2 -0
- package/dist/components/EntryPicker/index.cjs.map +1 -0
- package/dist/components/EntryPicker/index.d.cts +36 -0
- package/dist/components/EntryPicker/index.d.cts.map +1 -0
- package/dist/components/EntryPicker/index.d.ts +36 -0
- package/dist/components/EntryPicker/index.d.ts.map +1 -0
- package/dist/components/EntryPicker/index.js +178 -0
- package/dist/components/EntryPicker/index.js.map +1 -0
- package/dist/components/EntryPicker/style.css +162 -0
- package/dist/components/Field/index.cjs +2 -0
- package/dist/components/Field/index.cjs.map +1 -0
- package/dist/components/Field/index.d.cts +19 -0
- package/dist/components/Field/index.d.cts.map +1 -0
- package/dist/components/Field/index.d.ts +19 -0
- package/dist/components/Field/index.d.ts.map +1 -0
- package/dist/components/Field/index.js +41 -0
- package/dist/components/Field/index.js.map +1 -0
- package/dist/components/Field/style.css +100 -0
- package/dist/components/FieldAffix/index.cjs +2 -0
- package/dist/components/FieldAffix/index.cjs.map +1 -0
- package/dist/components/FieldAffix/index.d.cts +19 -0
- package/dist/components/FieldAffix/index.d.cts.map +1 -0
- package/dist/components/FieldAffix/index.d.ts +19 -0
- package/dist/components/FieldAffix/index.d.ts.map +1 -0
- package/dist/components/FieldAffix/index.js +45 -0
- package/dist/components/FieldAffix/index.js.map +1 -0
- package/dist/components/FieldAffix/style.css +54 -0
- package/dist/components/Grid/index.cjs +2 -0
- package/dist/components/Grid/index.cjs.map +1 -0
- package/dist/components/Grid/index.d.cts +44 -0
- package/dist/components/Grid/index.d.cts.map +1 -0
- package/dist/components/Grid/index.d.ts +44 -0
- package/dist/components/Grid/index.d.ts.map +1 -0
- package/dist/components/Grid/index.js +49 -0
- package/dist/components/Grid/index.js.map +1 -0
- package/dist/components/Grid/style.css +226 -0
- package/dist/components/Icon/icons.d.cts +64 -0
- package/dist/components/Icon/icons.d.cts.map +1 -0
- package/dist/components/Icon/icons.d.ts +64 -0
- package/dist/components/Icon/icons.d.ts.map +1 -0
- package/dist/components/Icon/index.cjs +1 -0
- package/dist/components/Icon/index.d.cts +15 -0
- package/dist/components/Icon/index.d.cts.map +1 -0
- package/dist/components/Icon/index.d.ts +15 -0
- package/dist/components/Icon/index.d.ts.map +1 -0
- package/dist/components/Icon/index.js +1 -0
- package/dist/components/Icon/style.css +10 -0
- package/dist/components/ImageCropper/index.cjs +2 -0
- package/dist/components/ImageCropper/index.cjs.map +1 -0
- package/dist/components/ImageCropper/index.d.cts +66 -0
- package/dist/components/ImageCropper/index.d.cts.map +1 -0
- package/dist/components/ImageCropper/index.d.ts +66 -0
- package/dist/components/ImageCropper/index.d.ts.map +1 -0
- package/dist/components/ImageCropper/index.js +263 -0
- package/dist/components/ImageCropper/index.js.map +1 -0
- package/dist/components/ImageCropper/style.css +160 -0
- package/dist/components/Menu/index.cjs +2 -0
- package/dist/components/Menu/index.cjs.map +1 -0
- package/dist/components/Menu/index.d.cts +35 -0
- package/dist/components/Menu/index.d.cts.map +1 -0
- package/dist/components/Menu/index.d.ts +35 -0
- package/dist/components/Menu/index.d.ts.map +1 -0
- package/dist/components/Menu/index.js +110 -0
- package/dist/components/Menu/index.js.map +1 -0
- package/dist/components/Menu/style.css +87 -0
- package/dist/components/Modal/index.cjs +2 -0
- package/dist/components/Modal/index.cjs.map +1 -0
- package/dist/components/Modal/index.d.cts +19 -0
- package/dist/components/Modal/index.d.cts.map +1 -0
- package/dist/components/Modal/index.d.ts +19 -0
- package/dist/components/Modal/index.d.ts.map +1 -0
- package/dist/components/Modal/index.js +84 -0
- package/dist/components/Modal/index.js.map +1 -0
- package/dist/components/Modal/style.css +106 -0
- package/dist/components/NumberField/index.cjs +2 -0
- package/dist/components/NumberField/index.cjs.map +1 -0
- package/dist/components/NumberField/index.d.cts +50 -0
- package/dist/components/NumberField/index.d.cts.map +1 -0
- package/dist/components/NumberField/index.d.ts +50 -0
- package/dist/components/NumberField/index.d.ts.map +1 -0
- package/dist/components/NumberField/index.js +124 -0
- package/dist/components/NumberField/index.js.map +1 -0
- package/dist/components/NumberField/style.css +85 -0
- package/dist/components/Popover/index.cjs +2 -0
- package/dist/components/Popover/index.cjs.map +1 -0
- package/dist/components/Popover/index.d.cts +28 -0
- package/dist/components/Popover/index.d.cts.map +1 -0
- package/dist/components/Popover/index.d.ts +28 -0
- package/dist/components/Popover/index.d.ts.map +1 -0
- package/dist/components/Popover/index.js +52 -0
- package/dist/components/Popover/index.js.map +1 -0
- package/dist/components/Popover/style.css +23 -0
- package/dist/components/RichTextEditor/index.cjs +2 -0
- package/dist/components/RichTextEditor/index.cjs.map +1 -0
- package/dist/components/RichTextEditor/index.d.cts +23 -0
- package/dist/components/RichTextEditor/index.d.cts.map +1 -0
- package/dist/components/RichTextEditor/index.d.ts +23 -0
- package/dist/components/RichTextEditor/index.d.ts.map +1 -0
- package/dist/components/RichTextEditor/index.js +175 -0
- package/dist/components/RichTextEditor/index.js.map +1 -0
- package/dist/components/RichTextEditor/style.css +136 -0
- package/dist/components/SearchField/index.cjs +2 -0
- package/dist/components/SearchField/index.cjs.map +1 -0
- package/dist/components/SearchField/index.d.cts +11 -0
- package/dist/components/SearchField/index.d.cts.map +1 -0
- package/dist/components/SearchField/index.d.ts +11 -0
- package/dist/components/SearchField/index.d.ts.map +1 -0
- package/dist/components/SearchField/index.js +49 -0
- package/dist/components/SearchField/index.js.map +1 -0
- package/dist/components/SearchField/style.css +27 -0
- package/dist/components/Select/index.cjs +2 -0
- package/dist/components/Select/index.cjs.map +1 -0
- package/dist/components/Select/index.d.cts +26 -0
- package/dist/components/Select/index.d.cts.map +1 -0
- package/dist/components/Select/index.d.ts +26 -0
- package/dist/components/Select/index.d.ts.map +1 -0
- package/dist/components/Select/index.js +129 -0
- package/dist/components/Select/index.js.map +1 -0
- package/dist/components/Select/style.css +88 -0
- package/dist/components/SelectionCard/index.cjs +2 -0
- package/dist/components/SelectionCard/index.cjs.map +1 -0
- package/dist/components/SelectionCard/index.d.cts +32 -0
- package/dist/components/SelectionCard/index.d.cts.map +1 -0
- package/dist/components/SelectionCard/index.d.ts +32 -0
- package/dist/components/SelectionCard/index.d.ts.map +1 -0
- package/dist/components/SelectionCard/index.js +71 -0
- package/dist/components/SelectionCard/index.js.map +1 -0
- package/dist/components/SelectionCard/style.css +133 -0
- package/dist/components/SideNav/index.cjs +2 -0
- package/dist/components/SideNav/index.cjs.map +1 -0
- package/dist/components/SideNav/index.d.cts +58 -0
- package/dist/components/SideNav/index.d.cts.map +1 -0
- package/dist/components/SideNav/index.d.ts +58 -0
- package/dist/components/SideNav/index.d.ts.map +1 -0
- package/dist/components/SideNav/index.js +113 -0
- package/dist/components/SideNav/index.js.map +1 -0
- package/dist/components/SideNav/style.css +184 -0
- package/dist/components/Skeleton/index.cjs +2 -0
- package/dist/components/Skeleton/index.cjs.map +1 -0
- package/dist/components/Skeleton/index.d.cts +21 -0
- package/dist/components/Skeleton/index.d.cts.map +1 -0
- package/dist/components/Skeleton/index.d.ts +21 -0
- package/dist/components/Skeleton/index.d.ts.map +1 -0
- package/dist/components/Skeleton/index.js +31 -0
- package/dist/components/Skeleton/index.js.map +1 -0
- package/dist/components/Skeleton/style.css +55 -0
- package/dist/components/Slider/index.cjs +2 -0
- package/dist/components/Slider/index.cjs.map +1 -0
- package/dist/components/Slider/index.d.cts +40 -0
- package/dist/components/Slider/index.d.cts.map +1 -0
- package/dist/components/Slider/index.d.ts +40 -0
- package/dist/components/Slider/index.d.ts.map +1 -0
- package/dist/components/Slider/index.js +117 -0
- package/dist/components/Slider/index.js.map +1 -0
- package/dist/components/Slider/style.css +156 -0
- package/dist/components/SortableList/index.cjs +2 -0
- package/dist/components/SortableList/index.cjs.map +1 -0
- package/dist/components/SortableList/index.d.cts +27 -0
- package/dist/components/SortableList/index.d.cts.map +1 -0
- package/dist/components/SortableList/index.d.ts +27 -0
- package/dist/components/SortableList/index.d.ts.map +1 -0
- package/dist/components/SortableList/index.js +85 -0
- package/dist/components/SortableList/index.js.map +1 -0
- package/dist/components/SortableList/style.css +71 -0
- package/dist/components/Stepper/index.cjs +2 -0
- package/dist/components/Stepper/index.cjs.map +1 -0
- package/dist/components/Stepper/index.d.cts +32 -0
- package/dist/components/Stepper/index.d.cts.map +1 -0
- package/dist/components/Stepper/index.d.ts +32 -0
- package/dist/components/Stepper/index.d.ts.map +1 -0
- package/dist/components/Stepper/index.js +69 -0
- package/dist/components/Stepper/index.js.map +1 -0
- package/dist/components/Stepper/style.css +154 -0
- package/dist/components/SubNav/index.cjs +2 -0
- package/dist/components/SubNav/index.cjs.map +1 -0
- package/dist/components/SubNav/index.d.cts +31 -0
- package/dist/components/SubNav/index.d.cts.map +1 -0
- package/dist/components/SubNav/index.d.ts +31 -0
- package/dist/components/SubNav/index.d.ts.map +1 -0
- package/dist/components/SubNav/index.js +62 -0
- package/dist/components/SubNav/index.js.map +1 -0
- package/dist/components/SubNav/style.css +86 -0
- package/dist/components/Switch/index.cjs +2 -0
- package/dist/components/Switch/index.cjs.map +1 -0
- package/dist/components/Switch/index.d.cts +12 -0
- package/dist/components/Switch/index.d.cts.map +1 -0
- package/dist/components/Switch/index.d.ts +12 -0
- package/dist/components/Switch/index.d.ts.map +1 -0
- package/dist/components/Switch/index.js +37 -0
- package/dist/components/Switch/index.js.map +1 -0
- package/dist/components/Switch/style.css +65 -0
- package/dist/components/Table/index.cjs +2 -0
- package/dist/components/Table/index.cjs.map +1 -0
- package/dist/components/Table/index.d.cts +54 -0
- package/dist/components/Table/index.d.cts.map +1 -0
- package/dist/components/Table/index.d.ts +54 -0
- package/dist/components/Table/index.d.ts.map +1 -0
- package/dist/components/Table/index.js +102 -0
- package/dist/components/Table/index.js.map +1 -0
- package/dist/components/Table/style.css +122 -0
- package/dist/components/TagsInput/index.cjs +2 -0
- package/dist/components/TagsInput/index.cjs.map +1 -0
- package/dist/components/TagsInput/index.d.cts +22 -0
- package/dist/components/TagsInput/index.d.cts.map +1 -0
- package/dist/components/TagsInput/index.d.ts +22 -0
- package/dist/components/TagsInput/index.d.ts.map +1 -0
- package/dist/components/TagsInput/index.js +60 -0
- package/dist/components/TagsInput/index.js.map +1 -0
- package/dist/components/TagsInput/style.css +83 -0
- package/dist/components/TextField/index.cjs +2 -0
- package/dist/components/TextField/index.cjs.map +1 -0
- package/dist/components/TextField/index.d.cts +11 -0
- package/dist/components/TextField/index.d.cts.map +1 -0
- package/dist/components/TextField/index.d.ts +11 -0
- package/dist/components/TextField/index.d.ts.map +1 -0
- package/dist/components/TextField/index.js +29 -0
- package/dist/components/TextField/index.js.map +1 -0
- package/dist/components/TextField/style.css +1 -0
- package/dist/components/Time/index.cjs +2 -0
- package/dist/components/Time/index.cjs.map +1 -0
- package/dist/components/Time/index.d.cts +35 -0
- package/dist/components/Time/index.d.cts.map +1 -0
- package/dist/components/Time/index.d.ts +35 -0
- package/dist/components/Time/index.d.ts.map +1 -0
- package/dist/components/Time/index.js +98 -0
- package/dist/components/Time/index.js.map +1 -0
- package/dist/components/Time/style.css +30 -0
- package/dist/components/Toast/index.cjs +2 -0
- package/dist/components/Toast/index.cjs.map +1 -0
- package/dist/components/Toast/index.d.cts +30 -0
- package/dist/components/Toast/index.d.cts.map +1 -0
- package/dist/components/Toast/index.d.ts +30 -0
- package/dist/components/Toast/index.d.ts.map +1 -0
- package/dist/components/Toast/index.js +96 -0
- package/dist/components/Toast/index.js.map +1 -0
- package/dist/components/Toast/style.css +80 -0
- package/dist/components/TopNav/index.cjs +2 -0
- package/dist/components/TopNav/index.cjs.map +1 -0
- package/dist/components/TopNav/index.d.cts +28 -0
- package/dist/components/TopNav/index.d.cts.map +1 -0
- package/dist/components/TopNav/index.d.ts +28 -0
- package/dist/components/TopNav/index.d.ts.map +1 -0
- package/dist/components/TopNav/index.js +45 -0
- package/dist/components/TopNav/index.js.map +1 -0
- package/dist/components/TopNav/style.css +80 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +77 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +77 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/reset.css +15 -0
- package/dist/reset.css.d.ts +2 -0
- package/dist/styles.css +39 -0
- package/dist/styles.css.d.ts +2 -0
- package/dist/tokens.css +457 -0
- package/dist/tokens.css.d.ts +2 -0
- package/package.json +130 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["cx","parts","VIEWPORT_MARGIN","Popover","rest","floatingRef","useRef","generatedId","useId","panelId","id","place","useCallback","reference","anchorRef","anchorId","floating","anchor","matchAnchorWidth","panel","viewportWidth","viewportHeight","roomBelow","offset","roomAbove","placeAbove","availableHeight","top","preferredLeft","align","left","useEffect","isOpen","panelRef","update","className","createPortal"],"sources":["../../../src/components/Popover/index.tsx"],"sourcesContent":["import { useCallback, useEffect, useId, useRef, type ReactNode, type RefObject } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport \"./style.css\";\n\nfunction cx(...parts: (string | undefined | false)[]) {\n return parts.filter(Boolean).join(\" \");\n}\n\nconst VIEWPORT_MARGIN = 8;\n\nexport type PopoverAlign = \"start\" | \"end\";\n\nexport interface PopoverProps {\n /** The control the panel hangs off. */\n anchorRef: RefObject<HTMLElement | null>;\n /** Optional DOM id fallback for composed controls whose refs are consumed by a field wrapper. */\n anchorId?: string;\n isOpen: boolean;\n /** Which edge of the anchor the panel lines up with. Flips when it must. */\n align?: PopoverAlign;\n /** Match the anchor's width — for listboxes that read as one field. */\n matchAnchorWidth?: boolean;\n /** Gap between anchor and panel. */\n offset?: number;\n className?: string;\n children: ReactNode;\n role?: string;\n id?: string;\n \"aria-label\"?: string;\n panelRef?: RefObject<HTMLDivElement | null>;\n}\n\n/**\n * A panel anchored to a control. It is positioned against the viewport, so it\n * flips above the anchor when the space below runs out and slides inward\n * rather than being cut off at any edge.\n */\nexport function Popover({\n anchorRef,\n anchorId,\n isOpen,\n align = \"start\",\n matchAnchorWidth = false,\n offset = 4,\n className,\n children,\n role,\n id,\n panelRef,\n ...rest\n}: PopoverProps) {\n const floatingRef = useRef<HTMLDivElement | null>(null);\n const generatedId = useId();\n const panelId = id ?? generatedId;\n\n const place = useCallback(() => {\n const reference = anchorRef.current ?? (anchorId ? document.getElementById(anchorId) : null);\n const floating = floatingRef.current;\n if (!reference || !floating) return;\n\n const anchor = reference.getBoundingClientRect();\n if (matchAnchorWidth) floating.style.width = `${anchor.width}px`;\n const panel = floating.getBoundingClientRect();\n const viewportWidth = document.documentElement.clientWidth;\n const viewportHeight = document.documentElement.clientHeight;\n const roomBelow = viewportHeight - anchor.bottom - offset - VIEWPORT_MARGIN;\n const roomAbove = anchor.top - offset - VIEWPORT_MARGIN;\n const placeAbove = roomBelow < panel.height && roomAbove > roomBelow;\n const availableHeight = Math.max(120, placeAbove ? roomAbove : roomBelow);\n const top = placeAbove\n ? Math.max(VIEWPORT_MARGIN, anchor.top - offset - Math.min(panel.height, availableHeight))\n : Math.min(anchor.bottom + offset, viewportHeight - VIEWPORT_MARGIN);\n const preferredLeft = align === \"end\" ? anchor.right - panel.width : anchor.left;\n const left = Math.max(\n VIEWPORT_MARGIN,\n Math.min(preferredLeft, viewportWidth - panel.width - VIEWPORT_MARGIN),\n );\n\n floating.style.left = `${Math.round(left)}px`;\n floating.style.top = `${Math.round(top)}px`;\n floating.style.setProperty(\"--popover-max-block-size\", `${Math.round(availableHeight)}px`);\n floating.style.visibility = \"visible\";\n }, [align, anchorId, anchorRef, matchAnchorWidth, offset]);\n\n useEffect(() => {\n if (!isOpen) return;\n const floating = document.querySelector<HTMLDivElement>(\n `[data-popover-instance=\"${CSS.escape(generatedId)}\"]`,\n );\n floatingRef.current = floating;\n if (panelRef) panelRef.current = floating;\n place();\n const update = () => place();\n window.addEventListener(\"resize\", update);\n window.addEventListener(\"scroll\", update, true);\n return () => {\n window.removeEventListener(\"resize\", update);\n window.removeEventListener(\"scroll\", update, true);\n floatingRef.current = null;\n if (panelRef) panelRef.current = null;\n };\n }, [generatedId, isOpen, panelId, panelRef, place]);\n\n if (!isOpen || typeof document === \"undefined\") return null;\n\n const panel = (\n <div\n id={panelId}\n data-popover-instance={generatedId}\n role={role}\n className={cx(\"ds-popover\", className)}\n {...rest}\n >\n {children}\n </div>\n );\n\n return createPortal(panel, document.body);\n}\n"],"mappings":";;;;AAIA,SAASA,EAAG,GAAGC,GAAuC;CACpD,OAAOA,EAAM,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACvC;AAEA,IAAMC,IAAkB;AA6BxB,SAAgBC,EAAQ,EACtB,cACA,aACA,WACA,WAAQ,SACR,sBAAmB,IACnB,YAAS,GACT,cACA,aACA,SACA,OACA,aACA,GAAGC,KACY;CACf,IAAMC,IAAcC,EAA8B,IAAI,GAChDC,IAAcC,EAAM,GACpBC,IAAUC,KAAMH,GAEhBI,IAAQC,QAAkB;EAC9B,IAAMC,IAAYC,EAAU,YAAYC,IAAW,SAAS,eAAeA,CAAQ,IAAI,OACjFC,IAAWX,EAAY;EAC7B,IAAI,CAACQ,KAAa,CAACG,GAAU;EAE7B,IAAMC,IAASJ,EAAU,sBAAsB;EAC/C,AAAIK,MAAkB,EAAS,MAAM,QAAQ,GAAGD,EAAO,MAAM;EAC7D,IAAME,IAAQH,EAAS,sBAAsB,GACvCI,IAAgB,SAAS,gBAAgB,aACzCC,IAAiB,SAAS,gBAAgB,cAC1CC,IAAYD,IAAiBJ,EAAO,SAASM,IAASrB,GACtDsB,IAAYP,EAAO,MAAMM,IAASrB,GAClCuB,IAAaH,IAAYH,EAAM,UAAUK,IAAYF,GACrDI,IAAkB,KAAK,IAAI,KAAKD,IAAaD,IAAYF,CAAS,GAClEK,IAAMF,IACR,KAAK,IAAIvB,GAAiBe,EAAO,MAAMM,IAAS,KAAK,IAAIJ,EAAM,QAAQO,CAAe,CAAC,IACvF,KAAK,IAAIT,EAAO,SAASM,GAAQF,IAAiBnB,CAAe,GAC/D0B,IAAgBC,MAAU,QAAQZ,EAAO,QAAQE,EAAM,QAAQF,EAAO,MACtEa,IAAO,KAAK,IAChB5B,GACA,KAAK,IAAI0B,GAAeR,IAAgBD,EAAM,QAAQjB,CAAe,CACvE;EAKA,AAHA,EAAS,MAAM,OAAO,GAAG,KAAK,MAAM4B,CAAI,EAAE,KAC1C,EAAS,MAAM,MAAM,GAAG,KAAK,MAAMH,CAAG,EAAE,KACxCX,EAAS,MAAM,YAAY,4BAA4B,GAAG,KAAK,MAAMU,CAAe,EAAE,GAAG,GACzF,EAAS,MAAM,aAAa;CAC9B,GAAG;EAACG;EAAOd;EAAUD;EAAWI;EAAkBK;CAAM,CAAC;CAqBzD,IAnBAQ,QAAgB;EACd,IAAI,CAACC,GAAQ;EACb,IAAMhB,IAAW,SAAS,cACxB,2BAA2B,IAAI,OAAOT,CAAW,EAAE,GACrD;EAGA,AAFA,EAAY,UAAUS,GAClBiB,MAAU,EAAS,UAAUjB,IACjCL,EAAM;EACN,IAAMuB,UAAevB,EAAM;EAG3B,OAFA,OAAO,iBAAiB,UAAUuB,CAAM,GACxC,OAAO,iBAAiB,UAAUA,GAAQ,EAAI,SACjC;GAIX,AAHA,OAAO,oBAAoB,UAAUA,CAAM,GAC3C,OAAO,oBAAoB,UAAUA,GAAQ,EAAI,GACjD,EAAY,UAAU,MAClBD,MAAU,EAAS,UAAU;EACnC;CACF,GAAG;EAAC1B;EAAayB;EAAQvB;EAASwB;EAAUtB;CAAK,CAAC,GAE9C,CAACqB,KAAU,OAAO,WAAa,KAAa,OAAO;CAEvD,IAAMb,IACJ,kBAAC,OAAD;EACE,IAAIV;EACJ,yBAAuBF;EACjB;EACN,WAAWP,EAAG,cAAcmC,CAAS;EACrC,GAAI/B;EAEH;CACE,CAAA;CAGP,OAAOgC,EAAajB,GAAO,SAAS,IAAI;AAC1C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
/* The one raised surface. Menus, listboxes and calendars all wear it, so a
|
|
3
|
+
* floating panel reads the same wherever it opens from. */
|
|
4
|
+
.ds-surface-raised {
|
|
5
|
+
--field-bg: var(--color-surface-raised);
|
|
6
|
+
|
|
7
|
+
background: var(--color-surface-raised);
|
|
8
|
+
border: var(--control-border-width) solid var(--control-border-color);
|
|
9
|
+
border-radius: var(--radius-md);
|
|
10
|
+
box-shadow: var(--shadow-lg);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.ds-popover {
|
|
14
|
+
position: fixed;
|
|
15
|
+
visibility: hidden;
|
|
16
|
+
z-index: 60;
|
|
17
|
+
inline-size: max-content;
|
|
18
|
+
max-inline-size: calc(100vw - var(--space-4));
|
|
19
|
+
max-block-size: var(--popover-max-block-size, none);
|
|
20
|
+
overflow: auto;
|
|
21
|
+
overscroll-behavior: contain;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));const c=require("../Button/index.cjs"),l=require("../ButtonGroup/index.cjs");;/* empty css */let u=require("react"),d=require("react/jsx-runtime"),f=require("@tiptap/react"),p=require("@tiptap/starter-kit");p=s(p,1);let m=require("@tiptap/extension-link");m=s(m,1);let h=require("@tiptap/extension-placeholder");h=s(h,1);var g=[[{id:`bold`,icon:`bold`,label:`Bold`,run:e=>e.chain().focus().toggleBold().run(),active:e=>e.isActive(`bold`)},{id:`italic`,icon:`italic`,label:`Italic`,run:e=>e.chain().focus().toggleItalic().run(),active:e=>e.isActive(`italic`)},{id:`strike`,icon:`strikethrough`,label:`Strikethrough`,run:e=>e.chain().focus().toggleStrike().run(),active:e=>e.isActive(`strike`)},{id:`code`,icon:`code`,label:`Inline code`,run:e=>e.chain().focus().toggleCode().run(),active:e=>e.isActive(`code`)}],[{id:`h2`,icon:`heading-2`,label:`Heading`,run:e=>e.chain().focus().toggleHeading({level:2}).run(),active:e=>e.isActive(`heading`,{level:2})},{id:`h3`,icon:`heading-3`,label:`Subheading`,run:e=>e.chain().focus().toggleHeading({level:3}).run(),active:e=>e.isActive(`heading`,{level:3})},{id:`quote`,icon:`quote`,label:`Quote`,run:e=>e.chain().focus().toggleBlockquote().run(),active:e=>e.isActive(`blockquote`)}],[{id:`ul`,icon:`list`,label:`Bulleted list`,run:e=>e.chain().focus().toggleBulletList().run(),active:e=>e.isActive(`bulletList`)},{id:`ol`,icon:`list-ordered`,label:`Numbered list`,run:e=>e.chain().focus().toggleOrderedList().run(),active:e=>e.isActive(`orderedList`)}],[{id:`undo`,icon:`undo`,label:`Undo`,run:e=>e.chain().focus().undo().run()},{id:`redo`,icon:`redo`,label:`Redo`,run:e=>e.chain().focus().redo().run()}]],_=(0,u.forwardRef)(function({defaultValue:e=``,onChange:t,placeholder:n=`Write something…`,size:r=`md`,isDisabled:i=!1,isInvalid:a=!1,label:o=`Rich text editor`,className:s,toolbarExtra:_},v){let[y,b]=(0,u.useState)(!1),x=(0,f.useEditor)({immediatelyRender:!1,editable:!i,content:e,extensions:[p.default.configure({link:!1}),m.default.configure({openOnClick:!1,autolink:!0}),h.default.configure({placeholder:n})],editorProps:{attributes:{role:`textbox`,"aria-label":o,"aria-multiline":`true`}},onFocus:()=>b(!0),onBlur:()=>b(!1),onUpdate:({editor:e})=>t?.(e.getHTML())}),S=(0,f.useEditorState)({editor:x,selector:({editor:e})=>e?{active:Object.fromEntries(g.flat().map(t=>[t.id,t.active?.(e)??!1])),linkActive:e.isActive(`link`)}:null}),C=(0,u.useCallback)(()=>{if(!x)return;if(x.isActive(`link`)){x.chain().focus().unsetLink().run();return}let e=window.prompt(`Link to`);e&&x.chain().focus().extendMarkRange(`link`).setLink({href:e}).run()},[x]);return(0,d.jsxs)(`div`,{ref:v,className:[`ds-rte`,s].filter(Boolean).join(` `),"data-focused":y||void 0,"data-disabled":i||void 0,"aria-invalid":a||void 0,children:[(0,d.jsxs)(`div`,{className:`ds-rte__toolbar`,role:`toolbar`,"aria-label":`${o} formatting`,children:[g.map((e,t)=>(0,d.jsx)(l.ButtonGroup,{"aria-label":`Formatting ${t+1}`,children:e.map(e=>(0,d.jsx)(c.Button,{size:`sm`,isIconOnly:!0,iconStart:e.icon,"aria-label":e.label,title:e.label,"aria-pressed":e.active?S?.active[e.id]:void 0,variant:S?.active[e.id]?`active`:`neutral`,isDisabled:i||!x,onClick:()=>x&&e.run(x)},e.id))},t)),(0,d.jsx)(l.ButtonGroup,{"aria-label":`Link`,children:(0,d.jsx)(c.Button,{size:`sm`,isIconOnly:!0,iconStart:S?.linkActive?`link-off`:`link`,"aria-label":S?.linkActive?`Remove link`:`Add link`,title:S?.linkActive?`Remove link`:`Add link`,variant:S?.linkActive?`active`:`neutral`,isDisabled:i||!x,onClick:C})}),_]}),(0,d.jsx)(`div`,{className:`ds-rte__content`,"data-size":r,children:(0,d.jsx)(f.EditorContent,{editor:x})})]})});exports.RichTextEditor=_;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["forwardRef","useState","useEditor","StarterKit","Link","Placeholder","useEditorState","useCallback","ButtonGroup","Button","EditorContent","__create","__defProp","__getOwnPropDesc","__getOwnPropNames","__getProtoOf","__hasOwnProp","__copyProps","from","keys","i","n","key","to","except","k","desc","__toESM","mod","isNodeMode","target","require_components_Button_index","require_components_ButtonGroup_index","react","react_jsx_runtime","_tiptap_react","_tiptap_starter_kit","_tiptap_extension_link","_tiptap_extension_placeholder","GROUPS","RichTextEditor","isFocused","setIsFocused","editor","isDisabled","defaultValue","label","onChange","state","toggleLink","href","className","isInvalid","group","tool","toolbarExtra","size"],"sources":["../../../src/components/RichTextEditor/index.tsx"],"sourcesContent":["import { forwardRef, useCallback, useState, type ReactNode } from \"react\";\nimport { EditorContent, useEditor, useEditorState, type Editor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Link from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { Button } from \"../Button\";\nimport { ButtonGroup } from \"../ButtonGroup\";\nimport type { IconName } from \"../Icon/icons\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nexport type RichTextEditorSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface RichTextEditorProps {\n /** Initial HTML. The editor is uncontrolled: read changes from `onChange`. */\n defaultValue?: string;\n /** Fired with the document's HTML on every change. */\n onChange?: (html: string) => void;\n placeholder?: string;\n size?: RichTextEditorSize;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Accessible name for the editing surface. */\n label?: string;\n className?: string;\n /** Extra controls appended to the toolbar, e.g. a word count. */\n toolbarExtra?: ReactNode;\n}\n\ninterface ToolItem {\n id: string;\n icon: IconName;\n label: string;\n run: (editor: Editor) => void;\n active?: (editor: Editor) => boolean;\n}\n\nconst GROUPS: ToolItem[][] = [\n [\n {\n id: \"bold\",\n icon: \"bold\",\n label: \"Bold\",\n run: (e) => e.chain().focus().toggleBold().run(),\n active: (e) => e.isActive(\"bold\"),\n },\n {\n id: \"italic\",\n icon: \"italic\",\n label: \"Italic\",\n run: (e) => e.chain().focus().toggleItalic().run(),\n active: (e) => e.isActive(\"italic\"),\n },\n {\n id: \"strike\",\n icon: \"strikethrough\",\n label: \"Strikethrough\",\n run: (e) => e.chain().focus().toggleStrike().run(),\n active: (e) => e.isActive(\"strike\"),\n },\n {\n id: \"code\",\n icon: \"code\",\n label: \"Inline code\",\n run: (e) => e.chain().focus().toggleCode().run(),\n active: (e) => e.isActive(\"code\"),\n },\n ],\n [\n {\n id: \"h2\",\n icon: \"heading-2\",\n label: \"Heading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 2 }),\n },\n {\n id: \"h3\",\n icon: \"heading-3\",\n label: \"Subheading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 3 }),\n },\n {\n id: \"quote\",\n icon: \"quote\",\n label: \"Quote\",\n run: (e) => e.chain().focus().toggleBlockquote().run(),\n active: (e) => e.isActive(\"blockquote\"),\n },\n ],\n [\n {\n id: \"ul\",\n icon: \"list\",\n label: \"Bulleted list\",\n run: (e) => e.chain().focus().toggleBulletList().run(),\n active: (e) => e.isActive(\"bulletList\"),\n },\n {\n id: \"ol\",\n icon: \"list-ordered\",\n label: \"Numbered list\",\n run: (e) => e.chain().focus().toggleOrderedList().run(),\n active: (e) => e.isActive(\"orderedList\"),\n },\n ],\n [\n {\n id: \"undo\",\n icon: \"undo\",\n label: \"Undo\",\n run: (e) => e.chain().focus().undo().run(),\n },\n {\n id: \"redo\",\n icon: \"redo\",\n label: \"Redo\",\n run: (e) => e.chain().focus().redo().run(),\n },\n ],\n];\n\n/**\n * The editorial writing surface. Rich text plus links — the same field skin,\n * radius and states as `TextField`, with the toolbar inside the frame.\n */\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n function RichTextEditor(\n {\n defaultValue = \"\",\n onChange,\n placeholder = \"Write something…\",\n size = \"md\",\n isDisabled = false,\n isInvalid = false,\n label = \"Rich text editor\",\n className,\n toolbarExtra,\n },\n ref,\n ) {\n const [isFocused, setIsFocused] = useState(false);\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !isDisabled,\n content: defaultValue,\n extensions: [\n StarterKit.configure({ link: false }),\n Link.configure({ openOnClick: false, autolink: true }),\n Placeholder.configure({ placeholder }),\n ],\n editorProps: {\n attributes: { role: \"textbox\", \"aria-label\": label, \"aria-multiline\": \"true\" },\n },\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false),\n onUpdate: ({ editor: e }) => onChange?.(e.getHTML()),\n });\n\n const state = useEditorState({\n editor,\n selector: ({ editor: e }) =>\n e\n ? {\n active: Object.fromEntries(\n GROUPS.flat().map((t) => [t.id, t.active?.(e) ?? false]),\n ),\n linkActive: e.isActive(\"link\"),\n }\n : null,\n });\n\n const toggleLink = useCallback(() => {\n if (!editor) return;\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const href = window.prompt(\"Link to\");\n if (!href) return;\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href }).run();\n }, [editor]);\n\n return (\n <div\n ref={ref}\n className={[\"ds-rte\", className].filter(Boolean).join(\" \")}\n data-focused={isFocused || undefined}\n data-disabled={isDisabled || undefined}\n aria-invalid={isInvalid || undefined}\n >\n <div className=\"ds-rte__toolbar\" role=\"toolbar\" aria-label={`${label} formatting`}>\n {GROUPS.map((group, i) => (\n <ButtonGroup key={i} aria-label={`Formatting ${i + 1}`}>\n {group.map((tool) => (\n <Button\n key={tool.id}\n size=\"sm\"\n isIconOnly\n iconStart={tool.icon}\n aria-label={tool.label}\n title={tool.label}\n aria-pressed={tool.active ? state?.active[tool.id] : undefined}\n variant={state?.active[tool.id] ? \"active\" : \"neutral\"}\n isDisabled={isDisabled || !editor}\n onClick={() => editor && tool.run(editor)}\n />\n ))}\n </ButtonGroup>\n ))}\n <ButtonGroup aria-label=\"Link\">\n <Button\n size=\"sm\"\n isIconOnly\n iconStart={state?.linkActive ? \"link-off\" : \"link\"}\n aria-label={state?.linkActive ? \"Remove link\" : \"Add link\"}\n title={state?.linkActive ? \"Remove link\" : \"Add link\"}\n variant={state?.linkActive ? \"active\" : \"neutral\"}\n isDisabled={isDisabled || !editor}\n onClick={toggleLink}\n />\n </ButtonGroup>\n {toolbarExtra}\n </div>\n <div className=\"ds-rte__content\" data-size={size}>\n <EditorContent editor={editor} />\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export type RichTextEditorSize = "sm" | "md" | "lg";
|
|
3
|
+
export interface RichTextEditorProps {
|
|
4
|
+
/** Initial HTML. The editor is uncontrolled: read changes from `onChange`. */
|
|
5
|
+
defaultValue?: string;
|
|
6
|
+
/** Fired with the document's HTML on every change. */
|
|
7
|
+
onChange?: (html: string) => void;
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
size?: RichTextEditorSize;
|
|
10
|
+
isDisabled?: boolean;
|
|
11
|
+
isInvalid?: boolean;
|
|
12
|
+
/** Accessible name for the editing surface. */
|
|
13
|
+
label?: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
/** Extra controls appended to the toolbar, e.g. a word count. */
|
|
16
|
+
toolbarExtra?: ReactNode;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The editorial writing surface. Rich text plus links — the same field skin,
|
|
20
|
+
* radius and states as `TextField`, with the toolbar inside the frame.
|
|
21
|
+
*/
|
|
22
|
+
export declare const RichTextEditor: import("react").ForwardRefExoticComponent<RichTextEditorProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
23
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ1E,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAgGD;;;GAGG;AACH,eAAO,MAAM,cAAc,gHAyG1B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export type RichTextEditorSize = "sm" | "md" | "lg";
|
|
3
|
+
export interface RichTextEditorProps {
|
|
4
|
+
/** Initial HTML. The editor is uncontrolled: read changes from `onChange`. */
|
|
5
|
+
defaultValue?: string;
|
|
6
|
+
/** Fired with the document's HTML on every change. */
|
|
7
|
+
onChange?: (html: string) => void;
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
size?: RichTextEditorSize;
|
|
10
|
+
isDisabled?: boolean;
|
|
11
|
+
isInvalid?: boolean;
|
|
12
|
+
/** Accessible name for the editing surface. */
|
|
13
|
+
label?: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
/** Extra controls appended to the toolbar, e.g. a word count. */
|
|
16
|
+
toolbarExtra?: ReactNode;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The editorial writing surface. Rich text plus links — the same field skin,
|
|
20
|
+
* radius and states as `TextField`, with the toolbar inside the frame.
|
|
21
|
+
*/
|
|
22
|
+
export declare const RichTextEditor: import("react").ForwardRefExoticComponent<RichTextEditorProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ1E,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAgGD;;;GAGG;AACH,eAAO,MAAM,cAAc,gHAyG1B,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { Button as e } from "../Button/index.js";
|
|
2
|
+
import { ButtonGroup as t } from "../ButtonGroup/index.js";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { forwardRef as n, useCallback as r, useState as i } from "react";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
import { EditorContent as s, useEditor as c, useEditorState as l } from "@tiptap/react";
|
|
7
|
+
import u from "@tiptap/starter-kit";
|
|
8
|
+
import d from "@tiptap/extension-link";
|
|
9
|
+
import f from "@tiptap/extension-placeholder";
|
|
10
|
+
//#region src/components/RichTextEditor/index.tsx
|
|
11
|
+
var p = [
|
|
12
|
+
[
|
|
13
|
+
{
|
|
14
|
+
id: "bold",
|
|
15
|
+
icon: "bold",
|
|
16
|
+
label: "Bold",
|
|
17
|
+
run: (e) => e.chain().focus().toggleBold().run(),
|
|
18
|
+
active: (e) => e.isActive("bold")
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "italic",
|
|
22
|
+
icon: "italic",
|
|
23
|
+
label: "Italic",
|
|
24
|
+
run: (e) => e.chain().focus().toggleItalic().run(),
|
|
25
|
+
active: (e) => e.isActive("italic")
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "strike",
|
|
29
|
+
icon: "strikethrough",
|
|
30
|
+
label: "Strikethrough",
|
|
31
|
+
run: (e) => e.chain().focus().toggleStrike().run(),
|
|
32
|
+
active: (e) => e.isActive("strike")
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "code",
|
|
36
|
+
icon: "code",
|
|
37
|
+
label: "Inline code",
|
|
38
|
+
run: (e) => e.chain().focus().toggleCode().run(),
|
|
39
|
+
active: (e) => e.isActive("code")
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
[
|
|
43
|
+
{
|
|
44
|
+
id: "h2",
|
|
45
|
+
icon: "heading-2",
|
|
46
|
+
label: "Heading",
|
|
47
|
+
run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),
|
|
48
|
+
active: (e) => e.isActive("heading", { level: 2 })
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "h3",
|
|
52
|
+
icon: "heading-3",
|
|
53
|
+
label: "Subheading",
|
|
54
|
+
run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),
|
|
55
|
+
active: (e) => e.isActive("heading", { level: 3 })
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: "quote",
|
|
59
|
+
icon: "quote",
|
|
60
|
+
label: "Quote",
|
|
61
|
+
run: (e) => e.chain().focus().toggleBlockquote().run(),
|
|
62
|
+
active: (e) => e.isActive("blockquote")
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
[{
|
|
66
|
+
id: "ul",
|
|
67
|
+
icon: "list",
|
|
68
|
+
label: "Bulleted list",
|
|
69
|
+
run: (e) => e.chain().focus().toggleBulletList().run(),
|
|
70
|
+
active: (e) => e.isActive("bulletList")
|
|
71
|
+
}, {
|
|
72
|
+
id: "ol",
|
|
73
|
+
icon: "list-ordered",
|
|
74
|
+
label: "Numbered list",
|
|
75
|
+
run: (e) => e.chain().focus().toggleOrderedList().run(),
|
|
76
|
+
active: (e) => e.isActive("orderedList")
|
|
77
|
+
}],
|
|
78
|
+
[{
|
|
79
|
+
id: "undo",
|
|
80
|
+
icon: "undo",
|
|
81
|
+
label: "Undo",
|
|
82
|
+
run: (e) => e.chain().focus().undo().run()
|
|
83
|
+
}, {
|
|
84
|
+
id: "redo",
|
|
85
|
+
icon: "redo",
|
|
86
|
+
label: "Redo",
|
|
87
|
+
run: (e) => e.chain().focus().redo().run()
|
|
88
|
+
}]
|
|
89
|
+
], m = n(function({ defaultValue: n = "", onChange: m, placeholder: h = "Write something…", size: g = "md", isDisabled: _ = !1, isInvalid: v = !1, label: y = "Rich text editor", className: b, toolbarExtra: x }, S) {
|
|
90
|
+
let [C, w] = i(!1), T = c({
|
|
91
|
+
immediatelyRender: !1,
|
|
92
|
+
editable: !_,
|
|
93
|
+
content: n,
|
|
94
|
+
extensions: [
|
|
95
|
+
u.configure({ link: !1 }),
|
|
96
|
+
d.configure({
|
|
97
|
+
openOnClick: !1,
|
|
98
|
+
autolink: !0
|
|
99
|
+
}),
|
|
100
|
+
f.configure({ placeholder: h })
|
|
101
|
+
],
|
|
102
|
+
editorProps: { attributes: {
|
|
103
|
+
role: "textbox",
|
|
104
|
+
"aria-label": y,
|
|
105
|
+
"aria-multiline": "true"
|
|
106
|
+
} },
|
|
107
|
+
onFocus: () => w(!0),
|
|
108
|
+
onBlur: () => w(!1),
|
|
109
|
+
onUpdate: ({ editor: e }) => m?.(e.getHTML())
|
|
110
|
+
}), E = l({
|
|
111
|
+
editor: T,
|
|
112
|
+
selector: ({ editor: e }) => e ? {
|
|
113
|
+
active: Object.fromEntries(p.flat().map((t) => [t.id, t.active?.(e) ?? !1])),
|
|
114
|
+
linkActive: e.isActive("link")
|
|
115
|
+
} : null
|
|
116
|
+
}), D = r(() => {
|
|
117
|
+
if (!T) return;
|
|
118
|
+
if (T.isActive("link")) {
|
|
119
|
+
T.chain().focus().unsetLink().run();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
let e = window.prompt("Link to");
|
|
123
|
+
e && T.chain().focus().extendMarkRange("link").setLink({ href: e }).run();
|
|
124
|
+
}, [T]);
|
|
125
|
+
return /* @__PURE__ */ o("div", {
|
|
126
|
+
ref: S,
|
|
127
|
+
className: ["ds-rte", b].filter(Boolean).join(" "),
|
|
128
|
+
"data-focused": C || void 0,
|
|
129
|
+
"data-disabled": _ || void 0,
|
|
130
|
+
"aria-invalid": v || void 0,
|
|
131
|
+
children: [/* @__PURE__ */ o("div", {
|
|
132
|
+
className: "ds-rte__toolbar",
|
|
133
|
+
role: "toolbar",
|
|
134
|
+
"aria-label": `${y} formatting`,
|
|
135
|
+
children: [
|
|
136
|
+
p.map((n, r) => /* @__PURE__ */ a(t, {
|
|
137
|
+
"aria-label": `Formatting ${r + 1}`,
|
|
138
|
+
children: n.map((t) => /* @__PURE__ */ a(e, {
|
|
139
|
+
size: "sm",
|
|
140
|
+
isIconOnly: !0,
|
|
141
|
+
iconStart: t.icon,
|
|
142
|
+
"aria-label": t.label,
|
|
143
|
+
title: t.label,
|
|
144
|
+
"aria-pressed": t.active ? E?.active[t.id] : void 0,
|
|
145
|
+
variant: E?.active[t.id] ? "active" : "neutral",
|
|
146
|
+
isDisabled: _ || !T,
|
|
147
|
+
onClick: () => T && t.run(T)
|
|
148
|
+
}, t.id))
|
|
149
|
+
}, r)),
|
|
150
|
+
/* @__PURE__ */ a(t, {
|
|
151
|
+
"aria-label": "Link",
|
|
152
|
+
children: /* @__PURE__ */ a(e, {
|
|
153
|
+
size: "sm",
|
|
154
|
+
isIconOnly: !0,
|
|
155
|
+
iconStart: E?.linkActive ? "link-off" : "link",
|
|
156
|
+
"aria-label": E?.linkActive ? "Remove link" : "Add link",
|
|
157
|
+
title: E?.linkActive ? "Remove link" : "Add link",
|
|
158
|
+
variant: E?.linkActive ? "active" : "neutral",
|
|
159
|
+
isDisabled: _ || !T,
|
|
160
|
+
onClick: D
|
|
161
|
+
})
|
|
162
|
+
}),
|
|
163
|
+
x
|
|
164
|
+
]
|
|
165
|
+
}), /* @__PURE__ */ a("div", {
|
|
166
|
+
className: "ds-rte__content",
|
|
167
|
+
"data-size": g,
|
|
168
|
+
children: /* @__PURE__ */ a(s, { editor: T })
|
|
169
|
+
})]
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
//#endregion
|
|
173
|
+
export { m as RichTextEditor };
|
|
174
|
+
|
|
175
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["StarterKit","Link","Placeholder","GROUPS","RichTextEditor","forwardRef","isFocused","setIsFocused","useState","editor","useEditor","isDisabled","defaultValue","label","onChange","state","useEditorState","toggleLink","useCallback","href","className","isInvalid","ButtonGroup","i","group","Button","tool","toolbarExtra","size","EditorContent"],"sources":["../../../src/components/RichTextEditor/index.tsx"],"sourcesContent":["import { forwardRef, useCallback, useState, type ReactNode } from \"react\";\nimport { EditorContent, useEditor, useEditorState, type Editor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Link from \"@tiptap/extension-link\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { Button } from \"../Button\";\nimport { ButtonGroup } from \"../ButtonGroup\";\nimport type { IconName } from \"../Icon/icons\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nexport type RichTextEditorSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface RichTextEditorProps {\n /** Initial HTML. The editor is uncontrolled: read changes from `onChange`. */\n defaultValue?: string;\n /** Fired with the document's HTML on every change. */\n onChange?: (html: string) => void;\n placeholder?: string;\n size?: RichTextEditorSize;\n isDisabled?: boolean;\n isInvalid?: boolean;\n /** Accessible name for the editing surface. */\n label?: string;\n className?: string;\n /** Extra controls appended to the toolbar, e.g. a word count. */\n toolbarExtra?: ReactNode;\n}\n\ninterface ToolItem {\n id: string;\n icon: IconName;\n label: string;\n run: (editor: Editor) => void;\n active?: (editor: Editor) => boolean;\n}\n\nconst GROUPS: ToolItem[][] = [\n [\n {\n id: \"bold\",\n icon: \"bold\",\n label: \"Bold\",\n run: (e) => e.chain().focus().toggleBold().run(),\n active: (e) => e.isActive(\"bold\"),\n },\n {\n id: \"italic\",\n icon: \"italic\",\n label: \"Italic\",\n run: (e) => e.chain().focus().toggleItalic().run(),\n active: (e) => e.isActive(\"italic\"),\n },\n {\n id: \"strike\",\n icon: \"strikethrough\",\n label: \"Strikethrough\",\n run: (e) => e.chain().focus().toggleStrike().run(),\n active: (e) => e.isActive(\"strike\"),\n },\n {\n id: \"code\",\n icon: \"code\",\n label: \"Inline code\",\n run: (e) => e.chain().focus().toggleCode().run(),\n active: (e) => e.isActive(\"code\"),\n },\n ],\n [\n {\n id: \"h2\",\n icon: \"heading-2\",\n label: \"Heading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 2 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 2 }),\n },\n {\n id: \"h3\",\n icon: \"heading-3\",\n label: \"Subheading\",\n run: (e) => e.chain().focus().toggleHeading({ level: 3 }).run(),\n active: (e) => e.isActive(\"heading\", { level: 3 }),\n },\n {\n id: \"quote\",\n icon: \"quote\",\n label: \"Quote\",\n run: (e) => e.chain().focus().toggleBlockquote().run(),\n active: (e) => e.isActive(\"blockquote\"),\n },\n ],\n [\n {\n id: \"ul\",\n icon: \"list\",\n label: \"Bulleted list\",\n run: (e) => e.chain().focus().toggleBulletList().run(),\n active: (e) => e.isActive(\"bulletList\"),\n },\n {\n id: \"ol\",\n icon: \"list-ordered\",\n label: \"Numbered list\",\n run: (e) => e.chain().focus().toggleOrderedList().run(),\n active: (e) => e.isActive(\"orderedList\"),\n },\n ],\n [\n {\n id: \"undo\",\n icon: \"undo\",\n label: \"Undo\",\n run: (e) => e.chain().focus().undo().run(),\n },\n {\n id: \"redo\",\n icon: \"redo\",\n label: \"Redo\",\n run: (e) => e.chain().focus().redo().run(),\n },\n ],\n];\n\n/**\n * The editorial writing surface. Rich text plus links — the same field skin,\n * radius and states as `TextField`, with the toolbar inside the frame.\n */\nexport const RichTextEditor = forwardRef<HTMLDivElement, RichTextEditorProps>(\n function RichTextEditor(\n {\n defaultValue = \"\",\n onChange,\n placeholder = \"Write something…\",\n size = \"md\",\n isDisabled = false,\n isInvalid = false,\n label = \"Rich text editor\",\n className,\n toolbarExtra,\n },\n ref,\n ) {\n const [isFocused, setIsFocused] = useState(false);\n\n const editor = useEditor({\n immediatelyRender: false,\n editable: !isDisabled,\n content: defaultValue,\n extensions: [\n StarterKit.configure({ link: false }),\n Link.configure({ openOnClick: false, autolink: true }),\n Placeholder.configure({ placeholder }),\n ],\n editorProps: {\n attributes: { role: \"textbox\", \"aria-label\": label, \"aria-multiline\": \"true\" },\n },\n onFocus: () => setIsFocused(true),\n onBlur: () => setIsFocused(false),\n onUpdate: ({ editor: e }) => onChange?.(e.getHTML()),\n });\n\n const state = useEditorState({\n editor,\n selector: ({ editor: e }) =>\n e\n ? {\n active: Object.fromEntries(\n GROUPS.flat().map((t) => [t.id, t.active?.(e) ?? false]),\n ),\n linkActive: e.isActive(\"link\"),\n }\n : null,\n });\n\n const toggleLink = useCallback(() => {\n if (!editor) return;\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const href = window.prompt(\"Link to\");\n if (!href) return;\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href }).run();\n }, [editor]);\n\n return (\n <div\n ref={ref}\n className={[\"ds-rte\", className].filter(Boolean).join(\" \")}\n data-focused={isFocused || undefined}\n data-disabled={isDisabled || undefined}\n aria-invalid={isInvalid || undefined}\n >\n <div className=\"ds-rte__toolbar\" role=\"toolbar\" aria-label={`${label} formatting`}>\n {GROUPS.map((group, i) => (\n <ButtonGroup key={i} aria-label={`Formatting ${i + 1}`}>\n {group.map((tool) => (\n <Button\n key={tool.id}\n size=\"sm\"\n isIconOnly\n iconStart={tool.icon}\n aria-label={tool.label}\n title={tool.label}\n aria-pressed={tool.active ? state?.active[tool.id] : undefined}\n variant={state?.active[tool.id] ? \"active\" : \"neutral\"}\n isDisabled={isDisabled || !editor}\n onClick={() => editor && tool.run(editor)}\n />\n ))}\n </ButtonGroup>\n ))}\n <ButtonGroup aria-label=\"Link\">\n <Button\n size=\"sm\"\n isIconOnly\n iconStart={state?.linkActive ? \"link-off\" : \"link\"}\n aria-label={state?.linkActive ? \"Remove link\" : \"Add link\"}\n title={state?.linkActive ? \"Remove link\" : \"Add link\"}\n variant={state?.linkActive ? \"active\" : \"neutral\"}\n isDisabled={isDisabled || !editor}\n onClick={toggleLink}\n />\n </ButtonGroup>\n {toolbarExtra}\n </div>\n <div className=\"ds-rte__content\" data-size={size}>\n <EditorContent editor={editor} />\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
/* The editor is a field: field radius, control stroke, derived fill. The
|
|
3
|
+
* toolbar is inside the frame, separated by a hairline rule. */
|
|
4
|
+
.ds-rte {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
border: var(--control-border-width) solid var(--control-border-color);
|
|
8
|
+
border-radius: var(--field-radius);
|
|
9
|
+
/* The writing surface stays on the light page surface — only the toolbar
|
|
10
|
+
* band carries the derived field fill. */
|
|
11
|
+
background: var(--color-surface);
|
|
12
|
+
color: var(--color-text);
|
|
13
|
+
font-family: var(--font-sans);
|
|
14
|
+
overflow: hidden;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.ds-rte[data-focused] {
|
|
18
|
+
outline: var(--control-border-width) solid var(--color-focus);
|
|
19
|
+
outline-offset: 2px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.ds-rte[aria-invalid="true"] {
|
|
23
|
+
border-color: var(--color-danger);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.ds-rte[aria-invalid="true"] .ds-rte__toolbar {
|
|
27
|
+
background: var(--field-invalid);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.ds-rte[data-disabled] {
|
|
31
|
+
opacity: 45%;
|
|
32
|
+
cursor: not-allowed;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.ds-rte__toolbar {
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-wrap: wrap;
|
|
38
|
+
align-items: center;
|
|
39
|
+
gap: var(--space-2);
|
|
40
|
+
padding: var(--space-2);
|
|
41
|
+
background: var(--field-rest);
|
|
42
|
+
border-block-end: var(--rule-width) solid var(--rule-color);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
.ds-rte__content[data-size="sm"] {
|
|
47
|
+
min-block-size: var(--editor-height-sm);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.ds-rte__content[data-size="md"] {
|
|
51
|
+
min-block-size: var(--editor-height-md);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.ds-rte__content[data-size="lg"] {
|
|
55
|
+
min-block-size: var(--editor-height-lg);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.ds-rte__content {
|
|
59
|
+
padding: var(--space-3);
|
|
60
|
+
font-size: var(--font-size-md);
|
|
61
|
+
line-height: var(--line-height-body);
|
|
62
|
+
overflow-y: auto;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.ds-rte__content .tiptap {
|
|
66
|
+
outline: none;
|
|
67
|
+
min-block-size: 100%;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.ds-rte__content .tiptap > * + * {
|
|
71
|
+
margin-block-start: var(--space-3);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.ds-rte__content h2 {
|
|
75
|
+
font-size: var(--font-size-lg);
|
|
76
|
+
font-weight: var(--font-weight-bold);
|
|
77
|
+
line-height: var(--line-height-tight);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.ds-rte__content h3 {
|
|
81
|
+
font-size: var(--font-size-md-lg);
|
|
82
|
+
font-weight: var(--font-weight-semibold);
|
|
83
|
+
line-height: var(--line-height-tight);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.ds-rte__content ul,
|
|
87
|
+
.ds-rte__content ol {
|
|
88
|
+
padding-inline-start: var(--space-5);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.ds-rte__content ul {
|
|
92
|
+
list-style: disc;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.ds-rte__content ol {
|
|
96
|
+
list-style: decimal;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.ds-rte__content li + li {
|
|
100
|
+
margin-block-start: var(--space-1);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.ds-rte__content blockquote {
|
|
104
|
+
padding-inline-start: var(--space-3);
|
|
105
|
+
border-inline-start: var(--rail-width) solid var(--color-border-strong);
|
|
106
|
+
color: var(--color-text-muted);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.ds-rte__content code {
|
|
110
|
+
font-family: var(--font-mono);
|
|
111
|
+
font-size: var(--font-size-sm);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.ds-rte__content pre {
|
|
115
|
+
padding: var(--space-3);
|
|
116
|
+
border-radius: var(--field-radius);
|
|
117
|
+
background: var(--color-surface-sunken, var(--field-hover));
|
|
118
|
+
font-family: var(--font-mono);
|
|
119
|
+
font-size: var(--font-size-sm);
|
|
120
|
+
overflow-x: auto;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.ds-rte__content a {
|
|
124
|
+
color: var(--color-primary-text);
|
|
125
|
+
text-decoration: underline;
|
|
126
|
+
text-underline-offset: 2px;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.ds-rte__content p.is-editor-empty:first-child::before {
|
|
130
|
+
content: attr(data-placeholder);
|
|
131
|
+
color: var(--color-text-muted);
|
|
132
|
+
float: inline-start;
|
|
133
|
+
block-size: 0;
|
|
134
|
+
pointer-events: none;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/Icon-CWsA1W83.cjs");;/* empty css */const t=require("../FieldAffix/index.cjs");let n=require("react"),r=require("react/jsx-runtime");var i=(0,n.forwardRef)(function({size:i=`md`,isDisabled:a=!1,onClear:o,className:s,placeholder:c=`Search`,value:l,disabled:u,onKeyDown:d,...f},p){let m=(0,n.useRef)(null),h=l!==void 0&&String(l).length>0;return(0,r.jsx)(t.FieldAffix,{className:s,lead:(0,r.jsx)(e.t,{name:`search`,size:16}),isTrailInteractive:!0,trail:h&&o?(0,r.jsx)(`button`,{type:`button`,className:`ds-search__clear`,"aria-label":`Clear search`,disabled:a||u,onClick:()=>{o(),m.current?.focus()},children:(0,r.jsx)(e.t,{name:`x`,size:16})}):void 0,children:(0,r.jsx)(`input`,{ref:e=>{m.current=e,typeof p==`function`?p(e):p&&(p.current=e)},type:`search`,value:l,placeholder:c,disabled:a||u,"data-size":i,className:`ds-field-skin ds-search__input`,onKeyDown:e=>{e.key===`Escape`&&o&&o(),d?.(e)},...f})})});exports.SearchField=i;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["forwardRef","useRef","FieldAffix","Icon","require_Icon","require_components_FieldAffix_index","react","react_jsx_runtime","SearchField","rest","inner","hasValue","value","onClear","isDisabled","disabled","node","ref","size","event","onKeyDown"],"sources":["../../../src/components/SearchField/index.tsx"],"sourcesContent":["import { forwardRef, useRef, type InputHTMLAttributes } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { FieldAffix } from \"../FieldAffix\";\nimport type { FieldSize } from \"../Field\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nexport interface SearchFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\" | \"type\"> {\n size?: FieldSize;\n isDisabled?: boolean;\n /** Fired by the clear button and by Escape. */\n onClear?: () => void;\n}\n\n/** A filter over a collection. Carries the glyph, and clears without a Save. */\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(function SearchField(\n {\n size = \"md\",\n isDisabled = false,\n onClear,\n className,\n placeholder = \"Search\",\n value,\n disabled,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const inner = useRef<HTMLInputElement | null>(null);\n const hasValue = value !== undefined ? String(value).length > 0 : false;\n\n return (\n <FieldAffix\n className={className}\n lead={<Icon name=\"search\" size={16} />}\n isTrailInteractive\n trail={\n hasValue && onClear ? (\n <button\n type=\"button\"\n className=\"ds-search__clear\"\n aria-label=\"Clear search\"\n disabled={isDisabled || disabled}\n onClick={() => {\n onClear();\n inner.current?.focus();\n }}\n >\n <Icon name=\"x\" size={16} />\n </button>\n ) : undefined\n }\n >\n <input\n ref={(node) => {\n inner.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"search\"\n value={value}\n placeholder={placeholder}\n disabled={isDisabled || disabled}\n data-size={size}\n className=\"ds-field-skin ds-search__input\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\" && onClear) onClear();\n onKeyDown?.(event);\n }}\n {...rest}\n />\n </FieldAffix>\n );\n});\n"],"mappings":"A,iQAgBA,IAAaQ,GAAA,EAAcR,EAAAA,WAAAA,CAA+C,SACxE,CACE,OAAO,KACP,aAAa,GACb,UACA,YACA,cAAc,SACd,QACA,WACA,YACA,GAAGS,GAEL,EACA,CACA,IAAMC,GAAA,EAAQT,EAAAA,OAAAA,CAAgC,IAAI,EAC5CU,EAAWC,IAAU,IAAA,IAAY,OAAOA,CAAK,CAAC,CAAC,OAAS,EAE9D,OACE,EAAAL,EAAA,IAAA,CAACL,EAAAA,WAAD,CACa,YACX,MAAM,EAAAK,EAAA,IAAA,CAACJ,EAAAA,EAAD,CAAM,KAAK,SAAS,KAAM,EAAK,CAAA,EACrC,mBAAA,GACA,MACEQ,GAAYE,GACV,EAAAN,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAU,mBACV,aAAW,eACX,SAAUO,GAAcC,EACxB,YAAe,CACbF,EAAQ,EACRH,EAAM,SAAS,MAAM,CACvB,EAEA,UAAA,EAAAH,EAAA,IAAA,CAACJ,EAAAA,EAAD,CAAM,KAAK,IAAI,KAAM,EAAK,CAAA,CACpB,CAAA,EACN,IAAA,GAGN,UAAA,EAAAI,EAAA,IAAA,CAAC,QAAD,CACE,IAAM,GAAS,CACb,EAAM,QAAUS,EACZ,OAAOC,GAAQ,WAAYA,EAAID,CAAI,EAC9BC,IAAK,EAAI,QAAUD,EAC9B,EACA,KAAK,SACE,QACM,cACb,SAAUF,GAAcC,EACxB,YAAWG,EACX,UAAU,iCACV,UAAY,GAAU,CAChBC,EAAM,MAAQ,UAAYN,GAASA,EAAQ,EAC/CO,IAAYD,CAAK,CACnB,EACA,GAAIV,CACL,CAAA,CACS,CAAA,CAEhB,CAAC,E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type InputHTMLAttributes } from "react";
|
|
2
|
+
import type { FieldSize } from "../Field/index.cjs";
|
|
3
|
+
export interface SearchFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "type"> {
|
|
4
|
+
size?: FieldSize;
|
|
5
|
+
isDisabled?: boolean;
|
|
6
|
+
/** Fired by the clear button and by Escape. */
|
|
7
|
+
onClear?: () => void;
|
|
8
|
+
}
|
|
9
|
+
/** A filter over a collection. Carries the glyph, and clears without a Save. */
|
|
10
|
+
export declare const SearchField: import("react").ForwardRefExoticComponent<SearchFieldProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
11
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/components/SearchField/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAErB,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,gFAAgF;AAChF,eAAO,MAAM,WAAW,+GA2DtB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type InputHTMLAttributes } from "react";
|
|
2
|
+
import type { FieldSize } from "../Field/index.js";
|
|
3
|
+
export interface SearchFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "type"> {
|
|
4
|
+
size?: FieldSize;
|
|
5
|
+
isDisabled?: boolean;
|
|
6
|
+
/** Fired by the clear button and by Escape. */
|
|
7
|
+
onClear?: () => void;
|
|
8
|
+
}
|
|
9
|
+
/** A filter over a collection. Carries the glyph, and clears without a Save. */
|
|
10
|
+
export declare const SearchField: import("react").ForwardRefExoticComponent<SearchFieldProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SearchField/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,aAAa,CAAC;AAErB,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,gFAAgF;AAChF,eAAO,MAAM,WAAW,+GA2DtB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { t as e } from "../../chunks/Icon-CGY1FNXT.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
import { FieldAffix as t } from "../FieldAffix/index.js";
|
|
4
|
+
import { forwardRef as n, useRef as r } from "react";
|
|
5
|
+
import { jsx as i } from "react/jsx-runtime";
|
|
6
|
+
//#region src/components/SearchField/index.tsx
|
|
7
|
+
var a = n(function({ size: n = "md", isDisabled: a = !1, onClear: o, className: s, placeholder: c = "Search", value: l, disabled: u, onKeyDown: d, ...f }, p) {
|
|
8
|
+
let m = r(null), h = l !== void 0 && String(l).length > 0;
|
|
9
|
+
return /* @__PURE__ */ i(t, {
|
|
10
|
+
className: s,
|
|
11
|
+
lead: /* @__PURE__ */ i(e, {
|
|
12
|
+
name: "search",
|
|
13
|
+
size: 16
|
|
14
|
+
}),
|
|
15
|
+
isTrailInteractive: !0,
|
|
16
|
+
trail: h && o ? /* @__PURE__ */ i("button", {
|
|
17
|
+
type: "button",
|
|
18
|
+
className: "ds-search__clear",
|
|
19
|
+
"aria-label": "Clear search",
|
|
20
|
+
disabled: a || u,
|
|
21
|
+
onClick: () => {
|
|
22
|
+
o(), m.current?.focus();
|
|
23
|
+
},
|
|
24
|
+
children: /* @__PURE__ */ i(e, {
|
|
25
|
+
name: "x",
|
|
26
|
+
size: 16
|
|
27
|
+
})
|
|
28
|
+
}) : void 0,
|
|
29
|
+
children: /* @__PURE__ */ i("input", {
|
|
30
|
+
ref: (e) => {
|
|
31
|
+
m.current = e, typeof p == "function" ? p(e) : p && (p.current = e);
|
|
32
|
+
},
|
|
33
|
+
type: "search",
|
|
34
|
+
value: l,
|
|
35
|
+
placeholder: c,
|
|
36
|
+
disabled: a || u,
|
|
37
|
+
"data-size": n,
|
|
38
|
+
className: "ds-field-skin ds-search__input",
|
|
39
|
+
onKeyDown: (e) => {
|
|
40
|
+
e.key === "Escape" && o && o(), d?.(e);
|
|
41
|
+
},
|
|
42
|
+
...f
|
|
43
|
+
})
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//#endregion
|
|
47
|
+
export { a as SearchField };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["Icon","SearchField","forwardRef","rest","inner","useRef","hasValue","value","FieldAffix","onClear","isDisabled","disabled","node","ref","size","event","onKeyDown"],"sources":["../../../src/components/SearchField/index.tsx"],"sourcesContent":["import { forwardRef, useRef, type InputHTMLAttributes } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { FieldAffix } from \"../FieldAffix\";\nimport type { FieldSize } from \"../Field\";\nimport \"../Field/style.css\";\nimport \"./style.css\";\n\nexport interface SearchFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\" | \"type\"> {\n size?: FieldSize;\n isDisabled?: boolean;\n /** Fired by the clear button and by Escape. */\n onClear?: () => void;\n}\n\n/** A filter over a collection. Carries the glyph, and clears without a Save. */\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(function SearchField(\n {\n size = \"md\",\n isDisabled = false,\n onClear,\n className,\n placeholder = \"Search\",\n value,\n disabled,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const inner = useRef<HTMLInputElement | null>(null);\n const hasValue = value !== undefined ? String(value).length > 0 : false;\n\n return (\n <FieldAffix\n className={className}\n lead={<Icon name=\"search\" size={16} />}\n isTrailInteractive\n trail={\n hasValue && onClear ? (\n <button\n type=\"button\"\n className=\"ds-search__clear\"\n aria-label=\"Clear search\"\n disabled={isDisabled || disabled}\n onClick={() => {\n onClear();\n inner.current?.focus();\n }}\n >\n <Icon name=\"x\" size={16} />\n </button>\n ) : undefined\n }\n >\n <input\n ref={(node) => {\n inner.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"search\"\n value={value}\n placeholder={placeholder}\n disabled={isDisabled || disabled}\n data-size={size}\n className=\"ds-field-skin ds-search__input\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\" && onClear) onClear();\n onKeyDown?.(event);\n }}\n {...rest}\n />\n </FieldAffix>\n );\n});\n"],"mappings":";;;;;;AAgBA,IAAaC,IAAcC,EAA+C,SACxE,EACE,UAAO,MACP,gBAAa,IACb,YACA,cACA,iBAAc,UACd,UACA,aACA,cACA,GAAGC,KAEL,GACA;CACA,IAAMC,IAAQC,EAAgC,IAAI,GAC5CC,IAAWC,MAAU,KAAA,KAAY,OAAOA,CAAK,CAAC,CAAC,SAAS;CAE9D,OACE,kBAACC,GAAD;EACa;EACX,MAAM,kBAACR,GAAD;GAAM,MAAK;GAAS,MAAM;EAAK,CAAA;EACrC,oBAAA;EACA,OACEM,KAAYG,IACV,kBAAC,UAAD;GACE,MAAK;GACL,WAAU;GACV,cAAW;GACX,UAAUC,KAAcC;GACxB,eAAe;IAEb,AADAF,EAAQ,GACRL,EAAM,SAAS,MAAM;GACvB;GAEA,UAAA,kBAACJ,GAAD;IAAM,MAAK;IAAI,MAAM;GAAK,CAAA;EACpB,CAAA,IACN,KAAA;EAGN,UAAA,kBAAC,SAAD;GACE,MAAM,MAAS;IAEb,AADA,EAAM,UAAUY,GACZ,OAAOC,KAAQ,aAAYA,EAAID,CAAI,IAC9BC,MAAK,EAAI,UAAUD;GAC9B;GACA,MAAK;GACE;GACM;GACb,UAAUF,KAAcC;GACxB,aAAWG;GACX,WAAU;GACV,YAAY,MAAU;IAEpB,AADIC,EAAM,QAAQ,YAAYN,KAASA,EAAQ,GAC/CO,IAAYD,CAAK;GACnB;GACA,GAAIZ;EACL,CAAA;CACS,CAAA;AAEhB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.ds-search__input::-webkit-search-cancel-button {
|
|
3
|
+
appearance: none;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.ds-search__clear {
|
|
7
|
+
display: grid;
|
|
8
|
+
place-items: center;
|
|
9
|
+
inline-size: var(--space-6);
|
|
10
|
+
block-size: var(--space-6);
|
|
11
|
+
border: none;
|
|
12
|
+
border-radius: var(--radius-sm);
|
|
13
|
+
background: transparent;
|
|
14
|
+
color: var(--color-text-muted);
|
|
15
|
+
cursor: pointer;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.ds-search__clear:hover {
|
|
19
|
+
background: var(--field-hover);
|
|
20
|
+
color: var(--color-text);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.ds-search__clear:focus-visible {
|
|
24
|
+
outline: var(--control-border-width) solid var(--color-focus);
|
|
25
|
+
outline-offset: 2px;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../chunks/Icon-CWsA1W83.cjs");;/* empty css */const t=require("../Popover/index.cjs");let n=require("react"),r=require("react/jsx-runtime");function i(...e){return e.filter(Boolean).join(` `)}var a=(0,n.forwardRef)(function({options:a,value:o,defaultValue:s,onValueChange:c,placeholder:l=`Select an option`,size:u=`md`,isDisabled:d=!1,isInvalid:f=!1,className:p,disabled:m,onClick:h,onKeyDown:g,..._},v){let[y,b]=(0,n.useState)(s??``),x=o??y,[S,C]=(0,n.useState)(!1),[w,T]=(0,n.useState)(0),E=(0,n.useRef)(null),D=(0,n.useRef)(null),O=(0,n.useRef)(null),k=(0,n.useId)(),A=d||m,j=S&&!A,M=a.find(e=>e.value===x),N=a.filter(e=>!e.isDisabled),P=(0,n.useCallback)(e=>{o===void 0&&b(e),c?.(e),C(!1)},[c,o]);(0,n.useEffect)(()=>{if(!j)return;let e=a.findIndex(e=>e.value===x&&!e.isDisabled);T(e<0?a.indexOf(N[0]):e);let t=e=>{let t=e.target;!E.current?.contains(t)&&!O.current?.contains(t)&&C(!1)};return document.addEventListener(`mousedown`,t),()=>document.removeEventListener(`mousedown`,t)},[j]),(0,n.useEffect)(()=>{j&&(O.current?.querySelectorAll(`[role='option']`)[w])?.scrollIntoView({block:`nearest`})},[w,j]);let F=e=>{let t=a.map((e,t)=>({option:e,index:t})).filter(e=>!e.option.isDisabled);if(t.length===0)return;let n=t[(t.findIndex(e=>e.index===w)+e+t.length)%t.length];T(n.index)},I=e=>{if(!A){if(e.key===`Escape`)C(!1),D.current?.focus();else if(!j&&(e.key===`ArrowDown`||e.key===`ArrowUp`||e.key===`Enter`||e.key===` `))e.preventDefault(),C(!0);else if(j){if(e.key===`Tab`)C(!1);else if(e.key===`ArrowDown`||e.key===`ArrowUp`)e.preventDefault(),F(e.key===`ArrowDown`?1:-1);else if(e.key===`Home`||e.key===`End`){e.preventDefault();let t=e.key===`Home`?N[0]:N[N.length-1];t&&T(a.indexOf(t))}else if(e.key===`Enter`||e.key===` `){e.preventDefault();let t=a[w];t&&!t.isDisabled&&P(t.value)}}}};return(0,r.jsxs)(`div`,{className:`ds-select-root`,ref:E,children:[(0,r.jsxs)(`button`,{ref:e=>{D.current=e,typeof v==`function`?v(e):v&&(v.current=e)},type:`button`,role:`combobox`,"aria-haspopup":`listbox`,"aria-expanded":j,"aria-controls":j?k:void 0,"aria-activedescendant":j&&a[w]&&!a[w].isDisabled?`${k}-option-${w}`:void 0,"aria-invalid":f||void 0,disabled:A,"data-size":u,"data-placeholder":M?void 0:``,className:i(`ds-field-skin`,`ds-select`,p),onClick:e=>{h?.(e),e.defaultPrevented||C(e=>!e)},onKeyDown:e=>{g?.(e),e.defaultPrevented||I(e)},..._,children:[(0,r.jsx)(`span`,{className:`ds-select__value`,children:M?M.label:l}),(0,r.jsx)(e.t,{name:`chevron-down`,size:16,className:`ds-select__chevron`})]}),(0,r.jsx)(t.Popover,{anchorRef:D,isOpen:j,matchAnchorWidth:!0,panelRef:O,id:k,role:`listbox`,"aria-label":_[`aria-label`]??l,className:`ds-surface-raised ds-select__menu`,children:(0,r.jsx)(`div`,{onKeyDown:I,children:a.map((t,n)=>(0,r.jsxs)(`div`,{id:`${k}-option-${n}`,role:`option`,"aria-selected":t.value===x,"aria-disabled":t.isDisabled||void 0,"data-active":n===w||void 0,className:`ds-select__option`,onMouseEnter:()=>!t.isDisabled&&T(n),onClick:()=>{t.isDisabled||(P(t.value),D.current?.focus())},children:[(0,r.jsxs)(`span`,{className:`ds-select__option-body`,children:[(0,r.jsx)(`span`,{className:`ds-select__option-label`,children:t.label}),t.description&&(0,r.jsx)(`span`,{className:`ds-select__option-description`,children:t.description})]}),t.value===x&&(0,r.jsx)(e.t,{name:`check`,size:16})]},t.value))})})]})});exports.Select=a;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|