@uiw/react-json-view 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +155 -13
  2. package/cjs/comps/ellipsis.d.ts +5 -0
  3. package/cjs/comps/ellipsis.js +32 -0
  4. package/cjs/comps/meta.d.ts +8 -0
  5. package/cjs/comps/meta.js +38 -0
  6. package/cjs/copied.js +5 -4
  7. package/cjs/editor/icon/edit.d.ts +4 -0
  8. package/cjs/editor/icon/edit.js +30 -0
  9. package/cjs/editor/index.d.ts +16 -0
  10. package/cjs/editor/index.js +48 -0
  11. package/cjs/editor/objectKey.d.ts +11 -0
  12. package/cjs/editor/objectKey.js +138 -0
  13. package/cjs/editor/value.d.ts +14 -0
  14. package/cjs/editor/value.js +165 -0
  15. package/cjs/index.d.ts +5 -1
  16. package/cjs/node.d.ts +0 -19
  17. package/cjs/node.js +68 -168
  18. package/cjs/semicolon.d.ts +21 -0
  19. package/cjs/semicolon.js +113 -0
  20. package/cjs/theme/dark.d.ts +2 -0
  21. package/cjs/theme/dark.js +2 -0
  22. package/cjs/theme/light.d.ts +2 -0
  23. package/cjs/theme/light.js +2 -0
  24. package/cjs/tools.d.ts +10 -0
  25. package/cjs/tools.js +24 -0
  26. package/cjs/value.d.ts +20 -5
  27. package/cjs/value.js +67 -28
  28. package/editor.d.ts +16 -0
  29. package/esm/comps/ellipsis.d.ts +5 -0
  30. package/esm/comps/ellipsis.js +26 -0
  31. package/esm/comps/meta.d.ts +8 -0
  32. package/esm/comps/meta.js +31 -0
  33. package/esm/copied.js +5 -4
  34. package/esm/editor/icon/edit.d.ts +4 -0
  35. package/esm/editor/icon/edit.js +24 -0
  36. package/esm/editor/index.d.ts +16 -0
  37. package/esm/editor/index.js +37 -0
  38. package/esm/editor/objectKey.d.ts +11 -0
  39. package/esm/editor/objectKey.js +122 -0
  40. package/esm/editor/value.d.ts +14 -0
  41. package/esm/editor/value.js +150 -0
  42. package/esm/index.d.ts +5 -1
  43. package/esm/node.d.ts +0 -19
  44. package/esm/node.js +49 -156
  45. package/esm/semicolon.d.ts +21 -0
  46. package/esm/semicolon.js +104 -0
  47. package/esm/theme/dark.d.ts +2 -0
  48. package/esm/theme/dark.js +2 -0
  49. package/esm/theme/light.d.ts +2 -0
  50. package/esm/theme/light.js +2 -0
  51. package/esm/tools.d.ts +10 -0
  52. package/esm/tools.js +20 -0
  53. package/esm/value.d.ts +20 -5
  54. package/esm/value.js +67 -28
  55. package/package.json +7 -1
package/README.md CHANGED
@@ -112,6 +112,7 @@ const customTheme = {
112
112
  '--w-rjv-background-color': '#1e1e1e',
113
113
  '--w-rjv-line-color': '#323232',
114
114
  '--w-rjv-arrow-color': 'var(--w-rjv-color)',
115
+ '--w-rjv-edit-color': 'var(--w-rjv-color)',
115
116
  '--w-rjv-info-color': '#656565',
116
117
  '--w-rjv-update-color': '#ebcb8b',
117
118
  '--w-rjv-copied-color': '#9cdcfe',
@@ -126,6 +127,7 @@ const customTheme = {
126
127
  '--w-rjv-type-bigint-color': '#268bd2',
127
128
  '--w-rjv-type-boolean-color': '#559bd4',
128
129
  '--w-rjv-type-date-color': '#586e75',
130
+ '--w-rjv-type-url-color': '#649bd8',
129
131
  '--w-rjv-type-null-color': '#d33682',
130
132
  '--w-rjv-type-nan-color': '#859900',
131
133
  '--w-rjv-type-undefined-color': '#586e75',
@@ -143,9 +145,9 @@ export default function Demo() {
143
145
  Online custom style example, please check in the [documentation website](https://uiwjs.github.io/react-json-view/)
144
146
 
145
147
  ```tsx mdx:preview:&title=Online Editing Theme
146
- import React, { useState, useEffect, useRef } from 'react';
148
+ import React, { useState, useEffect } from 'react';
147
149
  import Colorful from '@uiw/react-color-colorful';
148
- import JsonView from '@uiw/react-json-view';
150
+ import JsonView from '@uiw/react-json-view/editor';
149
151
 
150
152
  const object = {
151
153
  avatar: 'https://i.imgur.com/MK3eW3As.jpg',
@@ -156,6 +158,7 @@ const object = {
156
158
  null: null,
157
159
  undefined,
158
160
  timer: 0,
161
+ url: new URL('https://example.com'),
159
162
  date: new Date('Tue Sep 13 2022 14:07:44 GMT-0500 (Central Daylight Time)'),
160
163
  array: [19, 100.86, 'test', NaN, Infinity],
161
164
  nestedArray: [
@@ -174,6 +177,7 @@ const customTheme = {
174
177
  '--w-rjv-background-color': '#1e1e1e',
175
178
  '--w-rjv-line-color': '#323232',
176
179
  '--w-rjv-arrow-color': '#9cdcfe',
180
+ '--w-rjv-edit-color': '#9cdcfe',
177
181
  '--w-rjv-info-color': '#656565',
178
182
  '--w-rjv-update-color': '#ebcb8b',
179
183
  '--w-rjv-copied-color': '#0184a6',
@@ -188,6 +192,7 @@ const customTheme = {
188
192
  '--w-rjv-type-bigint-color': '#268bd2',
189
193
  '--w-rjv-type-boolean-color': '#559bd4',
190
194
  '--w-rjv-type-date-color': '#586e75',
195
+ '--w-rjv-type-url-color': '#0969da',
191
196
  '--w-rjv-type-null-color': '#d33682',
192
197
  '--w-rjv-type-nan-color': '#859900',
193
198
  '--w-rjv-type-undefined-color': '#586e75',
@@ -196,6 +201,7 @@ const customTheme = {
196
201
  export default function Demo() {
197
202
  const [cssvar, setCssvar] = useState('--w-rjv-background-color');
198
203
  const [hex, setHex] = useState("#1e1e1e");
204
+ const [editable, setEditable] = useState(false);
199
205
  const [theme, setTheme] = useState(customTheme);
200
206
  const onChange = ({ hexa }) => {
201
207
  setHex(hexa);
@@ -214,13 +220,17 @@ export default function Demo() {
214
220
  return () => clearInterval(id)
215
221
  }, []);
216
222
 
223
+ const changeEditable = (evn) => setEditable(evn.target.checked);
217
224
  return (
218
225
  <React.Fragment>
219
- <div style={{ display: 'flex', gap: '1rem' }}>
220
- <JsonView value={src} keyName="root" style={{ flex: 1, ...theme }} />
226
+ <label>
227
+ <input type="checkbox" checked={editable} onChange={changeEditable} /> Editable
228
+ </label>
229
+ <div style={{ display: 'flex', gap: '1rem', alignItems: 'flex-start' }}>
230
+ <JsonView editable={editable} value={src} keyName="root" style={{ flex: 1, overflow: 'auto', ...theme }} />
221
231
  <div>
222
232
  <Colorful color={hex} onChange={onChange} />
223
- <div style={{ display: 'flex', gap: '0.4rem', flexWrap: 'wrap' }}>
233
+ <div style={{ display: 'flex', gap: '0.4rem', flexDirection: 'column' }}>
224
234
  {Object.keys(customTheme).map((varname, idx) => {
225
235
  const click = () => {
226
236
  setCssvar(varname);
@@ -240,6 +250,7 @@ export default function Demo() {
240
250
  )
241
251
  }
242
252
  ```
253
+
243
254
  ## Render
244
255
 
245
256
  ```tsx mdx:preview
@@ -269,13 +280,13 @@ export default function Demo() {
269
280
  '--w-rjv-border-left-width': '0',
270
281
  }}
271
282
  components={{
272
- braces: () => <span />,
273
- ellipsis: () => <React.Fragment />,
274
- objectKey: ({ value, ...props}) => {
275
- if (props.children === '"integer"' && value > 40) {
283
+ braces: () => <span />,
284
+ ellipsis: () => <React.Fragment />,
285
+ objectKey: ({ value, keyName, parentName, ...props}) => {
286
+ if (keyName === 'integer' && typeof value === 'number' && value > 40) {
276
287
  return <del {...props} />
277
288
  }
278
- return <span {...props} />
289
+ return <span {...props} />
279
290
  }
280
291
  }}
281
292
  />
@@ -295,7 +306,7 @@ const object = {
295
306
  integer: 42,
296
307
  }
297
308
 
298
- function value({ type, children, ...props }) {
309
+ function value({ type, children, keyName, visible, ...props }) {
299
310
  if (type === 'string' && /\.(jpg)$/.test(children)) {
300
311
  return (
301
312
  <span {...props}>
@@ -322,13 +333,117 @@ export default function Demo() {
322
333
  }
323
334
  ```
324
335
 
336
+ **Support for the URL(opens in a new tab) API.**
337
+
338
+ ```tsx mdx:preview
339
+ import React from 'react';
340
+ import JsonView from '@uiw/react-json-view';
341
+
342
+ export default function Demo() {
343
+ return (
344
+ <JsonView
345
+ value={{
346
+ url: new URL('https://example.com?t=12'),
347
+ urlStr: "https://example.com",
348
+ github: "https://example.com",
349
+ }}
350
+ style={{
351
+ '--w-rjv-background-color': '#ffffff',
352
+ }}
353
+ />
354
+ )
355
+ }
356
+ ```
357
+
358
+ ```tsx mdx:preview
359
+ import React from 'react';
360
+ import JsonView from '@uiw/react-json-view';
361
+
362
+ function value({ type, children, visible, keyName, value, ...props }) {
363
+ if (value instanceof URL) {
364
+ return (
365
+ <span {...props}>
366
+ <a href={value.href} target="_blank" rel="noopener noreferrer">
367
+ {children}
368
+ </a>
369
+ &nbsp;Open URL
370
+ {visible && <del>Button</del>}
371
+ </span>
372
+ );
373
+ }
374
+ }
375
+
376
+ export default function Demo() {
377
+ return (
378
+ <JsonView
379
+ value={{
380
+ url: new URL('https://example.com?t=12'),
381
+ urlStr: "https://example.com",
382
+ github: "https://example.com",
383
+ }}
384
+ components={{ value }}
385
+ style={{
386
+ '--w-rjv-background-color': '#ffffff',
387
+ }}
388
+ />
389
+ )
390
+ }
391
+ ```
392
+
393
+ ## Editor JSON
394
+
395
+ ```tsx mdx:preview
396
+ import React from 'react';
397
+ import JsonViewEditor from '@uiw/react-json-view/editor';
398
+
399
+ const object = {
400
+ string: 'Lorem ipsum dolor sit amet',
401
+ integer: 42,
402
+ float: 114.514,
403
+ object: {
404
+ 'first-child': true,
405
+ 'second-child': false,
406
+ 'last-child': null,
407
+ 'child': {
408
+ 'first': true,
409
+ 'second': false,
410
+ 'last': null,
411
+ },
412
+ },
413
+ nestedArray: [ [1, 2], [3, 4], { a: 1} ],
414
+ }
415
+
416
+ const ObjectKey = ({ value, keyName, parentName, ...reset }) => {
417
+ if (keyName === 'integer' && typeof value === 'number' && value > 40) {
418
+ return <del {...reset} />
419
+ }
420
+ return <span {...reset} />
421
+ };
422
+
423
+ export default function Demo() {
424
+ return (
425
+ <JsonViewEditor
426
+ value={object}
427
+ keyName="root"
428
+ style={{
429
+ '--w-rjv-background-color': '#ffffff',
430
+ }}
431
+ onEdit={(opts) => {
432
+ console.log('opts:', opts)
433
+ }}
434
+ components={{
435
+ objectKey: ObjectKey
436
+ }}
437
+ />
438
+ );
439
+ }
440
+ ```
441
+
325
442
  ## Highlight Updates
326
443
 
327
444
  ```tsx mdx:preview
328
445
  import React, { useState, useEffect } from 'react';
329
446
  import JsonView from '@uiw/react-json-view';
330
- import { TriangleArrow } from '@uiw/react-json-view/triangle-arrow';
331
- import { TriangleSolidArrow } from '@uiw/react-json-view/triangle-solid-arrow';
332
447
 
333
448
  const object = {
334
449
  string: 'Lorem ipsum dolor sit amet',
@@ -469,6 +584,8 @@ export default function Demo() {
469
584
 
470
585
  ## Props
471
586
 
587
+ ### JsonView Props
588
+
472
589
  ```ts
473
590
  import React from 'react';
474
591
  import { MetaProps, SemicolonProps, EllipsisProps, ValueViewProps } from '@uiw/react-json-view';
@@ -487,6 +604,8 @@ export interface JsonViewProps<T> extends React.DetailedHTMLProps<React.HTMLAttr
487
604
  enableClipboard?: boolean;
488
605
  /** Whether to highlight updates. @default true */
489
606
  highlightUpdates?: boolean;
607
+ /** Whether sort keys through `String.prototype.localeCompare()` @default false */
608
+ objectSortKeys?: boolean | ((a: string, b: string) => number);
490
609
  /** Display for quotes in object-key @default " */
491
610
  quotes?: "'" | '"' | '';
492
611
  /** When set to true, all nodes will be collapsed by default. Use an integer value to collapse at a particular depth. @default false */
@@ -498,6 +617,8 @@ export interface JsonViewProps<T> extends React.DetailedHTMLProps<React.HTMLAttr
498
617
  keyid: string;
499
618
  keyName?: string | number;
500
619
  }) => void;
620
+ /** Fires event when you copy */
621
+ onCopied?: CopiedProps<T>['onCopied'];
501
622
  /** Redefine interface elements to re-render. */
502
623
  components?: {
503
624
  braces?: MetaProps['render'];
@@ -505,12 +626,33 @@ export interface JsonViewProps<T> extends React.DetailedHTMLProps<React.HTMLAttr
505
626
  arrow?: JSX.Element;
506
627
  objectKey?: SemicolonProps['render'];
507
628
  value?: ValueViewProps<T>['renderValue'];
629
+ copied?: CopiedProps<T>['render'];
508
630
  };
509
631
  }
510
632
  declare const JsonView: React.ForwardRefExoticComponent<Omit<JsonViewProps<object>, "ref"> & React.RefAttributes<HTMLDivElement>>;
511
633
  export default JsonView;
512
634
  ```
513
635
 
636
+ ### JsonView Editor Props
637
+
638
+ ```ts
639
+ import { JsonViewProps } from '@uiw/react-json-view';
640
+ export interface JsonViewEditorProps<T extends object> extends JsonViewProps<T> {
641
+ /** Callback when value edit functionality */
642
+ onEdit?: (option: {
643
+ value: unknown;
644
+ oldValue: unknown;
645
+ keyName?: string | number;
646
+ parentName?: string | number;
647
+ type?: 'value' | 'key';
648
+ }) => void;
649
+ /** Whether enable edit feature. @default true */
650
+ editable?: boolean;
651
+ }
652
+ declare const JsonViewEditor: import("react").ForwardRefExoticComponent<Omit<JsonViewEditorProps<object>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
653
+ export default JsonViewEditor;
654
+ ```
655
+
514
656
  ## Size and dependencies
515
657
 
516
658
  Here is the size benchmark (using [bundlephobia.com](https://bundlephobia.com)) against similar React libraries (found by [`npmjs.com/search`](https://www.npmjs.com/search?q=react%20json&ranking=popularity)):
@@ -0,0 +1,5 @@
1
+ import { FC, PropsWithChildren } from 'react';
2
+ export interface EllipsisProps extends React.HTMLAttributes<HTMLSpanElement> {
3
+ render?: (props: EllipsisProps) => JSX.Element;
4
+ }
5
+ export declare const Ellipsis: FC<PropsWithChildren<EllipsisProps>>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.Ellipsis = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
+ var _excluded = ["style", "render"];
12
+ var Ellipsis = function Ellipsis(_ref) {
13
+ var style = _ref.style,
14
+ render = _ref.render,
15
+ props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
16
+ var styl = (0, _objectSpread2["default"])({
17
+ cursor: 'pointer'
18
+ }, style);
19
+ var className = "w-rjv-ellipsis ".concat(props.className || '');
20
+ if (render) return render((0, _objectSpread2["default"])((0, _objectSpread2["default"])({
21
+ style: styl
22
+ }, props), {}, {
23
+ className: className
24
+ }));
25
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({
26
+ className: className,
27
+ style: styl
28
+ }, props), {}, {
29
+ children: "..."
30
+ }));
31
+ };
32
+ exports.Ellipsis = Ellipsis;
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { LabelProps } from '../value';
3
+ export interface MetaProps extends LabelProps {
4
+ isArray?: boolean;
5
+ start?: boolean;
6
+ render?: (props: Pick<MetaProps, 'start' | 'isArray' | 'className' | 'children'>) => JSX.Element;
7
+ }
8
+ export declare function Meta(props: MetaProps): JSX.Element;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.Meta = Meta;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _value = require("../value");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ var _excluded = ["isArray", "start", "className", "render"];
13
+ function Meta(props) {
14
+ var _props$isArray = props.isArray,
15
+ isArray = _props$isArray === void 0 ? false : _props$isArray,
16
+ _props$start = props.start,
17
+ start = _props$start === void 0 ? false : _props$start,
18
+ className = props.className,
19
+ render = props.render,
20
+ reset = (0, _objectWithoutProperties2["default"])(props, _excluded);
21
+ var mark = isArray ? '[]' : '{}';
22
+ var cls = "w-rjv-".concat(isArray ? 'brackets' : 'curlybraces', "-").concat(start ? 'start' : 'end', " ").concat(className || '');
23
+ var color = "var(--w-rjv-".concat(isArray ? 'brackets' : 'curlybraces', "-color, #236a7c)");
24
+ if (render) return render((0, _objectSpread2["default"])({
25
+ isArray: isArray,
26
+ className: cls,
27
+ style: {
28
+ color: color
29
+ },
30
+ children: start ? mark.charAt(0) : mark.charAt(1)
31
+ }, reset));
32
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_value.Label, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({
33
+ color: color,
34
+ className: cls
35
+ }, reset), {}, {
36
+ children: start ? mark.charAt(0) : mark.charAt(1)
37
+ }));
38
+ }
package/cjs/copied.js CHANGED
@@ -45,6 +45,7 @@ function Copied(props) {
45
45
  };
46
46
  var defalutStyle = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, style), {}, {
47
47
  cursor: 'pointer',
48
+ verticalAlign: 'middle',
48
49
  marginLeft: 5
49
50
  });
50
51
  var svgProps = (0, _objectSpread2["default"])({
@@ -58,19 +59,19 @@ function Copied(props) {
58
59
  if (render) return render((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, props), svgProps));
59
60
  if (copied) {
60
61
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({
61
- viewBox: "0 0 38 38"
62
+ viewBox: "0 0 32 36"
62
63
  }, svgProps), {}, {
63
64
  fill: "var(--w-rjv-copied-success-color, #28a745)",
64
65
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
65
- d: "M27.5,35 L2.5,35 L2.5,12.5 L27.5,12.5 L27.5,15.2249049 C29.1403264,13.8627542 29.9736597,13.1778155 30,13.1700887 C30,11.9705278 30,10.0804982 30,7.5 C30,6.1 28.9,5 27.5,5 L20,5 C20,2.2 17.8,0 15,0 C12.2,0 10,2.2 10,5 L2.5,5 C1.1,5 0,6.1 0,7.5 L0,35 C0,36.4 1.1,37.5 2.5,37.5 L27.5,37.5 C28.9,37.5 30,36.4 30,35 L30,30 L27.5,30 L27.5,35 Z M7.5,7.5 L10,7.5 C10,7.5 12.5,6.4 12.5,5 C12.5,3.6 13.6,2.5 15,2.5 C16.4,2.5 17.5,3.6 17.5,5 C17.5,6.4 18.8,7.5 20,7.5 L22.5,7.5 C22.5,7.5 25,8.6 25,10 L5,10 C5,8.5 6.1,7.5 7.5,7.5 Z M5,27.5 L10,27.5 L10,25 L5,25 L5,27.5 Z M31.5589286,15 L35.1589286,18.6 L21.0160714,33 L12.5303571,24.2571429 L16.1303571,20.6571429 L21.0160714,25.5428571 L31.5589286,15 Z M12.5,30 L12.5,32.5 L5,32.5 L5,30 L12.5,30 Z M17.5,15 L5,15 L5,17.5 L17.5,17.5 L17.5,15 Z M10,20 L5,20 L5,22.5 L10,22.5 L10,20 Z"
66
+ d: "M27.5,33 L2.5,33 L2.5,12.5 L27.5,12.5 L27.5,15.2249049 C29.1403264,13.8627542 29.9736597,13.1778155 30,13.1700887 C30,11.9705278 30,10.0804982 30,7.5 C30,6.1 28.9,5 27.5,5 L20,5 C20,2.2 17.8,0 15,0 C12.2,0 10,2.2 10,5 L2.5,5 C1.1,5 0,6.1 0,7.5 L0,33 C0,34.4 1.1,36 2.5,36 L27.5,36 C28.9,36 30,34.4 30,33 L30,26.1114493 L27.5,28.4926435 L27.5,33 Z M7.5,7.5 L10,7.5 C10,7.5 12.5,6.4 12.5,5 C12.5,3.6 13.6,2.5 15,2.5 C16.4,2.5 17.5,3.6 17.5,5 C17.5,6.4 18.8,7.5 20,7.5 L22.5,7.5 C22.5,7.5 25,8.6 25,10 L5,10 C5,8.5 6.1,7.5 7.5,7.5 Z M5,27.5 L10,27.5 L10,25 L5,25 L5,27.5 Z M28.5589286,16 L32,19.6 L21.0160714,30.5382252 L13.5303571,24.2571429 L17.1303571,20.6571429 L21.0160714,24.5428571 L28.5589286,16 Z M17.5,15 L5,15 L5,17.5 L17.5,17.5 L17.5,15 Z M10,20 L5,20 L5,22.5 L10,22.5 L10,20 Z"
66
67
  })
67
68
  }));
68
69
  }
69
70
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({
70
- viewBox: "0 0 38 38"
71
+ viewBox: "0 0 32 36"
71
72
  }, svgProps), {}, {
72
73
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
73
- d: "M27.5,35 L2.5,35 L2.5,12.5 L27.5,12.5 L27.5,20 L30,20 L30,7.5 C30,6.1 28.9,5 27.5,5 L20,5 C20,2.2 17.8,0 15,0 C12.2,0 10,2.2 10,5 L2.5,5 C1.1,5 0,6.1 0,7.5 L0,35 C0,36.4 1.1,37.5 2.5,37.5 L27.5,37.5 C28.9,37.5 30,36.4 30,35 L30,30 L27.5,30 L27.5,35 Z M7.5,7.5 L10,7.5 C10,7.5 12.5,6.4 12.5,5 C12.5,3.6 13.6,2.5 15,2.5 C16.4,2.5 17.5,3.6 17.5,5 C17.5,6.4 18.8,7.5 20,7.5 L22.5,7.5 C22.5,7.5 25,8.6 25,10 L5,10 C5,8.5 6.1,7.5 7.5,7.5 Z M5,27.5 L10,27.5 L10,25 L5,25 L5,27.5 Z M22.5,22.5 L22.5,17.5 L12.5,25 L22.5,32.5 L22.5,27.5 L35,27.5 L35,22.5 L22.5,22.5 Z M5,32.5 L12.5,32.5 L12.5,30 L5,30 L5,32.5 Z M17.5,15 L5,15 L5,17.5 L17.5,17.5 L17.5,15 Z M10,20 L5,20 L5,22.5 L10,22.5 L10,20 Z"
74
+ d: "M27.5,33 L2.5,33 L2.5,12.5 L27.5,12.5 L27.5,20 L30,20 L30,7.5 C30,6.1 28.9,5 27.5,5 L20,5 C20,2.2 17.8,0 15,0 C12.2,0 10,2.2 10,5 L2.5,5 C1.1,5 0,6.1 0,7.5 L0,33 C0,34.4 1.1,36 2.5,36 L27.5,36 C28.9,36 30,34.4 30,33 L30,29 L27.5,29 L27.5,33 Z M7.5,7.5 L10,7.5 C10,7.5 12.5,6.4 12.5,5 C12.5,3.6 13.6,2.5 15,2.5 C16.4,2.5 17.5,3.6 17.5,5 C17.5,6.4 18.8,7.5 20,7.5 L22.5,7.5 C22.5,7.5 25,8.6 25,10 L5,10 C5,8.5 6.1,7.5 7.5,7.5 Z M5,27.5 L10,27.5 L10,25 L5,25 L5,27.5 Z M22.5,21.5 L22.5,16.5 L12.5,24 L22.5,31.5 L22.5,26.5 L32,26.5 L32,21.5 L22.5,21.5 Z M17.5,15 L5,15 L5,17.5 L17.5,17.5 L17.5,15 Z M10,20 L5,20 L5,22.5 L10,22.5 L10,20 Z"
74
75
  })
75
76
  }));
76
77
  }
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ export interface EditIconProps extends React.SVGAttributes<SVGElement> {
3
+ }
4
+ export declare const EditIcon: (props: EditIconProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.EditIcon = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _jsxRuntime = require("react/jsx-runtime");
10
+ var EditIcon = function EditIcon(props) {
11
+ var style = props.style;
12
+ var defaultStyle = {
13
+ verticalAlign: 'middle',
14
+ display: 'inline-block',
15
+ cursor: 'pointer',
16
+ marginLeft: 5,
17
+ height: '1em',
18
+ width: '1em'
19
+ };
20
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({
21
+ viewBox: "0 0 26 26",
22
+ fill: "var(--w-rjv-edit-color, currentColor)"
23
+ }, props), {}, {
24
+ style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, style), defaultStyle),
25
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
26
+ d: "M18,0 L7.74666667,0 C2.89333333,0 0,2.89333333 0,7.74666667 L0,17.9066667 C0,22.7733333 2.89333333,26 7.74666667,26 L18,26 C22.8533333,26 26.0001422,22.7733333 26.0001422,17.92 L26.0001422,7.74666667 C26.0133333,2.89333333 22.8533333,0 18,0 Z M11.9333333,20.68 C11.5466667,21.0666667 10.8133333,21.44 10.28,21.52 L7,21.9866667 C6.88,22 6.76,22.0133333 6.64,22.0133333 C6.09333333,22.0133333 5.58666667,21.8266667 5.22666667,21.4666667 C4.78666667,21.0266667 4.6,20.3866667 4.70666667,19.68 L5.17333333,16.4 C5.25333333,15.8533333 5.61333333,15.1333333 6.01333333,14.7466667 L11.96,8.8 C12.1719034,9.3972484 12.4397602,9.97314063 12.76,10.52 C12.8933333,10.7466667 13.04,10.96 13.16,11.12 C13.3066667,11.3466667 13.48,11.56 13.5866667,11.68 C13.6533333,11.7733333 13.7066667,11.84 13.7333333,11.8666667 C14.0666667,12.2666667 14.4533333,12.64 14.7866667,12.92 C14.88,13.0133333 14.9333333,13.0666667 14.96,13.08 C15.16,13.24 15.36,13.4 15.5333333,13.52 C15.7466667,13.68 15.96,13.8266667 16.1866667,13.9466667 C16.4533333,14.1066667 16.7466667,14.2533333 17.04,14.4 C17.3466667,14.5333333 17.6266667,14.6533333 17.9066667,14.7466667 L11.9333333,20.68 L11.9333333,20.68 Z M20.4933333,12.12 L19.2666667,13.36 C19.1887174,13.4373865 19.0831716,13.4805643 18.9733333,13.4800055 C18.9333333,13.4800055 18.88,13.4800055 18.8533333,13.4666667 C16.1309823,12.6775025 14.0024975,10.5490177 13.2133333,7.82666667 C13.1733333,7.68 13.2133333,7.52 13.32,7.42666667 L14.56,6.18666667 C16.5866667,4.16 18.52,4.2 20.5066667,6.18666667 C21.52,7.2 22.0133333,8.17333333 22.0133333,9.18666667 C22,10.1466667 21.5066667,11.1066667 20.4933333,12.12 L20.4933333,12.12 Z"
27
+ })
28
+ }));
29
+ };
30
+ exports.EditIcon = EditIcon;
@@ -0,0 +1,16 @@
1
+ /// <reference types="react" />
2
+ import { JsonViewProps } from '../';
3
+ export interface JsonViewEditorProps<T extends object> extends JsonViewProps<T> {
4
+ /** Callback when value edit functionality */
5
+ onEdit?: (option: {
6
+ value: unknown;
7
+ oldValue: unknown;
8
+ keyName?: string | number;
9
+ parentName?: string | number;
10
+ type?: 'value' | 'key';
11
+ }) => void;
12
+ /** Whether enable edit feature. @default true */
13
+ editable?: boolean;
14
+ }
15
+ declare const JsonViewEditor: import("react").ForwardRefExoticComponent<Omit<JsonViewEditorProps<object>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
16
+ export default JsonViewEditor;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _react = require("react");
11
+ var _ = _interopRequireDefault(require("../"));
12
+ var _objectKey = require("./objectKey");
13
+ var _value = require("./value");
14
+ var _jsxRuntime = require("react/jsx-runtime");
15
+ var _excluded = ["onEdit", "components", "editable", "displayDataTypes"];
16
+ var JsonViewEditor = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
17
+ var onEdit = props.onEdit,
18
+ components = props.components,
19
+ _props$editable = props.editable,
20
+ editable = _props$editable === void 0 ? true : _props$editable,
21
+ _props$displayDataTyp = props.displayDataTypes,
22
+ displayDataTypes = _props$displayDataTyp === void 0 ? true : _props$displayDataTyp,
23
+ reset = (0, _objectWithoutProperties2["default"])(props, _excluded);
24
+ var comps = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, components), {}, {
25
+ objectKey: function objectKey(reprops) {
26
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_objectKey.ObjectKey, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reprops), {}, {
27
+ editableValue: editable,
28
+ onEdit: onEdit,
29
+ render: components === null || components === void 0 ? void 0 : components.objectKey
30
+ }));
31
+ },
32
+ value: function value(reprops) {
33
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_value.ReValue, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reprops), {}, {
34
+ editableValue: editable,
35
+ displayDataTypes: displayDataTypes,
36
+ onEdit: onEdit
37
+ }));
38
+ }
39
+ });
40
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reset), {}, {
41
+ displayDataTypes: false,
42
+ components: comps,
43
+ ref: ref
44
+ }));
45
+ });
46
+ var _default = JsonViewEditor;
47
+ exports["default"] = _default;
48
+ module.exports = exports.default;
@@ -0,0 +1,11 @@
1
+ import { FC } from 'react';
2
+ import { SemicolonProps } from '../semicolon';
3
+ import { JsonViewEditorProps } from './';
4
+ export interface ObjectKeyProps<T extends object> extends SemicolonProps {
5
+ onEdit?: JsonViewEditorProps<T>['onEdit'];
6
+ render?: (props: SemicolonProps & {
7
+ ref?: React.RefObject<HTMLElement>;
8
+ }) => React.ReactNode;
9
+ editableValue?: boolean;
10
+ }
11
+ export declare const ObjectKey: FC<ObjectKeyProps<object>>;
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ObjectKey = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
+ var _react = require("react");
12
+ var _semicolon = require("../semicolon");
13
+ var _value = require("../value");
14
+ var _jsxRuntime = require("react/jsx-runtime");
15
+ var _excluded = ["className", "value", "keyName", "parentName", "quotes", "label", "editableValue", "onEdit", "highlightUpdates", "render"];
16
+ var ObjectKey = function ObjectKey(props) {
17
+ var className = props.className,
18
+ value = props.value,
19
+ keyName = props.keyName,
20
+ parentName = props.parentName,
21
+ quotes = props.quotes,
22
+ label = props.label,
23
+ editableValue = props.editableValue,
24
+ onEdit = props.onEdit,
25
+ _props$highlightUpdat = props.highlightUpdates,
26
+ highlightUpdates = _props$highlightUpdat === void 0 ? true : _props$highlightUpdat,
27
+ render = props.render,
28
+ reset = (0, _objectWithoutProperties2["default"])(props, _excluded);
29
+ var _useState = (0, _react.useState)(false),
30
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
31
+ editable = _useState2[0],
32
+ setEditable = _useState2[1];
33
+ var _useState3 = (0, _react.useState)(label),
34
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
35
+ curentLabel = _useState4[0],
36
+ setCurentLabel = _useState4[1];
37
+ (0, _react.useEffect)(function () {
38
+ return setCurentLabel(label);
39
+ }, [label]);
40
+ var $edit = (0, _react.useRef)(null);
41
+ (0, _semicolon.useHighlight)({
42
+ value: value,
43
+ highlightUpdates: highlightUpdates,
44
+ highlightContainer: $edit
45
+ });
46
+ var click = function click(evn) {
47
+ evn.stopPropagation();
48
+ if (!editableValue) return;
49
+ if (typeof keyName !== 'string') return;
50
+ if (editable) return;
51
+ setEditable(true);
52
+ if ($edit.current) {
53
+ var _$edit$current;
54
+ $edit.current.contentEditable = 'true';
55
+ (_$edit$current = $edit.current) === null || _$edit$current === void 0 ? void 0 : _$edit$current.focus();
56
+ }
57
+ };
58
+ var blur = function blur() {
59
+ setEditable(false);
60
+ if ($edit.current) {
61
+ var _$edit$current2;
62
+ $edit.current.contentEditable = 'false';
63
+ (_$edit$current2 = $edit.current) === null || _$edit$current2 === void 0 ? void 0 : _$edit$current2.focus();
64
+ setCurentLabel($edit.current.innerText);
65
+ onEdit && onEdit({
66
+ value: $edit.current.innerText,
67
+ oldValue: curentLabel,
68
+ keyName: keyName,
69
+ parentName: parentName,
70
+ type: 'key'
71
+ });
72
+ }
73
+ };
74
+ var focus = function focus() {
75
+ if ($edit.current) {
76
+ var _$edit$current3;
77
+ $edit.current.contentEditable = 'true';
78
+ (_$edit$current3 = $edit.current) === null || _$edit$current3 === void 0 ? void 0 : _$edit$current3.focus();
79
+ }
80
+ };
81
+ var keyDown = function keyDown(evn) {
82
+ if (evn.key === 'Enter') {
83
+ evn.stopPropagation();
84
+ evn.preventDefault();
85
+ $edit.current.contentEditable = 'false';
86
+ }
87
+ };
88
+ (0, _react.useEffect)(function () {
89
+ if ($edit.current) {
90
+ $edit.current.addEventListener("paste", function (e) {
91
+ e.preventDefault();
92
+ // @ts-ignore
93
+ var text = e.clipboardData.getData("text/plain");
94
+ document.execCommand("insertHTML", false, text);
95
+ });
96
+ }
97
+ }, [$edit]);
98
+ var style = {
99
+ minWidth: 34,
100
+ minHeight: 18,
101
+ paddingInline: 3,
102
+ display: 'inline-block'
103
+ };
104
+ var content = typeof keyName === 'string' ? "".concat(quotes).concat(curentLabel).concat(quotes) : curentLabel;
105
+ var spanProps = {
106
+ onClick: click,
107
+ onFocus: focus,
108
+ onBlur: blur,
109
+ onKeyDown: keyDown,
110
+ style: editable ? style : {},
111
+ contentEditable: editable,
112
+ spellCheck: false,
113
+ autoFocus: editable,
114
+ suppressContentEditableWarning: true,
115
+ children: editable ? curentLabel : content
116
+ };
117
+ if (render) {
118
+ spanProps.value = value;
119
+ spanProps.keyName = keyName;
120
+ spanProps.parentName = parentName;
121
+ return render((0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({
122
+ className: className
123
+ }, reset), spanProps), {}, {
124
+ parentName: parentName,
125
+ label: curentLabel,
126
+ children: editable ? curentLabel : content,
127
+ ref: $edit
128
+ }));
129
+ }
130
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_value.Label, (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({
131
+ className: className
132
+ }, reset), {}, {
133
+ autoFocus: editable
134
+ }, spanProps), {}, {
135
+ ref: $edit
136
+ }));
137
+ };
138
+ exports.ObjectKey = ObjectKey;