@marimo-team/islands 0.25.2-dev3 → 0.25.2-dev30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ConnectedDataExplorerComponent-C2d9ysUI.js → ConnectedDataExplorerComponent-CglAbSke.js} +11 -11
- package/dist/{ErrorBoundary-C5H0YXQW.js → ErrorBoundary-Siz68Nx-.js} +8 -8
- package/dist/{abnfDiagram-VCTEODGH-AFhOQTt8.js → abnfDiagram-VCTEODGH-Bd5MYz7g.js} +3 -3
- package/dist/{any-language-editor-CycIVIeP.js → any-language-editor-dqxlUDlT.js} +3 -3
- package/dist/{architectureDiagram-5GKGNRK7-BngksAAQ.js → architectureDiagram-5GKGNRK7-12FmGgo8.js} +5 -5
- package/dist/assets/__vite-browser-external-BqAtzd2P.js +1 -0
- package/dist/assets/{worker-D7hWi02M.js → worker-Bf8dt6S-.js} +5 -5
- package/dist/{blockDiagram-I7D4REHJ-CvBmppdy.js → blockDiagram-I7D4REHJ-BeHOjyDk.js} +9 -9
- package/dist/{button-DdXAm8iz.js → button-B0Xgl-Qn.js} +12 -0
- package/dist/{c4Diagram-7LVT6UL2-EceL4_jH.js → c4Diagram-7LVT6UL2-Bao10t_O.js} +7 -7
- package/dist/{capabilities-B3ce_GNu.js → capabilities-D7Ad8-zw.js} +1 -1
- package/dist/{cells-Cv93oav_.js → cells-BUbzm9iX.js} +13 -13
- package/dist/{channel-z7HZXHwv.js → channel-BxCkvUgE.js} +1 -1
- package/dist/{chat-ui-fVyVOhYN.js → chat-ui-DJpsSmlB.js} +18 -18
- package/dist/{check-B7cIK6gb.js → check-DGZ74tV2.js} +1 -1
- package/dist/{chunk-4HAMMTFA-BPTTOOC5.js → chunk-4HAMMTFA-CH7Gpamd.js} +5 -5
- package/dist/{chunk-75Z2AOVW-C4AOleKf.js → chunk-75Z2AOVW-AI7CvgKn.js} +1 -1
- package/dist/{chunk-DU6HZSFF-1TwWR6gh.js → chunk-DU6HZSFF-BSvuTkX4.js} +1 -1
- package/dist/{chunk-F27PBJKO-DMI1PBe4.js → chunk-F27PBJKO-CLshwT9T.js} +1 -1
- package/dist/{chunk-GMAD6QVW-vStrMz2P.js → chunk-GMAD6QVW-wnHcn-lH.js} +3 -3
- package/dist/{chunk-GVQU2GXP-2HwWgs4u.js → chunk-GVQU2GXP-7O2p8hut.js} +2 -2
- package/dist/{chunk-IMKFNOWR-UOVZuZVn.js → chunk-IMKFNOWR-BlsbbLiS.js} +6 -6
- package/dist/{chunk-L3NEJ4N5-RhC7i0I2.js → chunk-L3NEJ4N5-B9_Alrxb.js} +5 -5
- package/dist/{chunk-OSK3NFVY-CZV09N-U.js → chunk-OSK3NFVY-PeQPH2fD.js} +6 -6
- package/dist/{chunk-P2QGCYS3-0TAWai9C.js → chunk-P2QGCYS3-D9twiFuU.js} +1 -1
- package/dist/{chunk-POPQ4Y6H-Cc3_56GX.js → chunk-POPQ4Y6H-BUiNs18s.js} +1 -1
- package/dist/{chunk-PWAF6VOD-lNxB9k8z.js → chunk-PWAF6VOD-D8S9NPCy.js} +1 -1
- package/dist/{chunk-SHT3W25Y-CrEPyWy1.js → chunk-SHT3W25Y-DoIB7Bub.js} +8 -8
- package/dist/{chunk-SVP7TREG-uIyyySp6.js → chunk-SVP7TREG-B0dScloT.js} +2 -2
- package/dist/{chunk-TICWLB2K-DdXM3eg6.js → chunk-TICWLB2K-C-lzn2th.js} +6 -6
- package/dist/classDiagram-ZZMXUADV-C5vpBHoS.js +30 -0
- package/dist/classDiagram-v2-VYDZK3BY-BS2Wadt0.js +30 -0
- package/dist/{code-visibility-DOh8H9K5.js → code-visibility-CP3A3ANH.js} +6 -6
- package/dist/{common-BJXaiNuk.js → common-DYbUXmkS.js} +22 -22
- package/dist/{copy-icon-CLdENY__.js → copy-icon-qmRg_VTX.js} +3 -3
- package/dist/{cynefinDiagram-5FMLGOSQ-zknaAsGy.js → cynefinDiagram-5FMLGOSQ-fxnL4mfp.js} +3 -3
- package/dist/{dagre-GXQ25YYZ-BhMOoMGJ.js → dagre-GXQ25YYZ-D5NkGE9i.js} +10 -10
- package/dist/{data-grid-overlay-editor-DVk573OG.js → data-grid-overlay-editor-BgExvd3Z.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-V5-Z-EDY.js → diagram-S7CK7UJ4-CATbk1XK.js} +4 -4
- package/dist/{diagram-UQ7AKVKN-qw8AjDal.js → diagram-UQ7AKVKN-Cjha5vrC.js} +3 -3
- package/dist/{diagram-VSXAHHWV-CR7BJygZ.js → diagram-VSXAHHWV-DPAWJ9Nw.js} +2 -2
- package/dist/{diagram-VX7I27RA-DfuqFb1E.js → diagram-VX7I27RA-BHfAjgGw.js} +5 -5
- package/dist/{diagram-Z3DM3KII-DpWwlYZB.js → diagram-Z3DM3KII-eAoDps6E.js} +3 -3
- package/dist/{dialog-CgNq6y9-.js → dialog-CILKhbsG.js} +3 -3
- package/dist/{dropdown-menu-CZy06LAq.js → dropdown-menu-BaqM0t4N.js} +7 -7
- package/dist/{ebnfDiagram-PWID7BFC-C20OnNMZ.js → ebnfDiagram-PWID7BFC-D8RYnIZC.js} +3 -3
- package/dist/{erDiagram-RLTQ6QDP-DBXLWO9v.js → erDiagram-RLTQ6QDP-BfmoNNce.js} +12 -12
- package/dist/{error-banner-B94dcDmP.js → error-banner-DzAmP0AQ.js} +2 -2
- package/dist/{error-entries-DLl0XqoW.js → error-entries-B9WBDeky.js} +2 -2
- package/dist/{feedback-button-DDiklug9.js → feedback-button-CwhEpI_T.js} +10 -10
- package/dist/flowDiagram-HODETNUW-Du_I0oTA.js +16 -0
- package/dist/{formats-Cl_67ghI.js → formats-Q9gwlLyD.js} +3 -3
- package/dist/{ganttDiagram-EL5Y4UJY-cRRaDt88.js → ganttDiagram-EL5Y4UJY-B4m_YsKa.js} +2 -2
- package/dist/{gitGraphDiagram-WWUBYQGX-Pox5k9-Y.js → gitGraphDiagram-WWUBYQGX-QRBbvWXh.js} +2 -2
- package/dist/{glide-data-editor-BGagFNmI.js → glide-data-editor-CrSi-w0o.js} +11 -11
- package/dist/{glide-utils-B3rUT5PI.js → glide-utils-CzzWU59p.js} +3 -3
- package/dist/{globals-dZEW_NZh.js → globals-BfBZlRMW.js} +3 -3
- package/dist/{html-to-image-CmkwfNkf.js → html-to-image-Btymxku9.js} +11 -11
- package/dist/{infoDiagram-27XIBGKW-ntpxMfrq.js → infoDiagram-27XIBGKW-CHsocw1z.js} +2 -2
- package/dist/{ishikawaDiagram-5VMMS53U-BllIlHE5.js → ishikawaDiagram-5VMMS53U-DZdZJdsT.js} +3 -3
- package/dist/{journeyDiagram-3NMN7TZE-EPJDPlt0.js → journeyDiagram-3NMN7TZE-BeeJdJo3.js} +2 -2
- package/dist/{kanban-definition-UXKFOSKX-GYtNMjtS.js → kanban-definition-UXKFOSKX-B1rrJRmN.js} +9 -9
- package/dist/{label-BslhXqL6.js → label-MNhNNoN6.js} +2 -2
- package/dist/{loader-DEZSzvma.js → loader-C9OUkMrj.js} +1 -1
- package/dist/main.js +177 -150
- package/dist/{mermaid-Dnzoxjt1.js → mermaid-CEceCleL.js} +54 -54
- package/dist/{mindmap-definition-YA3MSWOX-Cth76xgH.js → mindmap-definition-YA3MSWOX-C6-S9h9O.js} +11 -11
- package/dist/{number-overlay-editor-BvOlx4Sw.js → number-overlay-editor-BfFyQUmB.js} +1 -1
- package/dist/{pegDiagram-XKGWAZYB-Cu4uOXii.js → pegDiagram-XKGWAZYB-BL-R6P57.js} +3 -3
- package/dist/{pieDiagram-E7YTZNPT-Bh3eDa9s.js → pieDiagram-E7YTZNPT-DuAOxSRy.js} +3 -3
- package/dist/{process-output-CYN5E-iO.js → process-output-CTQmCUD0.js} +4 -4
- package/dist/purify.es-DMv5zIkJ.js +866 -0
- package/dist/{quadrantDiagram-AXDQQJYC--kqzFC3w.js → quadrantDiagram-AXDQQJYC-keLfFx9f.js} +1 -1
- package/dist/{railroadDiagram-O6MQD6OU-DG-M6Rnc.js → railroadDiagram-O6MQD6OU-f-sfFoX9.js} +3 -3
- package/dist/{requirementDiagram-BXWQKSXE-DCwsThh0.js → requirementDiagram-BXWQKSXE-BICupkaf.js} +11 -11
- package/dist/{reveal-component-BYSyNNYH.js → reveal-component-BJG6YrPy.js} +10 -10
- package/dist/{sankeyDiagram-P5KCCOFB-BdzhT0BM.js → sankeyDiagram-P5KCCOFB-Bh4EsJox.js} +1 -1
- package/dist/{select-C6plhmZr.js → select-BcObMjGz.js} +4 -4
- package/dist/{sequenceDiagram-WJ2MYXX4-CbXB1_PU.js → sequenceDiagram-WJ2MYXX4-DBFRnNGU.js} +4 -4
- package/dist/{spec-DQBRQSba.js → spec-BSchR9UD.js} +16 -14
- package/dist/{stateDiagram-D77RDMKH-A-Zf3Sb2.js → stateDiagram-D77RDMKH-CUP7QQW8.js} +13 -13
- package/dist/stateDiagram-v2-MP3YSRHH-B5mAItmH.js +30 -0
- package/dist/style.css +1 -1
- package/dist/{swimlanes-42K2YHIH-B_pMf0J4.js → swimlanes-42K2YHIH-BtIMdg7b.js} +10 -10
- package/dist/swimlanesDiagram-VR7AAH4N-CGnrrHpw.js +30 -0
- package/dist/{swiper-component-IOUowglM.js → swiper-component-DkV7T44B.js} +2 -2
- package/dist/{timeline-definition-24CTP7MA-DTXFjTTM.js → timeline-definition-24CTP7MA-UwihiSH2.js} +3 -3
- package/dist/{toDate-C67bxMWn.js → toDate-DWVp6uE1.js} +3 -3
- package/dist/{toast-DvY70eFX.js → toast-DcoJGS3-.js} +4 -4
- package/dist/{tooltip-qB8NlSqV.js → tooltip-Bi36DgYh.js} +2 -2
- package/dist/{use-restore-focus-D5D9xEjZ.js → use-restore-focus-ZgG5Br63.js} +1 -1
- package/dist/{useAsyncData-BD6AStMt.js → useAsyncData-BD7NLQ3_.js} +1 -1
- package/dist/{useDateFormatter-BXQGu86d.js → useDateFormatter-D8XWr8lL.js} +2 -2
- package/dist/{useDeepCompareMemoize-D_HNdyvI.js → useDeepCompareMemoize-CawMGSRU.js} +1 -1
- package/dist/{useIframeCapabilities-CVtNkI3Y.js → useIframeCapabilities-BUMBOpsM.js} +1 -1
- package/dist/{useLifecycle-DPgiiwwU.js → useLifecycle-3vGhRa1o.js} +3 -3
- package/dist/{useTheme-DzXmYZ5V.js → useTheme-BOw801nZ.js} +2 -2
- package/dist/{vega-component-tFOzgarw.js → vega-component-9siY74NS.js} +9 -9
- package/dist/{vennDiagram-4TSXK5OY-BPHjZo0R.js → vennDiagram-4TSXK5OY-D5LNVIRI.js} +3 -3
- package/dist/{wardleyDiagram-VM6X3IG4-6fTLYBuD.js → wardleyDiagram-VM6X3IG4-BwKf-b0_.js} +3 -3
- package/dist/{xychartDiagram-S5SC5T6Z-BYjwjrzE.js → xychartDiagram-S5SC5T6Z-Cg_vyuW2.js} +5 -5
- package/package.json +7 -7
- package/src/components/chat/tool-call/__tests__/tool-result.test.tsx +56 -0
- package/src/components/chat/tool-call/tool-result.tsx +3 -3
- package/src/components/data-table/charts/__tests__/schemas.test.ts +25 -0
- package/src/components/data-table/charts/__tests__/spec.test.ts +26 -23
- package/src/components/data-table/charts/constants.ts +11 -10
- package/src/components/data-table/charts/types.ts +1 -0
- package/src/components/editor/actions/__tests__/useSetOutputsExpanded.test.ts +42 -0
- package/src/components/editor/actions/useNotebookActions.tsx +20 -0
- package/src/components/editor/actions/useSetOutputsExpanded.ts +67 -0
- package/src/core/edit-app.tsx +16 -0
- package/src/core/hotkeys/hotkeys.ts +12 -0
- package/src/core/wasm/__tests__/bootstrap.test.ts +33 -1
- package/src/core/wasm/worker/bootstrap.ts +22 -3
- package/src/css/katex.min.css +145 -144
- package/src/plugins/impl/CheckboxPlugin.tsx +1 -1
- package/src/plugins/impl/DatePickerPlugin.tsx +5 -3
- package/src/plugins/impl/DateRangePlugin.tsx +5 -3
- package/src/plugins/impl/DateTimePickerPlugin.tsx +5 -3
- package/src/plugins/impl/DropdownPlugin.tsx +1 -1
- package/src/plugins/impl/FileBrowserPlugin.tsx +45 -15
- package/src/plugins/impl/MultiselectPlugin.tsx +1 -1
- package/src/plugins/impl/NumberPlugin.tsx +1 -1
- package/src/plugins/impl/RadioPlugin.tsx +5 -1
- package/src/plugins/impl/RangeSliderPlugin.tsx +1 -1
- package/src/plugins/impl/SearchableSelect.tsx +1 -1
- package/src/plugins/impl/SliderPlugin.tsx +1 -1
- package/src/plugins/impl/SwitchPlugin.tsx +6 -1
- package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +85 -2
- package/src/plugins/impl/__tests__/widget-labels.test.tsx +122 -0
- package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
- package/src/plugins/impl/common/labeled.tsx +9 -3
- package/dist/assets/__vite-browser-external-C9iR87Zl.js +0 -1
- package/dist/classDiagram-ZZMXUADV-BiATbBE4.js +0 -30
- package/dist/classDiagram-v2-VYDZK3BY-JnH97GYw.js +0 -30
- package/dist/flowDiagram-HODETNUW-DL52nMkt.js +0 -16
- package/dist/purify.es-DgKyQviY.js +0 -805
- package/dist/stateDiagram-v2-MP3YSRHH-D9YMnUGx.js +0 -30
- package/dist/swimlanesDiagram-VR7AAH4N-Ctgy-yGP.js +0 -30
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { type CalendarDate, parseDate } from "@internationalized/date";
|
|
4
|
-
import type
|
|
4
|
+
import { type JSX, useId } from "react";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { DatePicker } from "@/components/ui/date-picker";
|
|
7
7
|
import type { IPlugin, IPluginProps, Setter } from "../types";
|
|
@@ -49,6 +49,7 @@ interface DatePickerProps extends Data {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
const DatePickerComponent = (props: DatePickerProps): JSX.Element => {
|
|
52
|
+
const labelId = useId();
|
|
52
53
|
const handleInput = (valueAsDate: CalendarDate | null) => {
|
|
53
54
|
if (!valueAsDate) {
|
|
54
55
|
return;
|
|
@@ -59,12 +60,13 @@ const DatePickerComponent = (props: DatePickerProps): JSX.Element => {
|
|
|
59
60
|
};
|
|
60
61
|
|
|
61
62
|
return (
|
|
62
|
-
<Labeled label={props.label} fullWidth={props.fullWidth}>
|
|
63
|
+
<Labeled labelId={labelId} label={props.label} fullWidth={props.fullWidth}>
|
|
63
64
|
<DatePicker
|
|
64
65
|
granularity="day"
|
|
65
66
|
value={parseDate(props.value)}
|
|
66
67
|
onChange={handleInput}
|
|
67
|
-
aria-
|
|
68
|
+
aria-labelledby={props.label ? labelId : undefined}
|
|
69
|
+
aria-label={props.label ? undefined : "date picker"}
|
|
68
70
|
minValue={parseDate(props.start)}
|
|
69
71
|
maxValue={parseDate(props.stop)}
|
|
70
72
|
isDisabled={props.disabled}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { type CalendarDate, parseDate } from "@internationalized/date";
|
|
4
|
-
import type
|
|
4
|
+
import { type JSX, useId } from "react";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { DateRangePicker } from "@/components/ui/date-picker";
|
|
7
7
|
import type { IPlugin, IPluginProps, Setter } from "../types";
|
|
@@ -48,6 +48,7 @@ interface DateRangePickerProps extends Data {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
const DateRangePickerComponent = (props: DateRangePickerProps): JSX.Element => {
|
|
51
|
+
const labelId = useId();
|
|
51
52
|
const handleInput = (
|
|
52
53
|
valueAsDateRange: {
|
|
53
54
|
start: CalendarDate;
|
|
@@ -64,7 +65,7 @@ const DateRangePickerComponent = (props: DateRangePickerProps): JSX.Element => {
|
|
|
64
65
|
};
|
|
65
66
|
|
|
66
67
|
return (
|
|
67
|
-
<Labeled label={props.label} fullWidth={props.fullWidth}>
|
|
68
|
+
<Labeled labelId={labelId} label={props.label} fullWidth={props.fullWidth}>
|
|
68
69
|
<DateRangePicker
|
|
69
70
|
granularity="day"
|
|
70
71
|
value={{
|
|
@@ -72,7 +73,8 @@ const DateRangePickerComponent = (props: DateRangePickerProps): JSX.Element => {
|
|
|
72
73
|
end: parseDate(props.value[1]),
|
|
73
74
|
}}
|
|
74
75
|
onChange={handleInput}
|
|
75
|
-
aria-
|
|
76
|
+
aria-labelledby={props.label ? labelId : undefined}
|
|
77
|
+
aria-label={props.label ? undefined : "date range picker"}
|
|
76
78
|
minValue={parseDate(props.start)}
|
|
77
79
|
maxValue={parseDate(props.stop)}
|
|
78
80
|
isDisabled={props.disabled}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { type CalendarDateTime, parseDateTime } from "@internationalized/date";
|
|
4
|
-
import type
|
|
4
|
+
import { type JSX, useId } from "react";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { DatePicker } from "@/components/ui/date-picker";
|
|
7
7
|
import type { IPlugin, IPluginProps, Setter } from "../types";
|
|
@@ -50,6 +50,7 @@ interface DateTimePickerProps extends Data {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
const DateTimePickerComponent = (props: DateTimePickerProps): JSX.Element => {
|
|
53
|
+
const labelId = useId();
|
|
53
54
|
const handleInput = (valueAsDateTime: CalendarDateTime | null) => {
|
|
54
55
|
if (!valueAsDateTime) {
|
|
55
56
|
return;
|
|
@@ -63,12 +64,13 @@ const DateTimePickerComponent = (props: DateTimePickerProps): JSX.Element => {
|
|
|
63
64
|
const parsedValue = props.value ? parseDateTime(props.value) : undefined;
|
|
64
65
|
|
|
65
66
|
return (
|
|
66
|
-
<Labeled label={props.label} fullWidth={props.fullWidth}>
|
|
67
|
+
<Labeled labelId={labelId} label={props.label} fullWidth={props.fullWidth}>
|
|
67
68
|
<DatePicker
|
|
68
69
|
granularity={props.precision}
|
|
69
70
|
value={parsedValue}
|
|
70
71
|
onChange={handleInput}
|
|
71
|
-
aria-
|
|
72
|
+
aria-labelledby={props.label ? labelId : undefined}
|
|
73
|
+
aria-label={props.label ? undefined : "date time picker"}
|
|
72
74
|
minValue={parseDateTime(props.start)}
|
|
73
75
|
maxValue={parseDateTime(props.stop)}
|
|
74
76
|
isDisabled={props.disabled}
|
|
@@ -79,7 +79,7 @@ const Dropdown = (props: DropdownProps): JSX.Element => {
|
|
|
79
79
|
const singleValue = value.length === 0 ? defaultValue : value[0];
|
|
80
80
|
|
|
81
81
|
return (
|
|
82
|
-
<Labeled label={label}
|
|
82
|
+
<Labeled label={label} controlId={id} fullWidth={fullWidth}>
|
|
83
83
|
<NativeSelect
|
|
84
84
|
data-testid="marimo-plugin-dropdown"
|
|
85
85
|
onChange={(e) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import { type LucideIcon, CornerLeftUp } from "lucide-react";
|
|
3
|
+
import { type LucideIcon, ChevronRightIcon, CornerLeftUp } from "lucide-react";
|
|
4
4
|
import { type JSX, useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import {
|
|
@@ -12,7 +12,6 @@ import { Spinner } from "@/components/icons/spinner";
|
|
|
12
12
|
import { Button } from "@/components/ui/button";
|
|
13
13
|
import { Checkbox } from "@/components/ui/checkbox";
|
|
14
14
|
import { Label } from "@/components/ui/label";
|
|
15
|
-
import { NativeSelect } from "@/components/ui/native-select";
|
|
16
15
|
import { Table, TableBody, TableCell, TableRow } from "@/components/ui/table";
|
|
17
16
|
import { toast } from "@/components/ui/use-toast";
|
|
18
17
|
import { RANDOM_ID_ATTR } from "@/core/dom/ui-element-constants";
|
|
@@ -472,12 +471,19 @@ export const FileBrowser = ({
|
|
|
472
471
|
//
|
|
473
472
|
// Assumes that path contains at least one delimiter, which is true
|
|
474
473
|
// only if this is an absolute path.
|
|
475
|
-
const { parentDirectories } = getProtocolAndParentDirectories({
|
|
474
|
+
const { protocol, parentDirectories } = getProtocolAndParentDirectories({
|
|
476
475
|
path,
|
|
477
476
|
delimiter,
|
|
478
477
|
initialPath,
|
|
479
478
|
restrictNavigation,
|
|
480
479
|
});
|
|
480
|
+
const breadcrumbs = parentDirectories.toReversed().map((dir) => ({
|
|
481
|
+
path: dir,
|
|
482
|
+
name:
|
|
483
|
+
dir === protocol
|
|
484
|
+
? protocol
|
|
485
|
+
: (dir.split(delimiter).findLast(Boolean) ?? dir),
|
|
486
|
+
}));
|
|
481
487
|
|
|
482
488
|
const selectionKindLabel =
|
|
483
489
|
selectionMode === "all"
|
|
@@ -515,18 +521,42 @@ export const FileBrowser = ({
|
|
|
515
521
|
<div>
|
|
516
522
|
{error && <Banner kind="danger">{error.message}</Banner>}
|
|
517
523
|
{renderHeader()}
|
|
518
|
-
<
|
|
519
|
-
className="
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
524
|
+
<nav aria-label="Current directory" className="mt-2">
|
|
525
|
+
<ol className="flex flex-wrap items-center gap-0.5 text-sm">
|
|
526
|
+
{breadcrumbs.map((crumb, index) => {
|
|
527
|
+
const isCurrent = index === breadcrumbs.length - 1;
|
|
528
|
+
return (
|
|
529
|
+
<li key={crumb.path} className="flex items-center gap-0.5">
|
|
530
|
+
{index > 0 && (
|
|
531
|
+
<ChevronRightIcon
|
|
532
|
+
size={14}
|
|
533
|
+
className="text-muted-foreground shrink-0"
|
|
534
|
+
aria-hidden={true}
|
|
535
|
+
/>
|
|
536
|
+
)}
|
|
537
|
+
<button
|
|
538
|
+
type="button"
|
|
539
|
+
title={crumb.path}
|
|
540
|
+
aria-current={isCurrent ? "page" : undefined}
|
|
541
|
+
onClick={() => {
|
|
542
|
+
if (!isCurrent) {
|
|
543
|
+
setNewPath(crumb.path);
|
|
544
|
+
}
|
|
545
|
+
}}
|
|
546
|
+
className={cn(
|
|
547
|
+
"rounded px-1 focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring",
|
|
548
|
+
isCurrent
|
|
549
|
+
? "font-medium cursor-default"
|
|
550
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
551
|
+
)}
|
|
552
|
+
>
|
|
553
|
+
{crumb.name}
|
|
554
|
+
</button>
|
|
555
|
+
</li>
|
|
556
|
+
);
|
|
557
|
+
})}
|
|
558
|
+
</ol>
|
|
559
|
+
</nav>
|
|
530
560
|
|
|
531
561
|
{data && typeof data.total_count === "number" && (
|
|
532
562
|
<div className="text-xs text-muted-foreground mt-1 px-1">
|
|
@@ -70,7 +70,7 @@ const NumberComponent = (props: NumberComponentProps): JSX.Element => {
|
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
return (
|
|
73
|
-
<Labeled label={props.label}
|
|
73
|
+
<Labeled label={props.label} controlId={id} fullWidth={props.fullWidth}>
|
|
74
74
|
<NumberField
|
|
75
75
|
data-testid="marimo-plugin-number-input"
|
|
76
76
|
className={cn("min-w-[3em]", props.fullWidth && "w-full")}
|
|
@@ -51,7 +51,11 @@ export const Radio = (props: RadioProps): JSX.Element => {
|
|
|
51
51
|
const id = useId();
|
|
52
52
|
|
|
53
53
|
return (
|
|
54
|
-
<Labeled
|
|
54
|
+
<Labeled
|
|
55
|
+
label={props.label}
|
|
56
|
+
controlId={id}
|
|
57
|
+
align={props.inline ? "left" : "top"}
|
|
58
|
+
>
|
|
55
59
|
<RadioGroup
|
|
56
60
|
data-testid="marimo-plugin-radio"
|
|
57
61
|
value={props.value ?? ""}
|
|
@@ -33,7 +33,7 @@ export const SearchableSelect = (props: SearchableSelectProps): JSX.Element => {
|
|
|
33
33
|
);
|
|
34
34
|
|
|
35
35
|
return (
|
|
36
|
-
<Labeled label={label}
|
|
36
|
+
<Labeled label={label} controlId={id} fullWidth={fullWidth}>
|
|
37
37
|
<SelectList<string>
|
|
38
38
|
id={id}
|
|
39
39
|
options={items}
|
|
@@ -34,7 +34,12 @@ const SwitchComponent = ({
|
|
|
34
34
|
const id = useId();
|
|
35
35
|
|
|
36
36
|
return (
|
|
37
|
-
<Labeled
|
|
37
|
+
<Labeled
|
|
38
|
+
label={data.label}
|
|
39
|
+
align="right"
|
|
40
|
+
controlId={id}
|
|
41
|
+
labelClassName="ml-1"
|
|
42
|
+
>
|
|
38
43
|
<Switch
|
|
39
44
|
data-testid="marimo-plugin-switch"
|
|
40
45
|
checked={value}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
fireEvent,
|
|
5
|
+
render,
|
|
6
|
+
screen,
|
|
7
|
+
waitFor,
|
|
8
|
+
within,
|
|
9
|
+
} from "@testing-library/react";
|
|
4
10
|
import { beforeAll, describe, expect, it, vi } from "vitest";
|
|
5
11
|
import { SetupMocks } from "@/__mocks__/common";
|
|
6
12
|
import { initialModeAtom } from "@/core/mode";
|
|
@@ -187,7 +193,7 @@ describe("FileBrowserPlugin keyboard accessibility", () => {
|
|
|
187
193
|
const docsRow = docs.closest('[role="row"]')!;
|
|
188
194
|
fireEvent.keyDown(docsRow, { key: "ArrowDown" }); // move active off the parent
|
|
189
195
|
fireEvent.click(docs); // navigate into "docs"
|
|
190
|
-
await screen.findByText("docs"); // listing reloads (mock returns same files)
|
|
196
|
+
await within(screen.getByRole("grid")).findByText("docs"); // listing reloads (mock returns same files)
|
|
191
197
|
const rows = screen.getAllByRole("row");
|
|
192
198
|
expect(rows[0]).toHaveAttribute("tabindex", "0");
|
|
193
199
|
// the focused row must match the only tabbable row
|
|
@@ -361,3 +367,80 @@ describe("FileBrowserPlugin keyboard accessibility", () => {
|
|
|
361
367
|
function rowFor(name: string): HTMLElement {
|
|
362
368
|
return screen.getByText(name).closest('[role="row"]') as HTMLElement;
|
|
363
369
|
}
|
|
370
|
+
|
|
371
|
+
describe("FileBrowserPlugin breadcrumbs", () => {
|
|
372
|
+
function breadcrumbs() {
|
|
373
|
+
return within(
|
|
374
|
+
screen.getByRole("navigation", { name: "Current directory" }),
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
it("renders a crumb per ancestor with the current directory last", async () => {
|
|
379
|
+
renderBrowser();
|
|
380
|
+
await screen.findByText("docs");
|
|
381
|
+
const items = breadcrumbs().getAllByRole("listitem");
|
|
382
|
+
expect(items.map((li) => li.textContent)).toEqual(["/", "home", "user"]);
|
|
383
|
+
expect(breadcrumbs().getByRole("button", { name: "user" })).toHaveAttribute(
|
|
384
|
+
"aria-current",
|
|
385
|
+
"page",
|
|
386
|
+
);
|
|
387
|
+
expect(
|
|
388
|
+
breadcrumbs().getByRole("button", { name: "home" }),
|
|
389
|
+
).not.toHaveAttribute("aria-current");
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it("keeps focus on a crumb after navigating to it", async () => {
|
|
393
|
+
const { listDirectory } = renderBrowser();
|
|
394
|
+
await screen.findByText("docs");
|
|
395
|
+
const home = breadcrumbs().getByRole("button", { name: "home" });
|
|
396
|
+
home.focus();
|
|
397
|
+
fireEvent.click(home);
|
|
398
|
+
await waitFor(() =>
|
|
399
|
+
expect(listDirectory).toHaveBeenLastCalledWith({ path: "/home" }),
|
|
400
|
+
);
|
|
401
|
+
const current = breadcrumbs().getByRole("button", { name: "home" });
|
|
402
|
+
expect(current).toHaveAttribute("aria-current", "page");
|
|
403
|
+
expect(current).toBe(home);
|
|
404
|
+
expect(current).toHaveFocus();
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
it("does not reload when the current crumb is clicked", async () => {
|
|
408
|
+
const { listDirectory } = renderBrowser();
|
|
409
|
+
await screen.findByText("docs");
|
|
410
|
+
fireEvent.click(breadcrumbs().getByRole("button", { name: "user" }));
|
|
411
|
+
expect(listDirectory).toHaveBeenCalledTimes(1);
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
it("navigates to an ancestor when a crumb is clicked", async () => {
|
|
415
|
+
const { listDirectory } = renderBrowser();
|
|
416
|
+
await screen.findByText("docs");
|
|
417
|
+
fireEvent.click(breadcrumbs().getByRole("button", { name: "home" }));
|
|
418
|
+
await waitFor(() =>
|
|
419
|
+
expect(listDirectory).toHaveBeenLastCalledWith({ path: "/home" }),
|
|
420
|
+
);
|
|
421
|
+
fireEvent.click(breadcrumbs().getByRole("button", { name: "/" }));
|
|
422
|
+
await waitFor(() =>
|
|
423
|
+
expect(listDirectory).toHaveBeenLastCalledWith({ path: "/" }),
|
|
424
|
+
);
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
it("hides ancestors outside the initial path when navigation is restricted", async () => {
|
|
428
|
+
render(
|
|
429
|
+
<FileBrowser
|
|
430
|
+
initialPath="/home/user"
|
|
431
|
+
filetypes={[]}
|
|
432
|
+
selectionMode="all"
|
|
433
|
+
multiple={true}
|
|
434
|
+
label={null}
|
|
435
|
+
restrictNavigation={true}
|
|
436
|
+
value={[]}
|
|
437
|
+
setValue={vi.fn()}
|
|
438
|
+
host={document.createElement("div")}
|
|
439
|
+
list_directory={mockListDirectory(FILES)}
|
|
440
|
+
/>,
|
|
441
|
+
);
|
|
442
|
+
await screen.findByText("docs");
|
|
443
|
+
const items = breadcrumbs().getAllByRole("listitem");
|
|
444
|
+
expect(items.map((li) => li.textContent)).toEqual(["user"]);
|
|
445
|
+
});
|
|
446
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { render } from "@testing-library/react";
|
|
4
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { initialModeAtom } from "@/core/mode";
|
|
6
|
+
import { store } from "@/core/state/jotai";
|
|
7
|
+
import { DatePickerPlugin } from "../DatePickerPlugin";
|
|
8
|
+
import { DateRangePickerPlugin } from "../DateRangePlugin";
|
|
9
|
+
import { DateTimePickerPlugin } from "../DateTimePickerPlugin";
|
|
10
|
+
|
|
11
|
+
const sharedProps = () => ({
|
|
12
|
+
host: document.createElement("div"),
|
|
13
|
+
setValue: vi.fn(),
|
|
14
|
+
functions: {},
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const widgets = [
|
|
18
|
+
{
|
|
19
|
+
name: "date",
|
|
20
|
+
role: "group",
|
|
21
|
+
fallback: "date picker",
|
|
22
|
+
render: (label: string | null, disabled = false) =>
|
|
23
|
+
new DatePickerPlugin().render({
|
|
24
|
+
...sharedProps(),
|
|
25
|
+
value: "2026-10-02",
|
|
26
|
+
data: {
|
|
27
|
+
label,
|
|
28
|
+
disabled,
|
|
29
|
+
start: "2026-01-01",
|
|
30
|
+
stop: "2026-12-31",
|
|
31
|
+
fullWidth: false,
|
|
32
|
+
},
|
|
33
|
+
}),
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "datetime",
|
|
37
|
+
role: "group",
|
|
38
|
+
fallback: "date time picker",
|
|
39
|
+
render: (label: string | null, disabled = false) =>
|
|
40
|
+
new DateTimePickerPlugin().render({
|
|
41
|
+
...sharedProps(),
|
|
42
|
+
value: "2026-10-02T12:00:00",
|
|
43
|
+
data: {
|
|
44
|
+
label,
|
|
45
|
+
disabled,
|
|
46
|
+
start: "2026-01-01T00:00:00",
|
|
47
|
+
stop: "2026-12-31T23:59:59",
|
|
48
|
+
precision: "minute",
|
|
49
|
+
fullWidth: false,
|
|
50
|
+
},
|
|
51
|
+
}),
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "date range",
|
|
55
|
+
role: "group",
|
|
56
|
+
fallback: "date range picker",
|
|
57
|
+
render: (label: string | null, disabled = false) =>
|
|
58
|
+
new DateRangePickerPlugin().render({
|
|
59
|
+
...sharedProps(),
|
|
60
|
+
value: ["2026-10-02", "2026-10-03"],
|
|
61
|
+
data: {
|
|
62
|
+
label,
|
|
63
|
+
disabled,
|
|
64
|
+
start: "2026-01-01",
|
|
65
|
+
stop: "2026-12-31",
|
|
66
|
+
fullWidth: false,
|
|
67
|
+
},
|
|
68
|
+
}),
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
beforeEach(() => store.set(initialModeAtom, "edit"));
|
|
73
|
+
|
|
74
|
+
describe.each(widgets)("$name accessible labels", (widget) => {
|
|
75
|
+
it("uses rendered formatting and decoded entities, and follows label updates", () => {
|
|
76
|
+
const { getByRole, rerender } = render(
|
|
77
|
+
widget.render("<span>Visit <strong>date</strong> & time</span>"),
|
|
78
|
+
);
|
|
79
|
+
expect(getByRole(widget.role, { name: "Visit date & time" })).toBeTruthy();
|
|
80
|
+
rerender(widget.render("<span>Updated <em>label</em></span>"));
|
|
81
|
+
expect(getByRole(widget.role, { name: "Updated label" })).toBeTruthy();
|
|
82
|
+
rerender(widget.render(null));
|
|
83
|
+
expect(getByRole(widget.role, { name: widget.fallback })).toBeTruthy();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it.each([null, ""])("uses the fallback when label is %s", (label) => {
|
|
87
|
+
const { getByRole } = render(widget.render(label));
|
|
88
|
+
expect(getByRole(widget.role, { name: widget.fallback })).toBeTruthy();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("names the calendar button and every editable segment", () => {
|
|
92
|
+
const { getByRole, getAllByRole } = render(
|
|
93
|
+
widget.render("<strong>Visit</strong> & time"),
|
|
94
|
+
);
|
|
95
|
+
expect(getByRole("button", { name: "Calendar Visit & time" })).toBeTruthy();
|
|
96
|
+
for (const segment of getAllByRole("spinbutton")) {
|
|
97
|
+
expect(segment).toHaveAccessibleName(/Visit & time/);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("preserves disabled controls with a formatted label", () => {
|
|
102
|
+
const { getByRole, getAllByRole } = render(
|
|
103
|
+
widget.render("<strong>Visit</strong>", true),
|
|
104
|
+
);
|
|
105
|
+
expect(getByRole("button", { name: "Calendar Visit" })).toBeDisabled();
|
|
106
|
+
for (const segment of getAllByRole("spinbutton")) {
|
|
107
|
+
expect(segment).toHaveAttribute("aria-disabled", "true");
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("keeps labels distinct for multiple widgets", () => {
|
|
112
|
+
const { getByRole } = render(
|
|
113
|
+
<>
|
|
114
|
+
{widget.render("First")}
|
|
115
|
+
{widget.render("Second")}
|
|
116
|
+
</>,
|
|
117
|
+
);
|
|
118
|
+
expect(getByRole(widget.role, { name: "First" })).not.toBe(
|
|
119
|
+
getByRole(widget.role, { name: "Second" }),
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
@@ -9,7 +9,8 @@ interface Props {
|
|
|
9
9
|
label: string | null | undefined;
|
|
10
10
|
className?: string;
|
|
11
11
|
labelClassName?: string;
|
|
12
|
-
|
|
12
|
+
labelId?: string;
|
|
13
|
+
controlId?: string;
|
|
13
14
|
fullWidth?: boolean;
|
|
14
15
|
/**
|
|
15
16
|
* Align the label to the top, left, or right of the component.
|
|
@@ -27,8 +28,9 @@ export const Labeled: React.FC<PropsWithChildren<Props>> = ({
|
|
|
27
28
|
align = "left",
|
|
28
29
|
className,
|
|
29
30
|
labelClassName,
|
|
31
|
+
labelId,
|
|
30
32
|
fullWidth,
|
|
31
|
-
|
|
33
|
+
controlId,
|
|
32
34
|
}) => {
|
|
33
35
|
// If fullWidth is true, force align to be "top"
|
|
34
36
|
if (fullWidth) {
|
|
@@ -45,7 +47,11 @@ export const Labeled: React.FC<PropsWithChildren<Props>> = ({
|
|
|
45
47
|
|
|
46
48
|
const labelElement = (
|
|
47
49
|
<div part="label" className="inline-flex items-center m-0 p-0">
|
|
48
|
-
<Label
|
|
50
|
+
<Label
|
|
51
|
+
id={labelId}
|
|
52
|
+
htmlFor={controlId}
|
|
53
|
+
className={cn("font-prose", labelClassName)}
|
|
54
|
+
>
|
|
49
55
|
{renderHTML({ html: label })}
|
|
50
56
|
</Label>
|
|
51
57
|
</div>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./worker-D7hWi02M.js";var t=e(((e,t)=>{t.exports={}}));export default t();
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import "./chunk-75Z2AOVW-C4AOleKf.js";
|
|
2
|
-
import "./src-CA_m4ONl.js";
|
|
3
|
-
import { n as e } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
|
|
4
|
-
import "./chunk-DU6HZSFF-1TwWR6gh.js";
|
|
5
|
-
import "./chunk-P2QGCYS3-0TAWai9C.js";
|
|
6
|
-
import "./chunk-PWAF6VOD-lNxB9k8z.js";
|
|
7
|
-
import "./chunk-GMAD6QVW-vStrMz2P.js";
|
|
8
|
-
import "./chunk-4HAMMTFA-BPTTOOC5.js";
|
|
9
|
-
import "./chunk-GVQU2GXP-2HwWgs4u.js";
|
|
10
|
-
import "./chunk-L3NEJ4N5-RhC7i0I2.js";
|
|
11
|
-
import "./chunk-OSK3NFVY-CZV09N-U.js";
|
|
12
|
-
import "./mermaid-Dnzoxjt1.js";
|
|
13
|
-
import "./chunk-F27PBJKO-DMI1PBe4.js";
|
|
14
|
-
import "./chunk-XXDRQBXY-Dnl5VBqG.js";
|
|
15
|
-
import "./chunk-POPQ4Y6H-Cc3_56GX.js";
|
|
16
|
-
import { i as t, n, r, t as i } from "./chunk-TICWLB2K-DdXM3eg6.js";
|
|
17
|
-
//#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/classDiagram-ZZMXUADV.mjs
|
|
18
|
-
var a = {
|
|
19
|
-
parser: n,
|
|
20
|
-
get db() {
|
|
21
|
-
return new i();
|
|
22
|
-
},
|
|
23
|
-
renderer: r,
|
|
24
|
-
styles: t,
|
|
25
|
-
init: /* @__PURE__ */ e((e) => {
|
|
26
|
-
e.class ||= {}, e.class.arrowMarkerAbsolute = e.arrowMarkerAbsolute;
|
|
27
|
-
}, "init")
|
|
28
|
-
};
|
|
29
|
-
//#endregion
|
|
30
|
-
export { a as diagram };
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import "./chunk-75Z2AOVW-C4AOleKf.js";
|
|
2
|
-
import "./src-CA_m4ONl.js";
|
|
3
|
-
import { n as e } from "./chunk-Y2CYZVJY-DKKS1VyV.js";
|
|
4
|
-
import "./chunk-DU6HZSFF-1TwWR6gh.js";
|
|
5
|
-
import "./chunk-P2QGCYS3-0TAWai9C.js";
|
|
6
|
-
import "./chunk-PWAF6VOD-lNxB9k8z.js";
|
|
7
|
-
import "./chunk-GMAD6QVW-vStrMz2P.js";
|
|
8
|
-
import "./chunk-4HAMMTFA-BPTTOOC5.js";
|
|
9
|
-
import "./chunk-GVQU2GXP-2HwWgs4u.js";
|
|
10
|
-
import "./chunk-L3NEJ4N5-RhC7i0I2.js";
|
|
11
|
-
import "./chunk-OSK3NFVY-CZV09N-U.js";
|
|
12
|
-
import "./mermaid-Dnzoxjt1.js";
|
|
13
|
-
import "./chunk-F27PBJKO-DMI1PBe4.js";
|
|
14
|
-
import "./chunk-XXDRQBXY-Dnl5VBqG.js";
|
|
15
|
-
import "./chunk-POPQ4Y6H-Cc3_56GX.js";
|
|
16
|
-
import { i as t, n, r, t as i } from "./chunk-TICWLB2K-DdXM3eg6.js";
|
|
17
|
-
//#region ../node_modules/.pnpm/mermaid@11.17.2/node_modules/mermaid/dist/chunks/mermaid.core/classDiagram-v2-VYDZK3BY.mjs
|
|
18
|
-
var a = {
|
|
19
|
-
parser: n,
|
|
20
|
-
get db() {
|
|
21
|
-
return new i();
|
|
22
|
-
},
|
|
23
|
-
renderer: r,
|
|
24
|
-
styles: t,
|
|
25
|
-
init: /* @__PURE__ */ e((e) => {
|
|
26
|
-
e.class ||= {}, e.class.arrowMarkerAbsolute = e.arrowMarkerAbsolute;
|
|
27
|
-
}, "init")
|
|
28
|
-
};
|
|
29
|
-
//#endregion
|
|
30
|
-
export { a as diagram };
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import "./chunk-75Z2AOVW-C4AOleKf.js";
|
|
2
|
-
import "./src-CA_m4ONl.js";
|
|
3
|
-
import "./chunk-DU6HZSFF-1TwWR6gh.js";
|
|
4
|
-
import "./chunk-P2QGCYS3-0TAWai9C.js";
|
|
5
|
-
import "./chunk-PWAF6VOD-lNxB9k8z.js";
|
|
6
|
-
import "./chunk-GMAD6QVW-vStrMz2P.js";
|
|
7
|
-
import "./chunk-4HAMMTFA-BPTTOOC5.js";
|
|
8
|
-
import "./chunk-GVQU2GXP-2HwWgs4u.js";
|
|
9
|
-
import "./chunk-L3NEJ4N5-RhC7i0I2.js";
|
|
10
|
-
import "./chunk-OSK3NFVY-CZV09N-U.js";
|
|
11
|
-
import "./mermaid-Dnzoxjt1.js";
|
|
12
|
-
import "./chunk-F27PBJKO-DMI1PBe4.js";
|
|
13
|
-
import "./chunk-XXDRQBXY-Dnl5VBqG.js";
|
|
14
|
-
import "./chunk-POPQ4Y6H-Cc3_56GX.js";
|
|
15
|
-
import { n as e } from "./chunk-SHT3W25Y-CrEPyWy1.js";
|
|
16
|
-
export { e as diagram };
|