@uiw/react-json-view 2.0.0-alpha.3 → 2.0.0-alpha.30

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 (197) hide show
  1. package/README.md +217 -26
  2. package/basic.d.ts +3 -0
  3. package/cjs/Container.d.ts +2 -0
  4. package/cjs/Container.js +13 -6
  5. package/cjs/arrow/TriangleArrow.js +1 -1
  6. package/cjs/comps/Copied.d.ts +2 -4
  7. package/cjs/comps/Copied.js +50 -17
  8. package/cjs/comps/KeyValues.d.ts +2 -4
  9. package/cjs/comps/KeyValues.js +62 -27
  10. package/cjs/comps/NestedClose.d.ts +1 -0
  11. package/cjs/comps/NestedClose.js +15 -5
  12. package/cjs/comps/NestedOpen.d.ts +2 -3
  13. package/cjs/comps/NestedOpen.js +34 -14
  14. package/cjs/comps/Value.d.ts +1 -2
  15. package/cjs/comps/Value.js +4 -8
  16. package/cjs/comps/useIdCompat.d.ts +1 -0
  17. package/cjs/comps/useIdCompat.js +14 -0
  18. package/cjs/editor/KeyName.d.ts +2 -0
  19. package/cjs/editor/KeyName.js +82 -0
  20. package/cjs/editor/index.d.ts +18 -0
  21. package/cjs/editor/index.js +44 -0
  22. package/cjs/editor/store.d.ts +27 -0
  23. package/cjs/editor/store.js +23 -0
  24. package/cjs/index.d.ts +10 -3
  25. package/cjs/index.js +9 -4
  26. package/cjs/section/Copied.d.ts +1 -1
  27. package/cjs/section/Copied.js +1 -2
  28. package/cjs/section/CountInfo.d.ts +1 -2
  29. package/cjs/section/CountInfo.js +3 -5
  30. package/cjs/section/CountInfoExtra.d.ts +1 -2
  31. package/cjs/section/CountInfoExtra.js +2 -4
  32. package/cjs/section/Ellipsis.d.ts +0 -1
  33. package/cjs/section/Ellipsis.js +4 -5
  34. package/cjs/section/KeyName.d.ts +7 -6
  35. package/cjs/section/KeyName.js +8 -6
  36. package/cjs/section/Row.d.ts +13 -0
  37. package/cjs/section/Row.js +51 -0
  38. package/cjs/store/Expands.js +2 -4
  39. package/cjs/store/Section.d.ts +12 -6
  40. package/cjs/store/Section.js +6 -4
  41. package/cjs/store/ShowTools.js +2 -4
  42. package/cjs/store/Symbols.d.ts +10 -3
  43. package/cjs/store/Symbols.js +2 -4
  44. package/cjs/store/Types.d.ts +29 -25
  45. package/cjs/store/Types.js +8 -8
  46. package/cjs/store.d.ts +8 -4
  47. package/cjs/store.js +5 -10
  48. package/cjs/symbol/Arrow.d.ts +1 -1
  49. package/cjs/symbol/Arrow.js +1 -2
  50. package/cjs/symbol/BraceLeft.d.ts +1 -1
  51. package/cjs/symbol/BraceLeft.js +1 -2
  52. package/cjs/symbol/BraceRight.d.ts +1 -1
  53. package/cjs/symbol/BraceRight.js +1 -2
  54. package/cjs/symbol/BracketsLeft.d.ts +1 -1
  55. package/cjs/symbol/BracketsLeft.js +1 -2
  56. package/cjs/symbol/BracketsRight.d.ts +1 -1
  57. package/cjs/symbol/BracketsRight.js +1 -2
  58. package/cjs/symbol/Colon.d.ts +1 -1
  59. package/cjs/symbol/Colon.js +1 -2
  60. package/cjs/symbol/Quote.d.ts +1 -1
  61. package/cjs/symbol/Quote.js +1 -2
  62. package/cjs/symbol/ValueQuote.d.ts +1 -1
  63. package/cjs/symbol/ValueQuote.js +1 -2
  64. package/cjs/symbol/index.d.ts +11 -16
  65. package/cjs/symbol/index.js +75 -30
  66. package/cjs/theme/basic.d.ts +1 -2
  67. package/cjs/theme/basic.js +4 -3
  68. package/cjs/theme/dark.d.ts +1 -2
  69. package/cjs/theme/dark.js +2 -3
  70. package/cjs/theme/github.dark.d.ts +1 -2
  71. package/cjs/theme/github.dark.js +2 -3
  72. package/cjs/theme/github.light.d.ts +1 -2
  73. package/cjs/theme/github.light.js +2 -3
  74. package/cjs/theme/gruvbox.d.ts +1 -2
  75. package/cjs/theme/gruvbox.js +2 -3
  76. package/cjs/theme/light.d.ts +1 -2
  77. package/cjs/theme/light.js +2 -3
  78. package/cjs/theme/monokai.d.ts +1 -2
  79. package/cjs/theme/monokai.js +2 -3
  80. package/cjs/theme/nord.d.ts +1 -2
  81. package/cjs/theme/nord.js +2 -3
  82. package/cjs/theme/vscode.d.ts +1 -2
  83. package/cjs/theme/vscode.js +2 -3
  84. package/cjs/types/Bigint.d.ts +1 -1
  85. package/cjs/types/Bigint.js +1 -2
  86. package/cjs/types/Date.d.ts +1 -1
  87. package/cjs/types/Date.js +1 -2
  88. package/cjs/types/False.d.ts +1 -1
  89. package/cjs/types/False.js +1 -2
  90. package/cjs/types/Float.d.ts +1 -1
  91. package/cjs/types/Float.js +1 -2
  92. package/cjs/types/Int.d.ts +1 -1
  93. package/cjs/types/Int.js +1 -2
  94. package/cjs/types/Map.d.ts +1 -1
  95. package/cjs/types/Map.js +1 -2
  96. package/cjs/types/Nan.d.ts +1 -1
  97. package/cjs/types/Nan.js +1 -2
  98. package/cjs/types/Null.d.ts +1 -1
  99. package/cjs/types/Null.js +1 -2
  100. package/cjs/types/Set.d.ts +1 -1
  101. package/cjs/types/Set.js +1 -2
  102. package/cjs/types/String.d.ts +1 -1
  103. package/cjs/types/String.js +1 -2
  104. package/cjs/types/True.d.ts +1 -1
  105. package/cjs/types/True.js +1 -2
  106. package/cjs/types/Undefined.d.ts +1 -1
  107. package/cjs/types/Undefined.js +1 -2
  108. package/cjs/types/Url.d.ts +1 -1
  109. package/cjs/types/Url.js +1 -2
  110. package/cjs/types/index.d.ts +3 -1
  111. package/cjs/types/index.js +96 -124
  112. package/cjs/utils/useHighlight.d.ts +0 -1
  113. package/cjs/utils/useRender.d.ts +1 -1
  114. package/editor.d.ts +22 -20
  115. package/esm/Container.d.ts +2 -0
  116. package/esm/Container.js +15 -7
  117. package/esm/arrow/TriangleArrow.js +1 -1
  118. package/esm/comps/Copied.d.ts +2 -4
  119. package/esm/comps/Copied.js +48 -16
  120. package/esm/comps/KeyValues.d.ts +2 -4
  121. package/esm/comps/KeyValues.js +53 -21
  122. package/esm/comps/NestedClose.d.ts +1 -0
  123. package/esm/comps/NestedClose.js +13 -3
  124. package/esm/comps/NestedOpen.d.ts +2 -3
  125. package/esm/comps/NestedOpen.js +33 -14
  126. package/esm/comps/Value.d.ts +1 -2
  127. package/esm/comps/Value.js +2 -4
  128. package/esm/comps/useIdCompat.d.ts +1 -0
  129. package/esm/comps/useIdCompat.js +8 -0
  130. package/esm/editor/KeyName.d.ts +2 -0
  131. package/esm/editor/KeyName.js +77 -0
  132. package/esm/editor/index.d.ts +18 -0
  133. package/esm/editor/index.js +33 -0
  134. package/esm/editor/store.d.ts +27 -0
  135. package/esm/editor/store.js +13 -0
  136. package/esm/index.d.ts +10 -3
  137. package/esm/index.js +10 -5
  138. package/esm/section/Copied.d.ts +1 -1
  139. package/esm/section/CountInfo.d.ts +1 -2
  140. package/esm/section/CountInfo.js +1 -1
  141. package/esm/section/CountInfoExtra.d.ts +1 -2
  142. package/esm/section/Ellipsis.d.ts +0 -1
  143. package/esm/section/Ellipsis.js +1 -1
  144. package/esm/section/KeyName.d.ts +7 -6
  145. package/esm/section/KeyName.js +6 -2
  146. package/esm/section/Row.d.ts +13 -0
  147. package/esm/section/Row.js +47 -0
  148. package/esm/store/Section.d.ts +12 -6
  149. package/esm/store/Section.js +4 -0
  150. package/esm/store/Symbols.d.ts +10 -3
  151. package/esm/store/Types.d.ts +29 -25
  152. package/esm/store/Types.js +6 -4
  153. package/esm/store.d.ts +8 -4
  154. package/esm/symbol/Arrow.d.ts +1 -1
  155. package/esm/symbol/BraceLeft.d.ts +1 -1
  156. package/esm/symbol/BraceRight.d.ts +1 -1
  157. package/esm/symbol/BracketsLeft.d.ts +1 -1
  158. package/esm/symbol/BracketsRight.d.ts +1 -1
  159. package/esm/symbol/Colon.d.ts +1 -1
  160. package/esm/symbol/Quote.d.ts +1 -1
  161. package/esm/symbol/ValueQuote.d.ts +1 -1
  162. package/esm/symbol/index.d.ts +11 -16
  163. package/esm/symbol/index.js +76 -23
  164. package/esm/theme/basic.d.ts +1 -2
  165. package/esm/theme/basic.js +2 -0
  166. package/esm/theme/dark.d.ts +1 -2
  167. package/esm/theme/github.dark.d.ts +1 -2
  168. package/esm/theme/github.light.d.ts +1 -2
  169. package/esm/theme/gruvbox.d.ts +1 -2
  170. package/esm/theme/light.d.ts +1 -2
  171. package/esm/theme/monokai.d.ts +1 -2
  172. package/esm/theme/nord.d.ts +1 -2
  173. package/esm/theme/vscode.d.ts +1 -2
  174. package/esm/types/Bigint.d.ts +1 -1
  175. package/esm/types/Date.d.ts +1 -1
  176. package/esm/types/False.d.ts +1 -1
  177. package/esm/types/Float.d.ts +1 -1
  178. package/esm/types/Int.d.ts +1 -1
  179. package/esm/types/Map.d.ts +1 -1
  180. package/esm/types/Nan.d.ts +1 -1
  181. package/esm/types/Null.d.ts +1 -1
  182. package/esm/types/Set.d.ts +1 -1
  183. package/esm/types/String.d.ts +1 -1
  184. package/esm/types/True.d.ts +1 -1
  185. package/esm/types/Undefined.d.ts +1 -1
  186. package/esm/types/Url.d.ts +1 -1
  187. package/esm/types/index.d.ts +3 -1
  188. package/esm/types/index.js +82 -100
  189. package/esm/utils/useHighlight.d.ts +0 -1
  190. package/esm/utils/useRender.d.ts +1 -1
  191. package/githubDark.d.ts +3 -0
  192. package/githubLight.d.ts +3 -0
  193. package/gruvbox.d.ts +3 -0
  194. package/monokai.d.ts +3 -0
  195. package/nord.d.ts +3 -0
  196. package/package.json +11 -5
  197. package/vscode.d.ts +3 -0
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  react-json-view
2
2
  ===
3
3
 
4
+ [![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-048754?logo=buymeacoffee)](https://jaywcjlove.github.io/#/sponsor)
4
5
  [![CI](https://github.com/uiwjs/react-json-view/actions/workflows/ci.yml/badge.svg)](https://github.com/uiwjs/react-json-view/actions/workflows/ci.yml)
5
6
  [![npm version](https://img.shields.io/npm/v/@uiw/react-json-view.svg)](https://www.npmjs.com/package/@uiw/react-json-view)
6
7
  [![NPM Downloads](https://img.shields.io/npm/dm/@uiw/react-json-view.svg?style=flat&label=)](https://www.npmjs.com/package/@uiw/react-json-view)
@@ -126,7 +127,6 @@ export default function Demo() {
126
127
  }
127
128
  ```
128
129
 
129
-
130
130
  Example of custom `vscode` theme styles:
131
131
 
132
132
  ```tsx mdx:preview
@@ -146,6 +146,7 @@ const object = {
146
146
  const customTheme = {
147
147
  '--w-rjv-font-family': 'monospace',
148
148
  '--w-rjv-color': '#9cdcfe',
149
+ '--w-rjv-key-number': '#268bd2',
149
150
  '--w-rjv-key-string': '#9cdcfe',
150
151
  '--w-rjv-background-color': '#1e1e1e',
151
152
  '--w-rjv-line-color': '#36334280',
@@ -159,6 +160,7 @@ const customTheme = {
159
160
  '--w-rjv-curlybraces-color': '#d4d4d4',
160
161
  '--w-rjv-colon-color': '#d4d4d4',
161
162
  '--w-rjv-brackets-color': '#d4d4d4',
163
+ '--w-rjv-ellipsis-color': '#cb4b16',
162
164
  '--w-rjv-quotes-color': 'var(--w-rjv-key-string)',
163
165
  '--w-rjv-quotes-string-color': 'var(--w-rjv-type-string-color)',
164
166
 
@@ -216,6 +218,7 @@ const object = {
216
218
  }
217
219
  const customTheme = {
218
220
  '--w-rjv-color': '#9cdcfe',
221
+ '--w-rjv-key-number': '#268bd2',
219
222
  '--w-rjv-key-string': '#9cdcfe',
220
223
  '--w-rjv-background-color': '#1e1e1e',
221
224
  '--w-rjv-line-color': '#36334280',
@@ -229,6 +232,7 @@ const customTheme = {
229
232
  '--w-rjv-curlybraces-color': '#d4d4d4',
230
233
  '--w-rjv-colon-color': '#d4d4d4',
231
234
  '--w-rjv-brackets-color': '#d4d4d4',
235
+ '--w-rjv-ellipsis-color': '#cb4b16',
232
236
  '--w-rjv-quotes-color': '#9cdcfe',
233
237
  '--w-rjv-quotes-string-color': '#ce9178',
234
238
 
@@ -278,21 +282,31 @@ export default function Demo() {
278
282
  />
279
283
  <div>
280
284
  <Colorful color={hex} onChange={onChange} />
281
- <div style={{ display: 'flex', gap: '0.4rem', flexDirection: 'column' }}>
285
+ <div style={{ display: 'flex', gap: '0.4rem', flexDirection: 'column', ...customTheme }}>
282
286
  {Object.keys(customTheme).map((varname, idx) => {
283
287
  const click = () => {
284
288
  setCssvar(varname);
285
289
  setHex(customTheme[varname]);
286
290
  };
287
291
  const active = cssvar === varname ? '#a8a8a8' : '';
288
- return <button key={idx} style={{ background: active, border: 0,boxShadow: 'inset 0px 0px 1px #000', textAlign: 'left' }} onClick={click}>{varname}</button>
292
+ return (
293
+ <button key={idx}
294
+ style={{ background: active, border: 0,boxShadow: 'inset 0px 0px 1px #000', display: 'flex', alignItems: 'center', gap: 5, padding: '1px 3px' }}
295
+ onClick={click}
296
+ >
297
+ <span style={{ display: 'inline-block', width: 12, height: 12, background: `var(${varname})` }}></span>
298
+ {varname}
299
+ </button>
300
+ )
289
301
  })}
290
302
  </div>
291
303
  </div>
292
304
  </div>
293
- <pre style={{ padding: 10 }}>
305
+ <div>
294
306
  Copy the theme configuration below into your project.
295
- <JsonView value={theme} displayDataTypes={false} />
307
+ </div>
308
+ <pre style={{ padding: 10 }}>
309
+ {JSON.stringify(theme, null, 2)}
296
310
  </pre>
297
311
  </React.Fragment>
298
312
  );
@@ -324,13 +338,13 @@ export default function Demo() {
324
338
  }}
325
339
  >
326
340
  <JsonView.String
327
- render={({ children, ...reset }, { type }) => {
328
- const isImg = /^https?.*\.(jpg|png)$/i.test(children)
341
+ render={({ children, ...reset }, { type, value, keyName }) => {
342
+ const isImg = /^https?.*\.(jpg|png)$/i.test(value)
329
343
  if (type === 'type' && isImg) {
330
344
  return <span />
331
345
  }
332
346
  if (type === 'value' && isImg) {
333
- return <img {...reset} height="26" src={children} />
347
+ return <img {...reset} height="26" src={value} />
334
348
  }
335
349
  }}
336
350
  />
@@ -362,7 +376,7 @@ export default function Demo() {
362
376
  }
363
377
  ```
364
378
 
365
- Supports certain partial customizations such as: `<Copied />`, `<CountInfo />`, `<CountInfoExtra />`, `<Ellipsis />`, `<KeyName />`
379
+ Supports certain partial customizations such as: `<Copied />`, `<CountInfo />`, `<CountInfoExtra />`, `<Ellipsis />`, `<KeyName />`, `<Row />`
366
380
 
367
381
  ```tsx mdx:preview
368
382
  import React, { Fragment } from 'react';
@@ -415,6 +429,59 @@ export default function Demo() {
415
429
  }
416
430
  ```
417
431
 
432
+ More in-depth customization ([#19](https://github.com/uiwjs/react-json-view/issues/19))
433
+
434
+ ```tsx mdx:preview
435
+ import React from 'react';
436
+ import JsonView from '@uiw/react-json-view';
437
+
438
+ const object = {
439
+ _id: "ObjectId('13212hakjdhajksd')",
440
+ uid: "test1",
441
+ attival_time: new Date('Tue Sep 13 2022 14:07:44 GMT-0500 (Central Daylight Time)'),
442
+ __v: 0
443
+ }
444
+
445
+ export default function Demo() {
446
+ return (
447
+ <JsonView
448
+ value={object}
449
+ // keyName="root"
450
+ displayObjectSize={false}
451
+ style={{
452
+ '--w-rjv-background-color': '#ffffff',
453
+ }}
454
+ >
455
+ <JsonView.Quote render={() => <span />}/>
456
+ <JsonView.String
457
+ render={({ children, ...reset }, { type, value, keyName }) => {
458
+ if (type === 'type') {
459
+ return <span />
460
+ }
461
+ if (type === 'value' && /ObjectId\(['"](.*?)['"]\)/.test(value)) {
462
+ return <span {...reset}>{children}</span>
463
+ }
464
+ }}
465
+ />
466
+ <JsonView.Date
467
+ render={({ children, ...reset }, { type, value, keyName }) => {
468
+ if (type === 'type') {
469
+ return <span />
470
+ }
471
+ }}
472
+ />
473
+ <JsonView.Int
474
+ render={({ children, ...reset }, { type, value, keyName }) => {
475
+ if (type === 'type') {
476
+ return <span />
477
+ }
478
+ }}
479
+ />
480
+ </JsonView>
481
+ )
482
+ }
483
+ ```
484
+
418
485
  Inspector
419
486
 
420
487
  ```tsx mdx:preview
@@ -526,6 +593,52 @@ Passing **as="tagName"** will automatically infer the type.
526
593
  />
527
594
  ```
528
595
 
596
+ Add a click event on the data row
597
+
598
+ ```tsx mdx:preview
599
+ import React from 'react';
600
+ import JsonView from '@uiw/react-json-view';
601
+
602
+ export default function Demo() {
603
+ return (
604
+ <JsonView
605
+ style={{
606
+ '--w-rjv-background-color': '#ffffff',
607
+ }}
608
+ value={{
609
+ name: 'John',
610
+ age: 30,
611
+ hobbies: ['reading', 'coding', 'swimming'],
612
+ address: {
613
+ street: '123 Main St',
614
+ city: 'New York',
615
+ country: {
616
+ name: 'Main ',
617
+ codex: '123'
618
+ }
619
+ }
620
+ }}
621
+ >
622
+ <JsonView.Row
623
+ as="div"
624
+ render={(props, { keyName, value, parentValue }) => {
625
+ return (
626
+ <div
627
+ {...props}
628
+ onClick={() => {
629
+ console.log("keyName", keyName)
630
+ console.log("value", value)
631
+ console.log("parentValue", parentValue)
632
+ }}
633
+ />
634
+ )
635
+ }}
636
+ />
637
+ </JsonView>
638
+ )
639
+ }
640
+ ```
641
+
529
642
  ## Highlight Updates
530
643
 
531
644
  ```tsx mdx:preview
@@ -568,6 +681,74 @@ export default function Demo() {
568
681
 
569
682
  This feature can be disabled with `highlightUpdates={false}`, and the default color can be changed with `--w-rjv-update-color`.
570
683
 
684
+ ## Do not display array index
685
+
686
+ ```tsx mdx:preview
687
+ import React, { Fragment } from 'react';
688
+ import JsonView from '@uiw/react-json-view';
689
+
690
+ export default function Demo() {
691
+ const value = { data: ["123", 23] }
692
+ return (
693
+ <JsonView value={value} style={{ '--w-rjv-background-color': '#ffffff' }}>
694
+ <JsonView.Colon render={(props, { parentValue, value, keyName }) => {
695
+ if (Array.isArray(parentValue) && props.children == ":") {
696
+ return <span />
697
+ }
698
+ return <span {...props} />
699
+ }}/>
700
+ <JsonView.KeyName
701
+ render={({ ...props }, { type, parentValue, value, keyName }) => {
702
+ if (Array.isArray(parentValue) && Number.isFinite( props.children)) {
703
+ return <span />
704
+ }
705
+ return <span {...props} />
706
+ }}
707
+ />
708
+ </JsonView>
709
+ )
710
+ }
711
+ ```
712
+
713
+ ## Default Collapse/Expand
714
+
715
+ ```tsx mdx:preview
716
+ import React from 'react';
717
+ import JsonView from '@uiw/react-json-view';
718
+ const object = {
719
+ string: 'Lorem ipsum dolor sit amet',
720
+ integer: 42,
721
+ float: 114.514,
722
+ object: {
723
+ 'first-child': true,
724
+ 'second-child': false,
725
+ 'last-child': null,
726
+ },
727
+ nestedArray: [
728
+ [1, 2],
729
+ [3, 4],
730
+ ],
731
+ }
732
+ export default function Demo() {
733
+ return (
734
+ <JsonView
735
+ value={object}
736
+ collapsed={2}
737
+ shouldExpandNodeInitially={(isExpanded, { value, keys, level }) => {
738
+ if (keys.length > 0 && keys[0] == "object") {
739
+ return true
740
+ }
741
+ return isExpanded
742
+ }}
743
+ style={{
744
+ '--w-rjv-background-color': '#ffffff',
745
+ }}
746
+ >
747
+ </JsonView>
748
+ )
749
+ }
750
+ ```
751
+
571
752
  ## Modify Icon Style
572
753
 
573
754
  Use built-in default icons.
@@ -687,7 +868,7 @@ export interface JsonViewProps<T extends object> extends React.DetailedHTMLProps
687
868
  /** Define the root node name. @default undefined */
688
869
  keyName?: string | number;
689
870
  /** Whether sort keys through `String.prototype.localeCompare()` @default false */
690
- objectSortKeys?: boolean | ((a: string, b: string) => number);
871
+ objectSortKeys?: boolean | ((keyA: string, keyB: string, valueA: T, valueB: T) => number);
691
872
  /** Set the indent-width for nested objects @default 15 */
692
873
  indentWidth?: number;
693
874
  /** When set to `true`, `objects` and `arrays` are labeled with size @default true */
@@ -696,15 +877,19 @@ export interface JsonViewProps<T extends object> extends React.DetailedHTMLProps
696
877
  displayDataTypes?: boolean;
697
878
  /** The user can copy objects and arrays to clipboard by clicking on the clipboard icon. @default true */
698
879
  enableClipboard?: boolean;
880
+ /** When set to true, all nodes will be collapsed by default. Use an integer value to collapse at a particular depth. @default false */
881
+ collapsed?: boolean | number;
882
+ /** Determine whether the node should be expanded on the first render, or you can use collapsed to control the level of expansion (by default, the root is expanded). */
883
+ shouldExpandNodeInitially?: (
884
+ isExpanded: boolean,
885
+ props: { value?: T; keys: (number | string)[]; level: number },
886
+ ) => boolean;
699
887
  /** Whether to highlight updates. @default true */
700
888
  highlightUpdates?: boolean;
889
+ /** Shorten long JSON strings, Set to `0` to disable this feature @default 30 */
890
+ shortenTextAfterLength?: number;
701
891
  /** Callback function for when a treeNode is expanded or collapsed */
702
- onExpand?: (props: {
703
- expand: boolean;
704
- value?: T;
705
- keyid: string;
706
- keyName?: string | number;
707
- }) => void;
892
+ onExpand?: (props: { expand: boolean; value?: T; keyid: string; keyName?: string | number }) => void;
708
893
  /** Fires event when you copy */
709
894
  onCopied?: (text: string, value?: T) => void;
710
895
  }
@@ -719,6 +904,7 @@ import { Arrow } from './symbol/Arrow';
719
904
  import { Colon } from './symbol/Colon';
720
905
  import { Quote } from './symbol/Quote';
721
906
  import { ValueQuote } from './symbol/ValueQuote';
907
+
722
908
  import { Bigint } from './types/Bigint';
723
909
  import { Date } from './types/Date';
724
910
  import { False } from './types/False';
@@ -732,13 +918,24 @@ import { StringText } from './types/String';
732
918
  import { True } from './types/True';
733
919
  import { Undefined } from './types/Undefined';
734
920
  import { Url } from './types/Url';
921
+
735
922
  import { Copied } from './section/Copied';
736
923
  import { CountInfo } from './section/CountInfo';
737
924
  import { CountInfoExtra } from './section/CountInfoExtra';
738
925
  import { Ellipsis } from './section/Ellipsis';
739
926
  import { KeyName } from './section/KeyName';
927
+ import { Row } from './section/Row';
740
928
 
741
929
  type JsonViewComponent = React.FC<React.PropsWithRef<JsonViewProps<object>>> & {
930
+ BraceLeft: typeof BraceLeft;
931
+ BraceRight: typeof BraceRight;
932
+ BracketsLeft: typeof BracketsLeft;
933
+ BracketsRight: typeof BracketsRight;
934
+ Arrow: typeof Arrow;
935
+ Colon: typeof Colon;
936
+ Quote: typeof Quote;
937
+ ValueQuote: typeof ValueQuote;
938
+
742
939
  Bigint: typeof Bigint;
743
940
  Date: typeof Date;
744
941
  False: typeof False;
@@ -752,19 +949,13 @@ type JsonViewComponent = React.FC<React.PropsWithRef<JsonViewProps<object>>> & {
752
949
  True: typeof True;
753
950
  Undefined: typeof Undefined;
754
951
  Url: typeof Url;
755
- BraceLeft: typeof BraceLeft;
756
- BraceRight: typeof BraceRight;
757
- BracketsLeft: typeof BracketsLeft;
758
- BracketsRight: typeof BracketsRight;
759
- Colon: typeof Colon;
760
- Ellipsis: typeof Ellipsis;
761
- Quote: typeof Quote;
762
- ValueQuote: typeof ValueQuote;
763
- Arrow: typeof Arrow;
952
+
764
953
  Copied: typeof Copied;
765
954
  CountInfo: typeof CountInfo;
766
955
  CountInfoExtra: typeof CountInfoExtra;
956
+ Ellipsis: typeof Ellipsis;
767
957
  KeyName: typeof KeyName;
958
+ Row: typeof Row;
768
959
  };
769
960
  declare const JsonView: JsonViewComponent;
770
961
  export default JsonView;
@@ -786,7 +977,7 @@ Here is the size benchmark (using [bundlephobia.com](https://bundlephobia.com))
786
977
  | [react-domify](https://github.com/JedWatson/react-domify) | [![](https://img.shields.io/bundlephobia/min/react-domify?color=red&label=)](https://bundlephobia.com/result?p=react-domify) [![](https://img.shields.io/bundlephobia/minzip/react-domify?color=red&label=gzip)](https://bundlephobia.com/result?p=react-domify) | [![](https://badgen.net/bundlephobia/dependency-count/react-domify?color=red&label=)](https://bundlephobia.com/result?p=react-domify) | [![GitHub last commit](https://img.shields.io/github/last-commit/JedWatson/react-domify?style=flat&label=)](https://github.com/JedWatson/react-domify/commits) | [![NPM Downloads](https://img.shields.io/npm/dm/react-domify.svg?style=flat&color=747474&label=)](https://www.npmjs.com/package/react-domify) | ❌ | [demo](https://jedwatson.github.io/react-domify/) |
787
978
  | [react18-json-view](https://github.com/YYsuni/react18-json-view) | [![](https://img.shields.io/bundlephobia/min/react18-json-view?color=red&label=)](https://bundlephobia.com/result?p=react18-json-view) [![](https://img.shields.io/bundlephobia/minzip/react18-json-view?color=red&label=gzip)](https://bundlephobia.com/result?p=react18-json-view) | [![](https://badgen.net/bundlephobia/dependency-count/react18-json-view?color=red&label=)](https://bundlephobia.com/result?p=react18-json-view) | [![GitHub last commit](https://img.shields.io/github/last-commit/YYsuni/react18-json-view?style=flat&label=)](https://github.com/YYsuni/react18-json-view/commits) | [![NPM Downloads](https://img.shields.io/npm/dm/react18-json-view.svg?style=flat&color=747474&label=)](https://www.npmjs.com/package/react18-json-view) | ❌ | [demo](https://jv.yysuni.com/) |
788
979
  | [@textea/json-viewer](https://github.com/TexteaInc/json-viewer) | [![](https://img.shields.io/bundlephobia/min/@textea/json-viewer?color=red&label=)](https://bundlephobia.com/result?p=@textea/json-viewer) [![](https://img.shields.io/bundlephobia/minzip/@textea/json-viewer?color=red&label=gzip)](https://bundlephobia.com/result?p=@textea/json-viewer) | [![](https://badgen.net/bundlephobia/dependency-count/%40textea%2Fjson-viewer?color=red&label=&t=vvv12213)](https://bundlephobia.com/result?p=@textea/json-viewer) | [![GitHub last commit](https://img.shields.io/github/last-commit/TexteaInc/json-viewer?style=flat&label=)](https://github.com/TexteaInc/json-viewer/commits) | [![NPM Downloads](https://img.shields.io/npm/dm/@textea/json-viewer.svg?style=flat&color=747474&label=)](https://www.npmjs.com/package/@textea/json-viewer) | ✅ | [demo](https://stackblitz.com/edit/textea-json-viewer-v3-b4wgxq) |
789
- | [react-editable-json-tree](https://github.com/oxyno-zeta/react-editable-json-tree) | [![](https://img.shields.io/bundlephobia/min/react-editable-json-tree?color=red&label=)](https://bundlephobia.com/result?p=react-editable-json-tree) [![](https://img.shields.io/bundlephobia/minzip/react-editable-json-tree?color=red&label=gzip)](https://bundlephobia.com/result?p=react-editable-json-tree) | [![](https://badgen.net/bundlephobia/dependency-count/%40textea%2Fjson-viewer?color=red&label=&t=vvv12213)](https://bundlephobia.com/result?p=react-editable-json-tree) | [![GitHub last commit](https://img.shields.io/github/last-commit/TexteaInc/json-viewer?style=flat&label=)](https://github.com/TexteaInc/json-viewer/commits) | [![NPM Downloads](https://img.shields.io/npm/dm/react-editable-json-tree.svg?style=flat&color=747474&label=)](https://www.npmjs.com/package/react-editable-json-tree) | ✅ | [demo](https://oxyno-zeta.github.io/react-editable-json-tree/) |
980
+ | [react-editable-json-tree](https://github.com/oxyno-zeta/react-editable-json-tree) | [![](https://img.shields.io/bundlephobia/min/react-editable-json-tree?color=red&label=)](https://bundlephobia.com/result?p=react-editable-json-tree) [![](https://img.shields.io/bundlephobia/minzip/react-editable-json-tree?color=red&label=gzip)](https://bundlephobia.com/result?p=react-editable-json-tree) | [![](https://badgen.net/bundlephobia/dependency-count/%40textea%2Fjson-viewer?color=red&label=&t=vvv12213)](https://bundlephobia.com/result?p=react-editable-json-tree) | [![GitHub last commit](https://img.shields.io/github/last-commit/oxyno-zeta/react-editable-json-tree?style=flat&label=)](https://github.com/oxyno-zeta/react-editable-json-tree/commits) | [![NPM Downloads](https://img.shields.io/npm/dm/react-editable-json-tree.svg?style=flat&color=747474&label=)](https://www.npmjs.com/package/react-editable-json-tree) | ✅ | [demo](https://oxyno-zeta.github.io/react-editable-json-tree/) |
790
981
  | [react-json-view](https://github.com/HuolalaTech/react-json-view) | [![](https://img.shields.io/bundlephobia/min/@huolala-tech/react-json-view?color=red&label=)](https://bundlephobia.com/result?p=@huolala-tech/react-json-view) [![](https://img.shields.io/bundlephobia/minzip/@huolala-tech/react-json-view?color=red&label=gzip)](https://bundlephobia.com/result?p=@huolala-tech/react-json-view) | [![](https://badgen.net/bundlephobia/dependency-count/%40textea%2Fjson-viewer?color=red&label=&t=vvv12213)](https://bundlephobia.com/result?p=@huolala-tech/react-json-view) | [![GitHub last commit](https://img.shields.io/github/last-commit/TexteaInc/json-viewer?style=flat&label=)](https://github.com/HuolalaTech/react-json-view/commits) | [![NPM Downloads](https://img.shields.io/npm/dm/@huolala-tech/react-json-view.svg?style=flat&color=747474&label=)](https://www.npmjs.com/package/@huolala-tech/react-json-view) | ❌ | [demo](https://huolalatech.github.io/react-json-view/) |
791
982
 
792
983
  ## Development
package/basic.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ declare module '@uiw/react-json-view/basic' {
2
+ export const basicTheme: import('react').CSSProperties;
3
+ }
@@ -6,5 +6,7 @@ export interface ContainerProps<T extends object> extends React.HTMLAttributes<H
6
6
  level?: number;
7
7
  value?: T;
8
8
  initialValue?: T;
9
+ /** Index of the parent `keyName` */
10
+ keys?: (string | number)[];
9
11
  }
10
12
  export declare const Container: React.ForwardRefExoticComponent<ContainerProps<object> & React.RefAttributes<HTMLDivElement>>;
package/cjs/Container.js CHANGED
@@ -13,10 +13,11 @@ var _react = _interopRequireWildcard(require("react"));
13
13
  var _NestedClose = require("./comps/NestedClose");
14
14
  var _NestedOpen = require("./comps/NestedOpen");
15
15
  var _KeyValues = require("./comps/KeyValues");
16
+ var _useIdCompat = require("./comps/useIdCompat");
16
17
  var _ShowTools = require("./store/ShowTools");
17
18
  var _jsxRuntime = require("react/jsx-runtime");
18
- var _excluded = ["className", "children", "parentValue", "keyid", "level", "value", "initialValue", "keyName"];
19
- var Container = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
19
+ var _excluded = ["className", "children", "parentValue", "keyid", "level", "value", "initialValue", "keys", "keyName"];
20
+ var Container = exports.Container = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
20
21
  var _props$className = props.className,
21
22
  className = _props$className === void 0 ? '' : _props$className,
22
23
  children = props.children,
@@ -26,10 +27,11 @@ var Container = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
26
27
  level = _props$level === void 0 ? 1 : _props$level,
27
28
  value = props.value,
28
29
  initialValue = props.initialValue,
30
+ keys = props.keys,
29
31
  keyName = props.keyName,
30
32
  elmProps = (0, _objectWithoutProperties2["default"])(props, _excluded);
31
33
  var dispatch = (0, _ShowTools.useShowToolsDispatch)();
32
- var subkeyid = (0, _react.useId)();
34
+ var subkeyid = (0, _useIdCompat.useIdCompat)();
33
35
  var defaultClassNames = [className, 'w-rjv-inner'].filter(Boolean).join(' ');
34
36
  var reset = {
35
37
  onMouseEnter: function onMouseEnter() {
@@ -47,18 +49,23 @@ var Container = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
47
49
  expandKey: subkeyid,
48
50
  value: value,
49
51
  level: level,
52
+ keys: keys,
53
+ parentValue: parentValue,
50
54
  keyName: keyName,
51
55
  initialValue: initialValue
52
56
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_KeyValues.KeyValues, {
53
57
  expandKey: subkeyid,
54
58
  value: value,
55
- level: level
59
+ level: level,
60
+ keys: keys,
61
+ parentValue: parentValue,
62
+ keyName: keyName
56
63
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NestedClose.NestedClose, {
57
64
  expandKey: subkeyid,
58
65
  value: value,
59
- level: level
66
+ level: level,
67
+ keys: keys
60
68
  })]
61
69
  }));
62
70
  });
63
- exports.Container = Container;
64
71
  Container.displayName = 'JVR.Container';
@@ -18,7 +18,7 @@ function TriangleArrow(props) {
18
18
  height: '1em',
19
19
  width: '1em',
20
20
  userSelect: 'none',
21
- display: 'flex'
21
+ display: 'inline-flex'
22
22
  }, style);
23
23
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({
24
24
  viewBox: "0 0 24 24",
@@ -1,13 +1,11 @@
1
- /// <reference types="react" />
1
+ import { type SectionElementResult } from '../store/Section';
2
2
  import { type TagType } from '../store/Types';
3
3
  export type CopiedOption<T extends object> = {
4
4
  value?: T;
5
5
  copied: boolean;
6
6
  setCopied: React.Dispatch<React.SetStateAction<boolean>>;
7
7
  };
8
- export interface CopiedProps<T extends object> extends React.SVGProps<SVGSVGElement> {
9
- value?: T;
10
- keyName: string | number;
8
+ export interface CopiedProps<T extends object> extends React.SVGProps<SVGSVGElement>, SectionElementResult<T> {
11
9
  expandKey: string;
12
10
  }
13
11
  export declare const Copied: {
@@ -10,15 +10,18 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
10
10
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
11
  var _react = require("react");
12
12
  var _store = require("../store");
13
- var _ShowTools = require("../store/ShowTools");
14
13
  var _Section = require("../store/Section");
14
+ var _ShowTools = require("../store/ShowTools");
15
+ var _types = require("../types");
15
16
  var _jsxRuntime = require("react/jsx-runtime");
16
- var _excluded = ["keyName", "value", "expandKey"],
17
+ var _excluded = ["keyName", "value", "parentValue", "expandKey", "keys"],
17
18
  _excluded2 = ["as", "render"];
18
- var Copied = function Copied(props) {
19
+ var Copied = exports.Copied = function Copied(props) {
19
20
  var keyName = props.keyName,
20
21
  value = props.value,
22
+ parentValue = props.parentValue,
21
23
  expandKey = props.expandKey,
24
+ keys = props.keys,
22
25
  other = (0, _objectWithoutProperties2["default"])(props, _excluded);
23
26
  var _useStore = (0, _store.useStore)(),
24
27
  onCopied = _useStore.onCopied,
@@ -35,18 +38,42 @@ var Copied = function Copied(props) {
35
38
  if (enableClipboard === false || !isShowTools) return null;
36
39
  var click = function click(event) {
37
40
  event.stopPropagation();
38
- var copyText = JSON.stringify(value, function (key, value) {
39
- if (typeof value === 'bigint') {
40
- return value.toString();
41
+ var copyText = '';
42
+ if (typeof value === 'number' && value === Infinity) {
43
+ copyText = 'Infinity';
44
+ } else if (typeof value === 'number' && isNaN(value)) {
45
+ copyText = 'NaN';
46
+ } else if (typeof value === 'bigint') {
47
+ copyText = (0, _types.bigIntToString)(value);
48
+ } else if (value instanceof Date) {
49
+ copyText = value.toLocaleString();
50
+ } else {
51
+ copyText = JSON.stringify(value, function (_, v) {
52
+ return typeof v === 'bigint' ? (0, _types.bigIntToString)(v) : v;
53
+ }, 2);
54
+ }
55
+ onCopied && onCopied(copyText, value);
56
+ setCopied(true);
57
+ var _clipboard = navigator.clipboard || {
58
+ writeText: function writeText(text) {
59
+ return new Promise(function (reslove, reject) {
60
+ var textarea = document.createElement('textarea');
61
+ textarea.style.position = 'absolute';
62
+ textarea.style.opacity = '0';
63
+ textarea.style.left = '-99999999px';
64
+ textarea.value = text;
65
+ document.body.appendChild(textarea);
66
+ textarea.select();
67
+ if (!document.execCommand('copy')) {
68
+ reject();
69
+ } else {
70
+ reslove();
71
+ }
72
+ textarea.remove();
73
+ });
41
74
  }
42
- return value;
43
- }, 2);
44
- if (typeof value === 'number' && value === Infinity) copyText = 'Infinity';
45
- if (typeof value === 'number' && isNaN(value)) copyText = 'NaN';
46
- if (typeof value === 'bigint') copyText = value + 'n';
47
- navigator.clipboard.writeText(copyText).then(function () {
48
- onCopied && onCopied(copyText, value);
49
- setCopied(true);
75
+ };
76
+ _clipboard.writeText(copyText).then(function () {
50
77
  var timer = setTimeout(function () {
51
78
  setCopied(false);
52
79
  clearTimeout(timer);
@@ -54,19 +81,26 @@ var Copied = function Copied(props) {
54
81
  })["catch"](function (error) {});
55
82
  };
56
83
  var svgProps = {
84
+ style: {
85
+ display: 'inline-flex'
86
+ },
57
87
  fill: copied ? 'var(--w-rjv-copied-success-color, #28a745)' : 'var(--w-rjv-copied-color, currentColor)',
58
88
  onClick: click
59
89
  };
60
90
  var as = Comp.as,
61
91
  render = Comp.render,
62
92
  reset = (0, _objectWithoutProperties2["default"])(Comp, _excluded2);
63
- var elmProps = (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reset), other), svgProps);
93
+ var elmProps = (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reset), other), svgProps), {}, {
94
+ style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reset.style), other.style), svgProps.style)
95
+ });
64
96
  var isRender = render && typeof render === 'function';
65
97
  var child = isRender && render((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, elmProps), {}, {
66
98
  'data-copied': copied
67
99
  }), {
68
100
  value: value,
69
- keyName: keyName
101
+ keyName: keyName,
102
+ keys: keys,
103
+ parentValue: parentValue
70
104
  });
71
105
  if (child) return child;
72
106
  if (copied) {
@@ -86,5 +120,4 @@ var Copied = function Copied(props) {
86
120
  })
87
121
  }));
88
122
  };
89
- exports.Copied = Copied;
90
123
  Copied.displayName = 'JVR.Copied';
@@ -1,7 +1,5 @@
1
- interface KeyValuesProps<T extends object> {
2
- keyName?: string | number;
3
- value?: T;
4
- parentValue?: T;
1
+ import { type SectionElementResult } from '../store/Section';
2
+ interface KeyValuesProps<T extends object> extends SectionElementResult<T> {
5
3
  expandKey?: string;
6
4
  level: number;
7
5
  }