django-admin-react 1.4.9__tar.gz → 1.4.11__tar.gz
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.
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/PKG-INFO +27 -14
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/README.md +26 -13
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/static/admin_react/.vite/manifest.json +4 -4
- django_admin_react-1.4.11/django_admin_react/static/admin_react/README.md +15 -0
- django_admin_react-1.4.9/django_admin_react/static/admin_react/assets/ColumnLayoutModal-K1jJ_DbQ.js → django_admin_react-1.4.11/django_admin_react/static/admin_react/assets/ColumnLayoutModal-Bo2HCky2.js +1 -1
- django_admin_react-1.4.9/django_admin_react/static/admin_react/assets/JsonViewer-DRN6dVGq.js → django_admin_react-1.4.11/django_admin_react/static/admin_react/assets/JsonViewer-CH3aXJXg.js +1 -1
- django_admin_react-1.4.11/django_admin_react/static/admin_react/assets/index-Bw0i616L.js +8 -0
- django_admin_react-1.4.9/django_admin_react/static/admin_react/assets/index-CN1EPHGl.css → django_admin_react-1.4.11/django_admin_react/static/admin_react/assets/index-DRQ2gAuA.css +1 -1
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/static/admin_react/index.html +2 -2
- django_admin_react-1.4.11/django_admin_react/templatetags/__init__.py +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/pyproject.toml +1 -1
- django_admin_react-1.4.9/django_admin_react/static/admin_react/assets/index-Oubzq_17.js +0 -8
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/LICENSE +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/README.md +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/__init__.py +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/apps.py +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/audit.py +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/conf.py +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/pwa.py +0 -0
- /django_admin_react-1.4.9/django_admin_react/templatetags/__init__.py → /django_admin_react-1.4.11/django_admin_react/static/admin_react/.gitkeep +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/templates/README.md +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/templates/admin/base_site.html +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/templates/admin_react/README.md +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/templates/admin_react/index.html +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/templates/admin_react/login.html +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/templates/admin_react/sw.js +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/templates/django_admin_react/_experience_toggle_strip.html +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/templatetags/experience_toggle.py +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/urls.py +0 -0
- {django_admin_react-1.4.9 → django_admin_react-1.4.11}/django_admin_react/views.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: django-admin-react
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.11
|
|
4
4
|
Summary: A drop-in React single-page admin for Django, driven entirely by ModelAdmin.
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: django,admin,react,spa,tailwind
|
|
@@ -33,6 +33,8 @@ Description-Content-Type: text/markdown
|
|
|
33
33
|
|
|
34
34
|
# django-admin-react
|
|
35
35
|
|
|
36
|
+
[](https://djangopackages.org/packages/p/django-admin-react/)
|
|
37
|
+
|
|
36
38
|
A drop-in **React single-page admin** for any Django 5+ project. Same
|
|
37
39
|
`pip install`, same `INSTALLED_APPS`, same `urls.py include()` — and
|
|
38
40
|
your `ModelAdmin` classes drive everything. No React code on your side.
|
|
@@ -455,38 +457,49 @@ class InvoiceAdmin(admin.ModelAdmin):
|
|
|
455
457
|
|
|
456
458
|
### Add custom admin actions
|
|
457
459
|
|
|
458
|
-
|
|
460
|
+
Declare actions the stock-Django way; the SPA surfaces them in both places automatically. **One `@admin.action` declaration → two surfaces:** the changelist multi-select dropdown **and** a per-object button on the detail page. No `django-object-actions`, no `change_actions = (...)` redeclaration, no parameter-name gymnastics:
|
|
459
461
|
|
|
460
462
|
```python
|
|
461
463
|
class InvoiceAdmin(admin.ModelAdmin):
|
|
462
|
-
actions = ("mark_paid",
|
|
464
|
+
actions = ("mark_paid",)
|
|
463
465
|
|
|
464
|
-
# Third parameter is `queryset` → batch shape.
|
|
465
|
-
# Renders on the changelist with multi-select.
|
|
466
466
|
@admin.action(description="Mark selected as paid")
|
|
467
467
|
def mark_paid(self, request, queryset):
|
|
468
468
|
queryset.update(status="paid", paid_at=timezone.now())
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
That single declaration shows up in the changelist's bulk-actions dropdown (operating on every selected row) **and** as a button on the detail page (operating on the single visible row, dispatched as a one-row queryset).
|
|
472
|
+
|
|
473
|
+
#### Optional: detail-only actions
|
|
474
|
+
|
|
475
|
+
If you want an action to render **only** on the detail page (not in the changelist dropdown), give its third parameter a single-object shape — name it `obj_id` / `object_id` / `pk` / `id` / `object_pk`, or annotate it `str` / `int` / a `Model` subclass. The API's signature classifier (api 1.0.6+) marks those as `target: "detail"`:
|
|
476
|
+
|
|
477
|
+
```python
|
|
478
|
+
class InvoiceAdmin(admin.ModelAdmin):
|
|
479
|
+
actions = ("mark_paid", "regenerate_pdf")
|
|
480
|
+
|
|
481
|
+
@admin.action(description="Mark selected as paid")
|
|
482
|
+
def mark_paid(self, request, queryset):
|
|
483
|
+
... # changelist + detail (batch shape)
|
|
469
484
|
|
|
470
|
-
# Third parameter named `obj_id` (or annotated `str`/`int`/Model)
|
|
471
|
-
# → detail shape. Renders as a button on the single-invoice
|
|
472
|
-
# detail page header.
|
|
473
485
|
@admin.action(description="Regenerate PDF")
|
|
474
486
|
def regenerate_pdf(self, request, obj_id: str):
|
|
475
487
|
invoice = self.model.objects.get(pk=obj_id)
|
|
476
488
|
invoice.regenerate_pdf()
|
|
477
|
-
|
|
489
|
+
# detail page only — the stock Django changelist runner
|
|
490
|
+
# expects a queryset, so this shape won't run from there.
|
|
478
491
|
```
|
|
479
492
|
|
|
480
493
|
Classifier rules (api 1.0.6+):
|
|
481
494
|
|
|
482
495
|
| Third parameter | Target | Where it renders |
|
|
483
496
|
|---|---|---|
|
|
484
|
-
| name `queryset` / `qs`, or `QuerySet` annotation | `batch` | Changelist multi-select |
|
|
485
|
-
| name `obj_id` / `object_id` / `pk` / `id` / `object_pk` | `detail` | Detail page
|
|
486
|
-
| annotation `str` / `int` / `Model` subclass | `detail` | Detail page
|
|
487
|
-
| anything else | `batch` (default, preserves stock Django) | Changelist multi-select |
|
|
497
|
+
| name `queryset` / `qs`, or `QuerySet` annotation | `batch` (default) | Changelist multi-select **and** detail page |
|
|
498
|
+
| name `obj_id` / `object_id` / `pk` / `id` / `object_pk` | `detail` | Detail page only |
|
|
499
|
+
| annotation `str` / `int` / `Model` subclass | `detail` | Detail page only |
|
|
500
|
+
| anything else | `batch` (default, preserves stock Django) | Changelist multi-select **and** detail page |
|
|
488
501
|
|
|
489
|
-
Same `@admin.action` decorator
|
|
502
|
+
Same `@admin.action` decorator regardless. Same `ModelAdmin.actions` tuple. Same audit trail. The signature picks the surface; the default surfaces on both.
|
|
490
503
|
|
|
491
504
|
### Per-row permission gating
|
|
492
505
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# django-admin-react
|
|
2
2
|
|
|
3
|
+
[](https://djangopackages.org/packages/p/django-admin-react/)
|
|
4
|
+
|
|
3
5
|
A drop-in **React single-page admin** for any Django 5+ project. Same
|
|
4
6
|
`pip install`, same `INSTALLED_APPS`, same `urls.py include()` — and
|
|
5
7
|
your `ModelAdmin` classes drive everything. No React code on your side.
|
|
@@ -422,38 +424,49 @@ class InvoiceAdmin(admin.ModelAdmin):
|
|
|
422
424
|
|
|
423
425
|
### Add custom admin actions
|
|
424
426
|
|
|
425
|
-
|
|
427
|
+
Declare actions the stock-Django way; the SPA surfaces them in both places automatically. **One `@admin.action` declaration → two surfaces:** the changelist multi-select dropdown **and** a per-object button on the detail page. No `django-object-actions`, no `change_actions = (...)` redeclaration, no parameter-name gymnastics:
|
|
426
428
|
|
|
427
429
|
```python
|
|
428
430
|
class InvoiceAdmin(admin.ModelAdmin):
|
|
429
|
-
actions = ("mark_paid",
|
|
431
|
+
actions = ("mark_paid",)
|
|
430
432
|
|
|
431
|
-
# Third parameter is `queryset` → batch shape.
|
|
432
|
-
# Renders on the changelist with multi-select.
|
|
433
433
|
@admin.action(description="Mark selected as paid")
|
|
434
434
|
def mark_paid(self, request, queryset):
|
|
435
435
|
queryset.update(status="paid", paid_at=timezone.now())
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
That single declaration shows up in the changelist's bulk-actions dropdown (operating on every selected row) **and** as a button on the detail page (operating on the single visible row, dispatched as a one-row queryset).
|
|
439
|
+
|
|
440
|
+
#### Optional: detail-only actions
|
|
441
|
+
|
|
442
|
+
If you want an action to render **only** on the detail page (not in the changelist dropdown), give its third parameter a single-object shape — name it `obj_id` / `object_id` / `pk` / `id` / `object_pk`, or annotate it `str` / `int` / a `Model` subclass. The API's signature classifier (api 1.0.6+) marks those as `target: "detail"`:
|
|
443
|
+
|
|
444
|
+
```python
|
|
445
|
+
class InvoiceAdmin(admin.ModelAdmin):
|
|
446
|
+
actions = ("mark_paid", "regenerate_pdf")
|
|
447
|
+
|
|
448
|
+
@admin.action(description="Mark selected as paid")
|
|
449
|
+
def mark_paid(self, request, queryset):
|
|
450
|
+
... # changelist + detail (batch shape)
|
|
436
451
|
|
|
437
|
-
# Third parameter named `obj_id` (or annotated `str`/`int`/Model)
|
|
438
|
-
# → detail shape. Renders as a button on the single-invoice
|
|
439
|
-
# detail page header.
|
|
440
452
|
@admin.action(description="Regenerate PDF")
|
|
441
453
|
def regenerate_pdf(self, request, obj_id: str):
|
|
442
454
|
invoice = self.model.objects.get(pk=obj_id)
|
|
443
455
|
invoice.regenerate_pdf()
|
|
444
|
-
|
|
456
|
+
# detail page only — the stock Django changelist runner
|
|
457
|
+
# expects a queryset, so this shape won't run from there.
|
|
445
458
|
```
|
|
446
459
|
|
|
447
460
|
Classifier rules (api 1.0.6+):
|
|
448
461
|
|
|
449
462
|
| Third parameter | Target | Where it renders |
|
|
450
463
|
|---|---|---|
|
|
451
|
-
| name `queryset` / `qs`, or `QuerySet` annotation | `batch` | Changelist multi-select |
|
|
452
|
-
| name `obj_id` / `object_id` / `pk` / `id` / `object_pk` | `detail` | Detail page
|
|
453
|
-
| annotation `str` / `int` / `Model` subclass | `detail` | Detail page
|
|
454
|
-
| anything else | `batch` (default, preserves stock Django) | Changelist multi-select |
|
|
464
|
+
| name `queryset` / `qs`, or `QuerySet` annotation | `batch` (default) | Changelist multi-select **and** detail page |
|
|
465
|
+
| name `obj_id` / `object_id` / `pk` / `id` / `object_pk` | `detail` | Detail page only |
|
|
466
|
+
| annotation `str` / `int` / `Model` subclass | `detail` | Detail page only |
|
|
467
|
+
| anything else | `batch` (default, preserves stock Django) | Changelist multi-select **and** detail page |
|
|
455
468
|
|
|
456
|
-
Same `@admin.action` decorator
|
|
469
|
+
Same `@admin.action` decorator regardless. Same `ModelAdmin.actions` tuple. Same audit trail. The signature picks the surface; the default surfaces on both.
|
|
457
470
|
|
|
458
471
|
### Per-row permission gating
|
|
459
472
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"../../packages/details/src/JsonViewer.tsx": {
|
|
3
|
-
"file": "assets/JsonViewer-
|
|
3
|
+
"file": "assets/JsonViewer-CH3aXJXg.js",
|
|
4
4
|
"name": "JsonViewer",
|
|
5
5
|
"src": "../../packages/details/src/JsonViewer.tsx",
|
|
6
6
|
"isDynamicEntry": true,
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
]
|
|
10
10
|
},
|
|
11
11
|
"index.html": {
|
|
12
|
-
"file": "assets/index-
|
|
12
|
+
"file": "assets/index-Bw0i616L.js",
|
|
13
13
|
"name": "index",
|
|
14
14
|
"src": "index.html",
|
|
15
15
|
"isEntry": true,
|
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
"src/ColumnLayoutModal.tsx"
|
|
19
19
|
],
|
|
20
20
|
"css": [
|
|
21
|
-
"assets/index-
|
|
21
|
+
"assets/index-DRQ2gAuA.css"
|
|
22
22
|
]
|
|
23
23
|
},
|
|
24
24
|
"src/ColumnLayoutModal.tsx": {
|
|
25
|
-
"file": "assets/ColumnLayoutModal-
|
|
25
|
+
"file": "assets/ColumnLayoutModal-Bo2HCky2.js",
|
|
26
26
|
"name": "ColumnLayoutModal",
|
|
27
27
|
"src": "src/ColumnLayoutModal.tsx",
|
|
28
28
|
"isDynamicEntry": true,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# django_admin_react/static/admin_react/
|
|
2
|
+
|
|
3
|
+
The built React bundle drops here at packaging time. Nothing checked
|
|
4
|
+
in to git except this README and `.gitkeep`.
|
|
5
|
+
|
|
6
|
+
The build step (run from `frontend/`):
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
pnpm --filter @dar/web build
|
|
10
|
+
poetry run dar-build-frontend # (script lands in PR #6)
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
copies the hashed JS, CSS, and any static assets here so the wheel
|
|
14
|
+
shipped to PyPI contains a ready-to-serve bundle. Consumers do not
|
|
15
|
+
need Node to install the package.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as tt,d as c,R as $,r as ke,j as I,M as kn,b as On,a as Jt}from"./index-
|
|
1
|
+
import{c as tt,d as c,R as $,r as ke,j as I,M as kn,b as On,a as Jt}from"./index-Bw0i616L.js";const Tn=[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]],Qt=tt("grip-vertical",Tn);const Ln=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 9.9-1",key:"1mm8w8"}]],jn=tt("lock-open",Ln);const zn=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],jt=tt("lock",zn);const $n=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Bn=tt("rotate-ccw",$n);function Pn(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return c.useMemo(()=>r=>{t.forEach(o=>o(r))},t)}const nt=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function xe(e){const t=Object.prototype.toString.call(e);return t==="[object Window]"||t==="[object global]"}function mt(e){return"nodeType"in e}function B(e){var t,n;return e?xe(e)?e:mt(e)&&(t=(n=e.ownerDocument)==null?void 0:n.defaultView)!=null?t:window:window}function yt(e){const{Document:t}=B(e);return e instanceof t}function Pe(e){return xe(e)?!1:e instanceof B(e).HTMLElement}function Zt(e){return e instanceof B(e).SVGElement}function we(e){return e?xe(e)?e.document:mt(e)?yt(e)?e:Pe(e)||Zt(e)?e.ownerDocument:document:document:document}const Z=nt?c.useLayoutEffect:c.useEffect;function xt(e){const t=c.useRef(e);return Z(()=>{t.current=e}),c.useCallback(function(){for(var n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return t.current==null?void 0:t.current(...r)},[])}function Fn(){const e=c.useRef(null),t=c.useCallback((r,o)=>{e.current=setInterval(r,o)},[]),n=c.useCallback(()=>{e.current!==null&&(clearInterval(e.current),e.current=null)},[]);return[t,n]}function je(e,t){t===void 0&&(t=[e]);const n=c.useRef(e);return Z(()=>{n.current!==e&&(n.current=e)},t),n}function Fe(e,t){const n=c.useRef();return c.useMemo(()=>{const r=e(n.current);return n.current=r,r},[...t])}function Je(e){const t=xt(e),n=c.useRef(null),r=c.useCallback(o=>{o!==n.current&&t?.(o,n.current),n.current=o},[]);return[n,r]}function ht(e){const t=c.useRef();return c.useEffect(()=>{t.current=e},[e]),t.current}let lt={};function Xe(e,t){return c.useMemo(()=>{if(t)return t;const n=lt[e]==null?0:lt[e]+1;return lt[e]=n,e+"-"+n},[e,t])}function en(e){return function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return r.reduce((i,s)=>{const a=Object.entries(s);for(const[l,u]of a){const f=i[l];f!=null&&(i[l]=f+e*u)}return i},{...t})}}const ye=en(1),ze=en(-1);function Xn(e){return"clientX"in e&&"clientY"in e}function wt(e){if(!e)return!1;const{KeyboardEvent:t}=B(e.target);return t&&e instanceof t}function Un(e){if(!e)return!1;const{TouchEvent:t}=B(e.target);return t&&e instanceof t}function gt(e){if(Un(e)){if(e.touches&&e.touches.length){const{clientX:t,clientY:n}=e.touches[0];return{x:t,y:n}}else if(e.changedTouches&&e.changedTouches.length){const{clientX:t,clientY:n}=e.changedTouches[0];return{x:t,y:n}}}return Xn(e)?{x:e.clientX,y:e.clientY}:null}const $e=Object.freeze({Translate:{toString(e){if(!e)return;const{x:t,y:n}=e;return"translate3d("+(t?Math.round(t):0)+"px, "+(n?Math.round(n):0)+"px, 0)"}},Scale:{toString(e){if(!e)return;const{scaleX:t,scaleY:n}=e;return"scaleX("+t+") scaleY("+n+")"}},Transform:{toString(e){if(e)return[$e.Translate.toString(e),$e.Scale.toString(e)].join(" ")}},Transition:{toString(e){let{property:t,duration:n,easing:r}=e;return t+" "+n+"ms "+r}}}),zt="a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]";function Yn(e){return e.matches(zt)?e:e.querySelector(zt)}const Wn={display:"none"};function Vn(e){let{id:t,value:n}=e;return $.createElement("div",{id:t,style:Wn},n)}function Hn(e){let{id:t,announcement:n,ariaLiveType:r="assertive"}=e;const o={position:"fixed",top:0,left:0,width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0 0 0 0)",clipPath:"inset(100%)",whiteSpace:"nowrap"};return $.createElement("div",{id:t,style:o,role:"status","aria-live":r,"aria-atomic":!0},n)}function Kn(){const[e,t]=c.useState("");return{announce:c.useCallback(r=>{r!=null&&t(r)},[]),announcement:e}}const tn=c.createContext(null);function _n(e){const t=c.useContext(tn);c.useEffect(()=>{if(!t)throw new Error("useDndMonitor must be used within a children of <DndContext>");return t(e)},[e,t])}function qn(){const[e]=c.useState(()=>new Set),t=c.useCallback(r=>(e.add(r),()=>e.delete(r)),[e]);return[c.useCallback(r=>{let{type:o,event:i}=r;e.forEach(s=>{var a;return(a=s[o])==null?void 0:a.call(s,i)})},[e]),t]}const Gn={draggable:`
|
|
2
2
|
To pick up a draggable item, press the space bar.
|
|
3
3
|
While dragging, use the arrow keys to move the item.
|
|
4
4
|
Press space again to drop the item in its new position, or press escape to cancel.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as d,d as l,j as e,C as h}from"./index-
|
|
1
|
+
import{c as d,d as l,j as e,C as h}from"./index-Bw0i616L.js";const p=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],g=d("chevron-right",p);const y=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],j=d("copy",y);function N({raw:t,parsed:r}){const[s,c]=l.useState(!1);async function a(){try{await navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),2e3)}catch{}}return e.jsxs("div",{className:"relative w-full overflow-x-auto rounded border border-gray-200 bg-gray-50 p-3 font-mono text-xs leading-relaxed text-gray-800 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200",children:[e.jsx("button",{type:"button",onClick:a,"aria-label":"Copy JSON",title:s?"Copied":"Copy",className:"absolute right-2 top-2 inline-flex h-6 w-6 items-center justify-center rounded border border-gray-300 bg-white text-gray-600 hover:bg-gray-100 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700",children:s?e.jsx(h,{className:"h-3.5 w-3.5 text-green-600","aria-hidden":!0}):e.jsx(j,{className:"h-3.5 w-3.5","aria-hidden":!0})}),e.jsx(o,{value:r,depth:0})]})}function o({value:t,depth:r}){return t===null?e.jsx("span",{className:"text-purple-600 dark:text-purple-400",children:"null"}):typeof t=="boolean"?e.jsx("span",{className:"text-purple-600 dark:text-purple-400",children:t?"true":"false"}):typeof t=="number"?e.jsx("span",{className:"text-blue-700",children:String(t)}):typeof t=="string"?e.jsxs("span",{className:"text-green-700 dark:text-green-400",children:['"',t,'"']}):Array.isArray(t)?e.jsx(u,{value:t,depth:r}):typeof t=="object"?e.jsx(m,{value:t,depth:r}):e.jsx("span",{className:"text-gray-500",children:String(t)})}function m({value:t,depth:r}){const s=Object.keys(t),[c,a]=l.useState(r<2);return s.length===0?e.jsx("span",{className:"text-gray-500",children:"{}"}):e.jsx(x,{open:c,onToggle:()=>a(n=>!n),collapsedLabel:`{…} ${s.length} ${s.length===1?"key":"keys"}`,openBracket:"{",closeBracket:"}",depth:r,children:s.map((n,i)=>e.jsxs("div",{className:"pl-4",children:[e.jsxs("span",{className:"text-rose-700 dark:text-rose-400",children:['"',n,'"']}),e.jsx("span",{className:"text-gray-500",children:": "}),e.jsx(o,{value:t[n],depth:r+1}),i<s.length-1?e.jsx("span",{className:"text-gray-500",children:","}):null]},n))})}function u({value:t,depth:r}){const[s,c]=l.useState(r<2);return t.length===0?e.jsx("span",{className:"text-gray-500",children:"[]"}):e.jsx(x,{open:s,onToggle:()=>c(a=>!a),collapsedLabel:`[…] ${t.length} ${t.length===1?"item":"items"}`,openBracket:"[",closeBracket:"]",depth:r,children:t.map((a,n)=>e.jsxs("div",{className:"pl-4",children:[e.jsx(o,{value:a,depth:r+1}),n<t.length-1?e.jsx("span",{className:"text-gray-500",children:","}):null]},n))})}function x({open:t,onToggle:r,collapsedLabel:s,openBracket:c,closeBracket:a,depth:n,children:i}){return e.jsxs("span",{children:[e.jsx("button",{type:"button",onClick:r,"aria-expanded":t,className:"inline-flex items-center align-baseline text-gray-500 hover:text-gray-800 dark:hover:text-gray-200",children:e.jsx(g,{className:`h-3 w-3 shrink-0 transition-transform ${t?"rotate-90":""}`,"aria-hidden":!0})}),e.jsx("span",{className:"text-gray-500",children:c}),t?e.jsxs(e.Fragment,{children:[i,e.jsx("div",{className:n===0?"":"pl-0",children:e.jsx("span",{className:"text-gray-500",children:a})})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"px-1 text-gray-500",children:s}),e.jsx("span",{className:"text-gray-500",children:a})]})]})}export{N as default};
|