@loword/loword-design-system 0.4.2 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/LDButton/LDButton.d.ts +2 -0
- package/dist/components/LDButton/LDButton.d.ts.map +1 -1
- package/dist/components/LDButton/LDButton.js +18 -3
- package/dist/components/LDDatePicker/LDDatePicker.js +1 -1
- package/dist/components/LDDateRangePicker/LDDateRangePicker.js +1 -1
- package/dist/components/LDDrawer/LDDrawer.d.ts.map +1 -1
- package/dist/components/LDDrawer/LDDrawer.js +10 -9
- package/dist/components/LDEditor/EditorBase.d.ts.map +1 -1
- package/dist/components/LDEditor/EditorBase.js +7 -1
- package/dist/components/LDEditor/LDEditor.d.ts +8 -1
- package/dist/components/LDEditor/LDEditor.d.ts.map +1 -1
- package/dist/components/LDEditor/LDEditor.js +376 -90
- package/dist/components/LDEditor/LDViewer.d.ts.map +1 -1
- package/dist/components/LDEditor/LDViewer.js +4 -1
- package/dist/components/LDEditor/extensions.d.ts +2 -1
- package/dist/components/LDEditor/extensions.d.ts.map +1 -1
- package/dist/components/LDEditor/extensions.js +11 -1
- package/dist/components/LDModal/LDModal.d.ts +2 -0
- package/dist/components/LDModal/LDModal.d.ts.map +1 -1
- package/dist/components/LDModal/LDModal.js +1 -1
- package/dist/components/LDModal/LDModalView.d.ts +3 -1
- package/dist/components/LDModal/LDModalView.d.ts.map +1 -1
- package/dist/components/LDModal/LDModalView.js +3 -3
- package/dist/index.css +139 -45
- package/package.json +6 -1
- package/src/styles/components/editor.css +74 -2
|
@@ -15,6 +15,8 @@ type _ButtonProps = {
|
|
|
15
15
|
shape?: ButtonShape;
|
|
16
16
|
align?: ButtonAlign;
|
|
17
17
|
loading?: boolean;
|
|
18
|
+
/** 비동기 클릭 핸들러. 실행이 끝날 때까지 자동으로 loading·disabled 상태가 되어 연속 클릭이 막힌다 */
|
|
19
|
+
asyncClick?: (e: React.MouseEvent<HTMLElement>) => Promise<unknown>;
|
|
18
20
|
block?: boolean;
|
|
19
21
|
leftIcon?: React.ReactNode;
|
|
20
22
|
rightIcon?: React.ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LDButton.d.ts","sourceRoot":"","sources":["../../../src/components/LDButton/LDButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"LDButton.d.ts","sourceRoot":"","sources":["../../../src/components/LDButton/LDButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,WAAW,EAAY,MAAM,OAAO,CAAC;AAMnD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAM7C,KAAK,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;AAC7E,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;AACxE,MAAM,MAAM,UAAU,GAAG,MAAM,CAC7B,IAAI,EACJ,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAC/D,CAAC;AACF,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AACzC,KAAK,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAgO/C,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,WAAW,IAAI,yBAAyB,CAC1E,CAAC,EACD,YAAY,CACb,CAAC;AAEF,KAAK,eAAe,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,QAAQ,EAC5D,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KACpB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;AAE/B,QAAA,MAAM,QAAQ,EAAE,eA0Ef,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
2
3
|
import ButtonBase from '../../components/LDButton/ButtonBase.js';
|
|
3
4
|
import LDSpinner from '../../components/LDSpinner/LDSpinner.js';
|
|
4
5
|
import RenderIcon from '../../components/RenderIcon/RenderIcon.js';
|
|
@@ -210,7 +211,21 @@ const buttonVariants = tv({
|
|
|
210
211
|
},
|
|
211
212
|
],
|
|
212
213
|
});
|
|
213
|
-
const LDButton = ({ as, variant = 'solid', color = 'point', size = 'small', shape = 'default', align = 'center', loading = false, block = false, children, className, leftIcon, rightIcon, compact = false, ref, ...props }) => {
|
|
214
|
+
const LDButton = ({ as, variant = 'solid', color = 'point', size = 'small', shape = 'default', align = 'center', loading = false, asyncClick, block = false, children, className, leftIcon, rightIcon, compact = false, ref, ...props }) => {
|
|
215
|
+
const [pending, setPending] = useState(false);
|
|
216
|
+
const isLoading = loading || pending;
|
|
217
|
+
/* as가 href를 가지면 disabled여도 span으로 렌더돼 클릭이 살아 있으므로 pending도 직접 막는다 */
|
|
218
|
+
const handleAsyncClick = async (e) => {
|
|
219
|
+
if (pending)
|
|
220
|
+
return;
|
|
221
|
+
setPending(true);
|
|
222
|
+
try {
|
|
223
|
+
await asyncClick?.(e);
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
setPending(false);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
214
229
|
return (_jsxs(ButtonBase.Root, { as: as, ref: ref, className: buttonVariants({
|
|
215
230
|
variant,
|
|
216
231
|
color,
|
|
@@ -219,10 +234,10 @@ const LDButton = ({ as, variant = 'solid', color = 'point', size = 'small', shap
|
|
|
219
234
|
align,
|
|
220
235
|
block,
|
|
221
236
|
compact,
|
|
222
|
-
loading,
|
|
237
|
+
loading: isLoading,
|
|
223
238
|
// 미지정도 false 분기(기본 색·hover)를 타야 하므로 boolean으로 좁혀 넘긴다.
|
|
224
239
|
disabled: !!props.disabled,
|
|
225
240
|
className,
|
|
226
|
-
}), ...props, disabled: props.disabled ||
|
|
241
|
+
}), ...props, disabled: props.disabled || isLoading, ...(asyncClick && { onClick: handleAsyncClick }), children: [_jsx(Show, { when: !isLoading, fallback: _jsx(LDSpinner, { className: "absolute top-1/2 left-1/2 -translate-1/2" }), children: _jsx(RenderIcon, { children: leftIcon }) }), _jsx(Show, { when: children, children: _jsx("span", { className: cn('shrink-0', isLoading && 'invisible'), children: children }) }), _jsx(RenderIcon, { className: cn(isLoading && 'invisible'), children: rightIcon })] }));
|
|
227
242
|
};
|
|
228
243
|
export default LDButton;
|
|
@@ -16,7 +16,7 @@ const variantColorClasses = {
|
|
|
16
16
|
filled: {
|
|
17
17
|
neutral: 'bg-neutral50 text-neutral900 border-none outline-2 outline-transparent outline-solid -outline-offset-2 focus-within:bg-tintBlue focus-within:outline-lb500',
|
|
18
18
|
point: 'bg-tintBlue text-neutral900 border-none outline-2 outline-transparent outline-solid -outline-offset-2 focus-within:outline-lb500',
|
|
19
|
-
danger: 'bg-tintRed text-neutral900 border-none outline-2 outline-
|
|
19
|
+
danger: 'bg-tintRed text-neutral900 border-none outline-2 outline-danger600 outline-solid -outline-offset-2',
|
|
20
20
|
},
|
|
21
21
|
outline: {
|
|
22
22
|
neutral: 'bg-transparent text-neutral900 border-none outline-2 outline-neutral100 outline-solid -outline-offset-2 focus-within:outline-lb500',
|
|
@@ -23,7 +23,7 @@ const variantColorClasses = {
|
|
|
23
23
|
filled: {
|
|
24
24
|
neutral: 'bg-neutral50 text-neutral900 border-none outline-2 outline-transparent outline-solid -outline-offset-2 focus-within:bg-tintBlue focus-within:outline-lb500',
|
|
25
25
|
point: 'bg-tintBlue text-neutral900 border-none outline-2 outline-transparent outline-solid -outline-offset-2 focus-within:outline-lb500',
|
|
26
|
-
danger: 'bg-tintRed text-neutral900 border-none outline-2 outline-
|
|
26
|
+
danger: 'bg-tintRed text-neutral900 border-none outline-2 outline-danger600 outline-solid -outline-offset-2',
|
|
27
27
|
},
|
|
28
28
|
outline: {
|
|
29
29
|
neutral: 'bg-transparent text-neutral900 border-none outline-2 outline-neutral100 outline-solid -outline-offset-2 focus-within:outline-lb500',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LDDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/LDDrawer/LDDrawer.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"LDDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/LDDrawer/LDDrawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,10 @@ import DrawerBase, { useDrawerContext, } from '../../components/LDDrawer/DrawerB
|
|
|
6
6
|
import cn from '../../utils/cn.js';
|
|
7
7
|
// ── 방향별 스타일 매핑 ──
|
|
8
8
|
const directionClasses = {
|
|
9
|
-
bottom: 'bottom-0 left-0 right-0 rounded-t-
|
|
10
|
-
top: 'top-0 left-0 right-0 rounded-b-
|
|
11
|
-
left: 'left-0 top-0 bottom-0 rounded-r-
|
|
12
|
-
right: 'right-0 top-0 bottom-0 rounded-l-
|
|
9
|
+
bottom: 'bottom-0 left-0 right-0 rounded-t-[10px] max-h-[95dvh] flex flex-col',
|
|
10
|
+
top: 'top-0 left-0 right-0 rounded-b-[10px] max-h-[95dvh] flex flex-col',
|
|
11
|
+
left: 'left-0 top-0 bottom-0 rounded-r-[10px] w-100 h-full flex flex-col',
|
|
12
|
+
right: 'right-0 top-0 bottom-0 rounded-l-[10px] w-100 h-full flex flex-col',
|
|
13
13
|
};
|
|
14
14
|
/** 열림 상태와 슬라이드 방향을 관리하는 Styled Compound 루트입니다. */
|
|
15
15
|
const Root = (props) => _jsx(DrawerBase.Root, { ...props });
|
|
@@ -23,13 +23,14 @@ const Content = ({ className, ...props }) => {
|
|
|
23
23
|
return (_jsx(DrawerBase.Content, { className: cn('fixed z-50 bg-white outline-hidden', directionClasses[direction], className), ...props }));
|
|
24
24
|
};
|
|
25
25
|
/** Content 안쪽의 여백과 세로 배치를 담당합니다. Handle은 이 바깥에 둡니다. */
|
|
26
|
-
const Panel = ({ className, ...props }) => (_jsx("div", { className: cn('relative flex flex-1 flex-col gap-
|
|
27
|
-
/** 드래그로 LDDrawer를 여닫는 손잡이입니다. */
|
|
28
|
-
|
|
26
|
+
const Panel = ({ className, ...props }) => (_jsx("div", { className: cn('relative flex flex-1 flex-col gap-5 overflow-hidden p-5', className), ...props }));
|
|
27
|
+
/** 드래그로 LDDrawer를 여닫는 손잡이입니다. 공간을 차지하지 않고 패널 상단에 겹쳐 뜹니다. */
|
|
28
|
+
// vaul이 [data-vaul-handle]에 unlayered CSS를 주입해 Tailwind 유틸리티를 이기므로 겹치는 속성은 `!`로 강제한다.
|
|
29
|
+
const Handle = ({ className, ...props }) => (_jsx(DrawerBase.Handle, { className: cn('absolute! top-[17px] left-1/2 z-10 h-1.5! w-19! -translate-x-1/2 rounded-[10px]! bg-neutral100! opacity-100!', className), ...props }));
|
|
29
30
|
/** LDDrawer를 닫는 버튼입니다. children 미지정 시 기본 X 아이콘을 렌더합니다. */
|
|
30
|
-
const Close = ({ children, className, type = 'button', 'aria-label': ariaLabel = '닫기', ...props }) => (_jsx(DrawerBase.Close, { type: type, "aria-label": ariaLabel, className: cn('absolute top-
|
|
31
|
+
const Close = ({ children, className, type = 'button', 'aria-label': ariaLabel = '닫기', ...props }) => (_jsx(DrawerBase.Close, { type: type, "aria-label": ariaLabel, className: cn('absolute top-5 right-5 z-10 flex cursor-pointer text-neutral500 outline-hidden transition-colors after:absolute after:top-1/2 after:left-1/2 after:size-10 after:-translate-1/2 hover:text-neutral700', className), ...props, children: children === undefined ? (_jsx(X, { className: "size-4 tablet:size-5 pc:size-6" })) : (children) }));
|
|
31
32
|
/** 제목과 설명을 묶는 헤더 영역입니다. */
|
|
32
|
-
const Header = ({ className, ...props }) => (_jsx("div", { className: cn('flex flex-col gap-2
|
|
33
|
+
const Header = ({ className, ...props }) => (_jsx("div", { className: cn('flex flex-col items-center gap-2.5 py-5 text-center', className), ...props }));
|
|
33
34
|
/** LDDrawer의 제목입니다. 스크린리더가 읽는 접근 가능한 이름이 됩니다. */
|
|
34
35
|
const Title = ({ className, ...props }) => (_jsx(DrawerBase.Title, { className: cn('display20 bold', className), ...props }));
|
|
35
36
|
/** LDDrawer의 보조 설명입니다. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDEditor/EditorBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,MAAM,EAEX,KAAK,UAAU,EAEhB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAKf,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAID,eAAO,MAAM,gBAAgB,yBAS5B,CAAC;AAGF,UAAU,SAAS;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"EditorBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDEditor/EditorBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,MAAM,EAEX,KAAK,UAAU,EAEhB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAKf,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAID,eAAO,MAAM,gBAAgB,yBAS5B,CAAC;AAGF,UAAU,SAAS;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AA2CD,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAeD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA0BD,UAAU,oBAAoB;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC,CAAC;CACrE;AA4ED,UAAU,aAAa;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD,eAAO,MAAM,UAAU;oEAnMpB,SAAS;6BAuCoB,YAAY;wCAWE,YAAY;yFA2BvD,kBAAkB;sDA4BlB,oBAAoB;;mDA4E+B,aAAa;CAmBlE,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -19,6 +19,9 @@ const Root = ({ extensions, content = '', onChange, className, children, }) => {
|
|
|
19
19
|
immediatelyRender: false,
|
|
20
20
|
editorProps: {
|
|
21
21
|
attributes: {
|
|
22
|
+
// role이 없는 div에는 aria-label이 허용되지 않아 스크린리더가 이름을 무시한다.
|
|
23
|
+
role: 'textbox',
|
|
24
|
+
'aria-multiline': 'true',
|
|
22
25
|
'aria-label': '본문 편집기',
|
|
23
26
|
class: cn('prose prose-lg h-204.5 max-w-none overflow-y-auto rounded-b-md border-x border-b border-neutral200 px-4 py-3 outline-none focus:outline-none mobile:h-[320px]', className),
|
|
24
27
|
},
|
|
@@ -86,7 +89,10 @@ const ToolbarDropdown = ({ trigger, className, children, }) => {
|
|
|
86
89
|
window.addEventListener('resize', measure);
|
|
87
90
|
return () => window.removeEventListener('resize', measure);
|
|
88
91
|
}, [open]);
|
|
89
|
-
return (
|
|
92
|
+
return (
|
|
93
|
+
// flex가 없으면 트리거가 inline 박스가 되어 baseline 아래 여백만큼 래퍼가
|
|
94
|
+
// 버튼보다 높아진다. 그만큼 툴바에서 다른 버튼과 세로 위치가 어긋난다.
|
|
95
|
+
_jsxs("div", { ref: ref, className: "relative flex", children: [trigger({ open, toggle }), open && (_jsx("div", { ref: panelRef, style: { left: -shift }, className: cn('absolute top-full z-50 mt-1', className), children: typeof children === 'function' ? children({ close }) : children }))] }));
|
|
90
96
|
};
|
|
91
97
|
const Toolbar = Object.assign(ToolbarRoot, {
|
|
92
98
|
LDButton: ToolbarButton,
|
|
@@ -2,11 +2,18 @@ export interface LDEditorProps {
|
|
|
2
2
|
content: string;
|
|
3
3
|
onChange?: (html: string) => void;
|
|
4
4
|
className?: string;
|
|
5
|
+
/** 툴바 이미지 업로드와 이미지 붙여넣기에서 호출된다. 반환한 URL이 img의 src가 된다. */
|
|
5
6
|
handleImageUpload?: (fileData: {
|
|
6
7
|
filebase64: string;
|
|
7
8
|
fileName: string;
|
|
8
9
|
}) => Promise<string | null>;
|
|
10
|
+
/**
|
|
11
|
+
* 본문에 그대로 둘 이미지 호스트(예: `['assets.presslearn.co.kr']`). 지정하면 붙여넣은 HTML에서
|
|
12
|
+
* 이 호스트가 아닌 이미지를 받아 handleImageUpload로 올리고, 받지 못하거나 업로드에 실패하면 뺀다.
|
|
13
|
+
* 지정하지 않으면 붙여넣은 외부 이미지는 그대로 둔다.
|
|
14
|
+
*/
|
|
15
|
+
allowedImageHosts?: string[];
|
|
9
16
|
}
|
|
10
|
-
declare const LDEditor: ({ content, onChange, className, handleImageUpload, }: LDEditorProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
declare const LDEditor: ({ content, onChange, className, handleImageUpload, allowedImageHosts, }: LDEditorProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
18
|
export default LDEditor;
|
|
12
19
|
//# sourceMappingURL=LDEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LDEditor.d.ts","sourceRoot":"","sources":["../../../src/components/LDEditor/LDEditor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LDEditor.d.ts","sourceRoot":"","sources":["../../../src/components/LDEditor/LDEditor.tsx"],"names":[],"mappings":"AAiKA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE;QAC7B,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAyUD,QAAA,MAAM,QAAQ,GAAI,yEAMf,aAAa,4CAqBf,CAAC;AA6lBF,eAAe,QAAQ,CAAC"}
|