django-admin-react 1.4.7__tar.gz → 1.4.9__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.7 → django_admin_react-1.4.9}/PKG-INFO +32 -17
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/README.md +30 -15
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/static/admin_react/.vite/manifest.json +3 -3
- django_admin_react-1.4.7/django_admin_react/static/admin_react/assets/ColumnLayoutModal-CG_jAaog.js → django_admin_react-1.4.9/django_admin_react/static/admin_react/assets/ColumnLayoutModal-K1jJ_DbQ.js +1 -1
- django_admin_react-1.4.7/django_admin_react/static/admin_react/assets/JsonViewer-BPsdzCiy.js → django_admin_react-1.4.9/django_admin_react/static/admin_react/assets/JsonViewer-DRN6dVGq.js +1 -1
- django_admin_react-1.4.7/django_admin_react/static/admin_react/assets/index-NKB2YVP1.js → django_admin_react-1.4.9/django_admin_react/static/admin_react/assets/index-Oubzq_17.js +3 -3
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/static/admin_react/index.html +1 -1
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/pyproject.toml +2 -2
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/LICENSE +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/README.md +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/__init__.py +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/apps.py +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/audit.py +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/conf.py +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/pwa.py +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/static/admin_react/assets/index-CN1EPHGl.css +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/templates/README.md +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/templates/admin/base_site.html +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/templates/admin_react/README.md +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/templates/admin_react/index.html +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/templates/admin_react/login.html +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/templates/admin_react/sw.js +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/templates/django_admin_react/_experience_toggle_strip.html +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/templatetags/__init__.py +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/templatetags/experience_toggle.py +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/django_admin_react/urls.py +0 -0
- {django_admin_react-1.4.7 → django_admin_react-1.4.9}/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.9
|
|
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
|
|
@@ -25,7 +25,7 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
|
|
|
25
25
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
26
|
Requires-Dist: django (>=5.0,<7.0)
|
|
27
27
|
Requires-Dist: django-admin-mcp-api (>=1.0.0,<2.0.0)
|
|
28
|
-
Requires-Dist: django-admin-rest-api (>=1.0.
|
|
28
|
+
Requires-Dist: django-admin-rest-api (>=1.0.6,<2.0.0)
|
|
29
29
|
Project-URL: Documentation, https://github.com/MartinCastroAlvarez/django-admin-react#readme
|
|
30
30
|
Project-URL: Homepage, https://github.com/MartinCastroAlvarez/django-admin-react
|
|
31
31
|
Project-URL: Repository, https://github.com/MartinCastroAlvarez/django-admin-react
|
|
@@ -455,18 +455,38 @@ class InvoiceAdmin(admin.ModelAdmin):
|
|
|
455
455
|
|
|
456
456
|
### Add custom admin actions
|
|
457
457
|
|
|
458
|
+
One `actions = (...)` declaration. The API classifies each callable by signature and the SPA renders it on the right surface — **changelist** (multi-select bulk run) or **detail page** (single-object button) — automatically:
|
|
459
|
+
|
|
458
460
|
```python
|
|
459
461
|
class InvoiceAdmin(admin.ModelAdmin):
|
|
460
|
-
actions =
|
|
462
|
+
actions = ("mark_paid", "regenerate_pdf")
|
|
461
463
|
|
|
464
|
+
# Third parameter is `queryset` → batch shape.
|
|
465
|
+
# Renders on the changelist with multi-select.
|
|
462
466
|
@admin.action(description="Mark selected as paid")
|
|
463
467
|
def mark_paid(self, request, queryset):
|
|
464
468
|
queryset.update(status="paid", paid_at=timezone.now())
|
|
469
|
+
|
|
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
|
+
@admin.action(description="Regenerate PDF")
|
|
474
|
+
def regenerate_pdf(self, request, obj_id: str):
|
|
475
|
+
invoice = self.model.objects.get(pk=obj_id)
|
|
476
|
+
invoice.regenerate_pdf()
|
|
477
|
+
self.message_user(request, f"Regenerated PDF for #{invoice.pk}.")
|
|
465
478
|
```
|
|
466
479
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
480
|
+
Classifier rules (api 1.0.6+):
|
|
481
|
+
|
|
482
|
+
| Third parameter | Target | Where it renders |
|
|
483
|
+
|---|---|---|
|
|
484
|
+
| name `queryset` / `qs`, or `QuerySet` annotation | `batch` | Changelist multi-select |
|
|
485
|
+
| name `obj_id` / `object_id` / `pk` / `id` / `object_pk` | `detail` | Detail page header |
|
|
486
|
+
| annotation `str` / `int` / `Model` subclass | `detail` | Detail page header |
|
|
487
|
+
| anything else | `batch` (default, preserves stock Django) | Changelist multi-select |
|
|
488
|
+
|
|
489
|
+
Same `@admin.action` decorator on both. Same `ModelAdmin.actions` tuple. Same audit trail. **No `django-object-actions`, no `change_actions = (...)` redeclaration** — the signature is the wire.
|
|
470
490
|
|
|
471
491
|
### Per-row permission gating
|
|
472
492
|
|
|
@@ -571,14 +591,11 @@ customisations.
|
|
|
571
591
|
|
|
572
592
|
---
|
|
573
593
|
|
|
574
|
-
## Feature status
|
|
594
|
+
## Feature status
|
|
575
595
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
per-feature *SPA* (UI) status is **not** duplicated here — it is tracked
|
|
580
|
-
live in the [frontend implementation tracker (#160)](https://github.com/MartinCastroAlvarez/django-admin-react/issues/160)
|
|
581
|
-
and the [project board](https://github.com/users/MartinCastroAlvarez/projects/3).
|
|
596
|
+
All three packages are **Production / Stable** on PyPI. The
|
|
597
|
+
`ModelAdmin`-driven REST API + the React SPA + the MCP adapter
|
|
598
|
+
all share the v1 wire contract. Per-feature live status below.
|
|
582
599
|
|
|
583
600
|
| `ModelAdmin` surface | Backend (REST API) |
|
|
584
601
|
| ------------------------------------------------------ | --------------------------------------------------------------- |
|
|
@@ -587,7 +604,7 @@ and the [project board](https://github.com/users/MartinCastroAlvarez/projects/3)
|
|
|
587
604
|
| `list_filter` (boolean / choice / FK / date / Simple) | ✅ |
|
|
588
605
|
| `date_hierarchy` | ✅ |
|
|
589
606
|
| `list_editable` + bulk PATCH | ✅ |
|
|
590
|
-
| `actions`
|
|
607
|
+
| `actions` — batch + detail (signature-classified) | ✅ |
|
|
591
608
|
| `autocomplete_fields` / `raw_id_fields` | ✅ |
|
|
592
609
|
| `ManyToManyField` read + write | ✅ |
|
|
593
610
|
| `inlines` (TabularInline / StackedInline) — read + write | ✅ |
|
|
@@ -602,9 +619,7 @@ and the [project board](https://github.com/users/MartinCastroAlvarez/projects/3)
|
|
|
602
619
|
| OpenAPI 3.1 schema at `/api/v1/schema/` | ✅ |
|
|
603
620
|
| PWA manifest + service worker (cache-purge on logout) | ✅ |
|
|
604
621
|
|
|
605
|
-
✅ = shipped
|
|
606
|
-
column is the **backend** capability only — for which surfaces the React
|
|
607
|
-
UI renders today, see the [frontend tracker (#160)](https://github.com/MartinCastroAlvarez/django-admin-react/issues/160).
|
|
622
|
+
✅ = shipped. 🟡 = not yet built (tracked).
|
|
608
623
|
|
|
609
624
|
---
|
|
610
625
|
|
|
@@ -422,18 +422,38 @@ class InvoiceAdmin(admin.ModelAdmin):
|
|
|
422
422
|
|
|
423
423
|
### Add custom admin actions
|
|
424
424
|
|
|
425
|
+
One `actions = (...)` declaration. The API classifies each callable by signature and the SPA renders it on the right surface — **changelist** (multi-select bulk run) or **detail page** (single-object button) — automatically:
|
|
426
|
+
|
|
425
427
|
```python
|
|
426
428
|
class InvoiceAdmin(admin.ModelAdmin):
|
|
427
|
-
actions =
|
|
429
|
+
actions = ("mark_paid", "regenerate_pdf")
|
|
428
430
|
|
|
431
|
+
# Third parameter is `queryset` → batch shape.
|
|
432
|
+
# Renders on the changelist with multi-select.
|
|
429
433
|
@admin.action(description="Mark selected as paid")
|
|
430
434
|
def mark_paid(self, request, queryset):
|
|
431
435
|
queryset.update(status="paid", paid_at=timezone.now())
|
|
436
|
+
|
|
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
|
+
@admin.action(description="Regenerate PDF")
|
|
441
|
+
def regenerate_pdf(self, request, obj_id: str):
|
|
442
|
+
invoice = self.model.objects.get(pk=obj_id)
|
|
443
|
+
invoice.regenerate_pdf()
|
|
444
|
+
self.message_user(request, f"Regenerated PDF for #{invoice.pk}.")
|
|
432
445
|
```
|
|
433
446
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
447
|
+
Classifier rules (api 1.0.6+):
|
|
448
|
+
|
|
449
|
+
| Third parameter | Target | Where it renders |
|
|
450
|
+
|---|---|---|
|
|
451
|
+
| name `queryset` / `qs`, or `QuerySet` annotation | `batch` | Changelist multi-select |
|
|
452
|
+
| name `obj_id` / `object_id` / `pk` / `id` / `object_pk` | `detail` | Detail page header |
|
|
453
|
+
| annotation `str` / `int` / `Model` subclass | `detail` | Detail page header |
|
|
454
|
+
| anything else | `batch` (default, preserves stock Django) | Changelist multi-select |
|
|
455
|
+
|
|
456
|
+
Same `@admin.action` decorator on both. Same `ModelAdmin.actions` tuple. Same audit trail. **No `django-object-actions`, no `change_actions = (...)` redeclaration** — the signature is the wire.
|
|
437
457
|
|
|
438
458
|
### Per-row permission gating
|
|
439
459
|
|
|
@@ -538,14 +558,11 @@ customisations.
|
|
|
538
558
|
|
|
539
559
|
---
|
|
540
560
|
|
|
541
|
-
## Feature status
|
|
561
|
+
## Feature status
|
|
542
562
|
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
per-feature *SPA* (UI) status is **not** duplicated here — it is tracked
|
|
547
|
-
live in the [frontend implementation tracker (#160)](https://github.com/MartinCastroAlvarez/django-admin-react/issues/160)
|
|
548
|
-
and the [project board](https://github.com/users/MartinCastroAlvarez/projects/3).
|
|
563
|
+
All three packages are **Production / Stable** on PyPI. The
|
|
564
|
+
`ModelAdmin`-driven REST API + the React SPA + the MCP adapter
|
|
565
|
+
all share the v1 wire contract. Per-feature live status below.
|
|
549
566
|
|
|
550
567
|
| `ModelAdmin` surface | Backend (REST API) |
|
|
551
568
|
| ------------------------------------------------------ | --------------------------------------------------------------- |
|
|
@@ -554,7 +571,7 @@ and the [project board](https://github.com/users/MartinCastroAlvarez/projects/3)
|
|
|
554
571
|
| `list_filter` (boolean / choice / FK / date / Simple) | ✅ |
|
|
555
572
|
| `date_hierarchy` | ✅ |
|
|
556
573
|
| `list_editable` + bulk PATCH | ✅ |
|
|
557
|
-
| `actions`
|
|
574
|
+
| `actions` — batch + detail (signature-classified) | ✅ |
|
|
558
575
|
| `autocomplete_fields` / `raw_id_fields` | ✅ |
|
|
559
576
|
| `ManyToManyField` read + write | ✅ |
|
|
560
577
|
| `inlines` (TabularInline / StackedInline) — read + write | ✅ |
|
|
@@ -569,9 +586,7 @@ and the [project board](https://github.com/users/MartinCastroAlvarez/projects/3)
|
|
|
569
586
|
| OpenAPI 3.1 schema at `/api/v1/schema/` | ✅ |
|
|
570
587
|
| PWA manifest + service worker (cache-purge on logout) | ✅ |
|
|
571
588
|
|
|
572
|
-
✅ = shipped
|
|
573
|
-
column is the **backend** capability only — for which surfaces the React
|
|
574
|
-
UI renders today, see the [frontend tracker (#160)](https://github.com/MartinCastroAlvarez/django-admin-react/issues/160).
|
|
589
|
+
✅ = shipped. 🟡 = not yet built (tracked).
|
|
575
590
|
|
|
576
591
|
---
|
|
577
592
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"../../packages/details/src/JsonViewer.tsx": {
|
|
3
|
-
"file": "assets/JsonViewer-
|
|
3
|
+
"file": "assets/JsonViewer-DRN6dVGq.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-Oubzq_17.js",
|
|
13
13
|
"name": "index",
|
|
14
14
|
"src": "index.html",
|
|
15
15
|
"isEntry": true,
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
]
|
|
23
23
|
},
|
|
24
24
|
"src/ColumnLayoutModal.tsx": {
|
|
25
|
-
"file": "assets/ColumnLayoutModal-
|
|
25
|
+
"file": "assets/ColumnLayoutModal-K1jJ_DbQ.js",
|
|
26
26
|
"name": "ColumnLayoutModal",
|
|
27
27
|
"src": "src/ColumnLayoutModal.tsx",
|
|
28
28
|
"isDynamicEntry": true,
|
|
@@ -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-Oubzq_17.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-Oubzq_17.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};
|