@marimo-team/frontend 0.24.1-dev113 → 0.24.1-dev115

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 (127) hide show
  1. package/dist/assets/{CellStatus-DjaaE1KV.js → CellStatus-DJBTB8Tm.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-BYgv4Vrx.js → ConnectedDataExplorerComponent-C22y7sbC.js} +1 -1
  3. package/dist/assets/{ErrorBoundary-ClXmeuxA.js → ErrorBoundary-CDVGFYfr.js} +1 -1
  4. package/dist/assets/{JsonOutput-6STJL9Rn.js → JsonOutput-COWoYBdx.js} +2 -2
  5. package/dist/assets/{LazyAnyLanguageCodeMirror-BnkWE9wV.js → LazyAnyLanguageCodeMirror-nhd5JrSb.js} +2 -2
  6. package/dist/assets/{MarimoErrorOutput-BTqTZeiu.js → MarimoErrorOutput-Cpp7YwEl.js} +1 -1
  7. package/dist/assets/{RenderHTML-DUXIAUaj.js → RenderHTML-DlIzJTPL.js} +1 -1
  8. package/dist/assets/{RunButton-aYiWB8Ga.js → RunButton-CT16Dkr4.js} +1 -1
  9. package/dist/assets/{VisuallyHidden-dPzEOlg8.js → VisuallyHidden-wlQyxf8y.js} +1 -1
  10. package/dist/assets/{add-cell-with-ai-l_Dax5pU.js → add-cell-with-ai-DSjyPknP.js} +1 -1
  11. package/dist/assets/{add-connection-dialog-CpvZ5BqX.js → add-connection-dialog-DO478_EL.js} +1 -1
  12. package/dist/assets/{agent-panel-CbdAoVgG.js → agent-panel-DIvPSTyY.js} +1 -1
  13. package/dist/assets/{ai-model-dropdown-jVyB16Bq.js → ai-model-dropdown-BxqpRM7R.js} +1 -1
  14. package/dist/assets/{alert-dialog-D_btUJmY.js → alert-dialog-BnNhUpVP.js} +1 -1
  15. package/dist/assets/{any-language-editor-B6cFLupW.js → any-language-editor-kw0XJFxM.js} +1 -1
  16. package/dist/assets/{app-config-button-CHSwEEzP.js → app-config-button-CAZWYP6R.js} +1 -1
  17. package/dist/assets/badge-BSgtkC2e.js +1 -0
  18. package/dist/assets/{blob-CoYb7D0i.js → blob-B82D3b64.js} +1 -1
  19. package/dist/assets/button-Dh8EwhsF.js +1 -0
  20. package/dist/assets/{cache-panel-mVo7M8xm.js → cache-panel-iphovHma.js} +1 -1
  21. package/dist/assets/{cell-editor-Bo1CBkuH.js → cell-editor-CL59E8W0.js} +1 -1
  22. package/dist/assets/{cell-link-CJvbR4gk.js → cell-link-DOeJzvRH.js} +1 -1
  23. package/dist/assets/{cells-C3Vs2g0_.js → cells-BgH2MZS9.js} +3 -3
  24. package/dist/assets/{chat-display-CkS1h-qA.js → chat-display-kzxea9r-.js} +1 -1
  25. package/dist/assets/{chat-panel-Bl8KhsjW.js → chat-panel-BVsbI9bp.js} +1 -1
  26. package/dist/assets/{chat-ui-lhVS3XhN.js → chat-ui-BIaqeCtJ.js} +1 -1
  27. package/dist/assets/{circle-BScTJE-Z.js → circle-BiW8b6Xq.js} +1 -1
  28. package/dist/assets/{column-preview-CBydN0D3.js → column-preview-BWoK0ZFU.js} +1 -1
  29. package/dist/assets/{command-palette-D0yWoZzd.js → command-palette-CcLmXXVs.js} +1 -1
  30. package/dist/assets/{common-BANLqpaV.js → common-DeDcgYdz.js} +1 -1
  31. package/dist/assets/{components-DC6fLfDw.js → components-CtHLnRet.js} +1 -1
  32. package/dist/assets/{config-BzPQfGBM.js → config-DnyziF11.js} +1 -1
  33. package/dist/assets/{copy-icon-zfaCsLjV.js → copy-icon-D522mvZL.js} +1 -1
  34. package/dist/assets/{datasource-DB4KqePX.js → datasource-HG_yVRxq.js} +1 -1
  35. package/dist/assets/dependency-graph-panel-CVsva03Q.js +5 -0
  36. package/dist/assets/{documentation-panel-2myTueGx.js → documentation-panel-BSiOFIpg.js} +1 -1
  37. package/dist/assets/{download-VyhuV4Af.js → download-C4umhthc.js} +1 -1
  38. package/dist/assets/{dropdown-menu-DnX3jo0y.js → dropdown-menu-B-ZAV5lw.js} +1 -1
  39. package/dist/assets/{edit-page-CVhnUbM-.js → edit-page-DCOdX3sJ.js} +4 -4
  40. package/dist/assets/{error-banner-BsjSLKyr.js → error-banner-C5aiAh3q.js} +1 -1
  41. package/dist/assets/{error-entries-DZjQ7yIb.js → error-entries-Yh2iX13J.js} +1 -1
  42. package/dist/assets/{error-panel-BpAXL0Jx.js → error-panel-CGUFTbfd.js} +1 -1
  43. package/dist/assets/{file-explorer-panel-BN6gd4XO.js → file-explorer-panel-Db-8C8fm.js} +1 -1
  44. package/dist/assets/{file-icons-DqdK7VJg.js → file-icons-C0Mf_Axb.js} +1 -1
  45. package/dist/assets/{file-name-input-oiyzcfEJ.js → file-name-input-DmwIfRLx.js} +1 -1
  46. package/dist/assets/{floating-outline-DPSwhBkV.js → floating-outline-8Uo6Qp8W.js} +1 -1
  47. package/dist/assets/{gallery-page-7DdjmUx5.js → gallery-page-BpxbCG1a.js} +1 -1
  48. package/dist/assets/{glide-data-editor-Di4wZ4hd.js → glide-data-editor-k7azNhFM.js} +1 -1
  49. package/dist/assets/{home-page-Bp96aSro.js → home-page-CEzr9Hhn.js} +1 -1
  50. package/dist/assets/{index-BkIXRAbi.css → index-DuY6Lm00.css} +1 -1
  51. package/dist/assets/{index-DppxBBTx.js → index-kkDJK6-j.js} +5 -5
  52. package/dist/assets/{input-BBJ8nAOd.js → input-D4qvzBWu.js} +1 -1
  53. package/dist/assets/{layout-Cx8C7K25.js → layout-D5ovQPUb.js} +3 -3
  54. package/dist/assets/{logs-panel-D0bWZKWJ.js → logs-panel-Cqxpxz5Z.js} +1 -1
  55. package/dist/assets/{markdown-renderer-CZ3YygMD.js → markdown-renderer-zZh3O1Hm.js} +1 -1
  56. package/dist/assets/menu-items-CsV3aDPH.js +1 -0
  57. package/dist/assets/{mermaid-Bx9Qyize.js → mermaid-BovZosCC.js} +1 -1
  58. package/dist/assets/{name-cell-input-Bu4JMe_U.js → name-cell-input-DXP1MqrH.js} +1 -1
  59. package/dist/assets/{outline-panel-C1xIywWA.js → outline-panel-CMMPf-P7.js} +1 -1
  60. package/dist/assets/{packages-panel-DTJ-O5EO.js → packages-panel-BHZOSh3s.js} +1 -1
  61. package/dist/assets/{pair-with-agent-modal-DdhoVv9s.js → pair-with-agent-modal-DgckrViE.js} +1 -1
  62. package/dist/assets/{panel-accordion-state-Cx3vYbsP.js → panel-accordion-state-9kdNootf.js} +1 -1
  63. package/dist/assets/{panels-CywQefR1.js → panels-Ca-tbb7P.js} +1 -1
  64. package/dist/assets/{process-output-BisIKywr.js → process-output-Bi9pDe1a.js} +1 -1
  65. package/dist/assets/{readonly-code-display-BkxE6y3G.js → readonly-code-display-ilZfA3ua.js} +1 -1
  66. package/dist/assets/{readonly-python-code-BsJxWR9t.js → readonly-python-code-Bqk6NhSW.js} +1 -1
  67. package/dist/assets/{renderShortcut-BmNAHfqT.js → renderShortcut-BnBOGXqJ.js} +1 -1
  68. package/dist/assets/{reveal-component-BNl5Zqif.js → reveal-component-DpoL_y06.js} +1 -1
  69. package/dist/assets/{run-page-RG1gHn8i.js → run-page-rnCMzZmN.js} +1 -1
  70. package/dist/assets/{scratchpad-panel-DnSgF--Q.js → scratchpad-panel-BBd8n8wh.js} +1 -1
  71. package/dist/assets/{scroll-to-bottom-button-BsJTlAOK.js → scroll-to-bottom-button-DufiYUD7.js} +1 -1
  72. package/dist/assets/{secrets-panel-BKccjNx4.js → secrets-panel-C5D_CNW2.js} +1 -1
  73. package/dist/assets/{select-4UL7AAMx.js → select-BJKJFWHk.js} +1 -1
  74. package/dist/assets/{session-panel-BXwF6uCv.js → session-panel-C3kmYD9D.js} +1 -1
  75. package/dist/assets/{skeleton-DIGKSCaR.js → skeleton-xsRIwsVr.js} +1 -1
  76. package/dist/assets/{snippets-panel-Bs7D-2J3.js → snippets-panel-C1fCmhNQ.js} +1 -1
  77. package/dist/assets/{state-DqwSj41I.js → state-CsL-gymg.js} +1 -1
  78. package/dist/assets/{state-C5o_oPeD.js → state-DJSqAVnx.js} +1 -1
  79. package/dist/assets/{swiper-component-CeAE4PvB.js → swiper-component-5Kdi1-Gn.js} +1 -1
  80. package/dist/assets/{switch-qLxqA0gx.js → switch-CYJ2u4G9.js} +1 -1
  81. package/dist/assets/{tabs-CIEoDqa7.js → tabs-DxfkQ6UI.js} +1 -1
  82. package/dist/assets/{terminal-9kcc2057.js → terminal-CfkxQQwT.js} +1 -1
  83. package/dist/assets/{tracing-PQRp5Y6N.js → tracing-BHb672Fd.js} +1 -1
  84. package/dist/assets/{tracing-panel-BnrbDAGz.js → tracing-panel-3JaAnsDw.js} +2 -2
  85. package/dist/assets/{tree-actions-C-1KQPVN.js → tree-actions-CzmLf39g.js} +1 -1
  86. package/dist/assets/{useAddCell-qRhXgYb3.js → useAddCell-DuzEVBJj.js} +1 -1
  87. package/dist/assets/{useCellActionButton-C__VM-4x.js → useCellActionButton-B3Ve1KW5.js} +1 -1
  88. package/dist/assets/{useDeleteCell-xTUoM-wW.js → useDeleteCell-CEtU0g91.js} +1 -1
  89. package/dist/assets/{useDependencyPanelTab-DbotHB0-.js → useDependencyPanelTab-BpSWTQLC.js} +1 -1
  90. package/dist/assets/{useNotebookActions-DIcNvfxA.js → useNotebookActions-C3LAhEgG.js} +1 -1
  91. package/dist/assets/{useRunCells-Bno18PcV.js → useRunCells-omrTl5XU.js} +1 -1
  92. package/dist/assets/{useSplitCell-DigdAFdD.js → useSplitCell-CgXD2Gcw.js} +1 -1
  93. package/dist/assets/{vega-component-DnazhC4G.js → vega-component-CwdVpUdb.js} +1 -1
  94. package/dist/assets/write-secret-modal-GHpJRc36.js +2 -0
  95. package/dist/index.html +38 -38
  96. package/package.json +1 -1
  97. package/src/components/dependency-graph/__tests__/elements.test.ts +151 -0
  98. package/src/components/dependency-graph/custom-edge.tsx +68 -0
  99. package/src/components/dependency-graph/custom-node.tsx +54 -26
  100. package/src/components/dependency-graph/dependency-graph-tree.tsx +110 -21
  101. package/src/components/dependency-graph/elements.ts +225 -31
  102. package/src/components/dependency-graph/panels.tsx +23 -2
  103. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +78 -0
  104. package/src/components/dependency-graph/utils/layout.ts +108 -18
  105. package/src/components/ui/__tests__/badge.test.ts +63 -0
  106. package/src/components/ui/__tests__/button.test.ts +19 -0
  107. package/src/components/ui/__tests__/menu-items.test.ts +31 -0
  108. package/src/components/ui/badge.tsx +9 -7
  109. package/src/components/ui/button.tsx +1 -0
  110. package/src/components/ui/combobox.tsx +1 -1
  111. package/src/components/ui/date-input.tsx +1 -1
  112. package/src/components/ui/dialog.tsx +3 -1
  113. package/src/components/ui/menu-items.tsx +9 -9
  114. package/src/components/ui/native-select.tsx +2 -2
  115. package/src/components/ui/navigation.tsx +1 -1
  116. package/src/components/ui/range-slider.tsx +5 -3
  117. package/src/components/ui/select.tsx +1 -1
  118. package/src/components/ui/sheet.tsx +1 -1
  119. package/src/components/ui/toast.tsx +8 -5
  120. package/src/components/ui/toaster.tsx +2 -2
  121. package/src/css/globals.css +28 -0
  122. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +25 -25
  123. package/dist/assets/badge-D_-uqy2N.js +0 -1
  124. package/dist/assets/button-MlJ5qApt.js +0 -1
  125. package/dist/assets/dependency-graph-panel-LHjxAlPl.js +0 -5
  126. package/dist/assets/menu-items-BGpxTb6Y.js +0 -1
  127. package/dist/assets/write-secret-modal-BJCzwShk.js +0 -2
@@ -0,0 +1,63 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import { badgeVariants } from "../badge";
5
+
6
+ describe("badgeVariants", () => {
7
+ it.each([
8
+ {
9
+ variant: "default" as const,
10
+ expected: [
11
+ "forced-colors:bg-[Highlight]",
12
+ "forced-colors:border-[Highlight]",
13
+ "forced-colors:text-[HighlightText]",
14
+ "forced-colors:hover:bg-[Highlight]",
15
+ "forced-colors:hover:text-[HighlightText]",
16
+ ],
17
+ },
18
+ {
19
+ variant: "defaultOutline" as const,
20
+ expected: [
21
+ "forced-colors:bg-[Canvas]",
22
+ "forced-colors:border-[Highlight]",
23
+ "forced-colors:text-[CanvasText]",
24
+ ],
25
+ },
26
+ {
27
+ variant: "secondary" as const,
28
+ expected: [
29
+ "forced-colors:bg-[ButtonFace]",
30
+ "forced-colors:border-[ButtonText]",
31
+ "forced-colors:text-[ButtonText]",
32
+ "forced-colors:hover:bg-[Highlight]",
33
+ "forced-colors:hover:text-[HighlightText]",
34
+ ],
35
+ },
36
+ ])("uses system colors for $variant", ({ variant, expected }) => {
37
+ const classes = badgeVariants({ variant });
38
+
39
+ expect(classes).toEqual(expect.stringContaining(expected.join(" ")));
40
+ expect(classes).toContain("forced-color-adjust-none");
41
+ });
42
+
43
+ it.each(["destructive", "success", "outline"] as const)(
44
+ "keeps the %s variant visible without semantic colors",
45
+ (variant) => {
46
+ const classes = badgeVariants({ variant });
47
+
48
+ expect(classes).toEqual(
49
+ expect.stringContaining(
50
+ [
51
+ "forced-colors:bg-[Canvas]",
52
+ "forced-colors:border-[ButtonText]",
53
+ "forced-colors:text-[CanvasText]",
54
+ ].join(" "),
55
+ ),
56
+ );
57
+ if (variant !== "outline") {
58
+ expect(classes).toContain("forced-colors:hover:bg-[Highlight]");
59
+ expect(classes).toContain("forced-colors:hover:text-[HighlightText]");
60
+ }
61
+ },
62
+ );
63
+ });
@@ -39,4 +39,23 @@ describe("buttonVariants", () => {
39
39
  expect(classes).not.toMatch(/--(?:red|grass|yellow)-/);
40
40
  expect(classes).not.toContain("dark:");
41
41
  });
42
+
43
+ it("uses system colors in forced-color mode", () => {
44
+ const classes = buttonVariants({ variant: "default" });
45
+
46
+ expect(classes).toEqual(
47
+ expect.stringContaining(
48
+ [
49
+ "forced-color-adjust-none",
50
+ "forced-colors:border-[ButtonText]",
51
+ "forced-colors:bg-[ButtonFace]",
52
+ "forced-colors:text-[ButtonText]",
53
+ "forced-colors:hover:bg-[Highlight]",
54
+ "forced-colors:hover:text-[HighlightText]",
55
+ "forced-colors:disabled:border-[GrayText]",
56
+ "forced-colors:disabled:text-[GrayText]",
57
+ ].join(" "),
58
+ ),
59
+ );
60
+ });
42
61
  });
@@ -0,0 +1,31 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import {
5
+ menuControlVariants,
6
+ menuItemVariants,
7
+ menuSubTriggerVariants,
8
+ } from "../menu-items";
9
+
10
+ describe("menu item variants", () => {
11
+ it.each([
12
+ menuSubTriggerVariants(),
13
+ menuControlVariants(),
14
+ menuItemVariants(),
15
+ ])("styles Radix highlighted state", (classes) => {
16
+ expect(classes).toContain("data-[highlighted]:bg-accent");
17
+ expect(classes).toContain(
18
+ "forced-colors:data-[highlighted]:bg-[Highlight]",
19
+ );
20
+ expect(classes).toContain(
21
+ "forced-colors:data-[highlighted]:text-[HighlightText]",
22
+ );
23
+ });
24
+
25
+ it("keeps the command item selected state", () => {
26
+ const classes = menuItemVariants();
27
+
28
+ expect(classes).toContain("aria-selected:bg-accent");
29
+ expect(classes).toContain("forced-colors:aria-selected:bg-[Highlight]");
30
+ });
31
+ });
@@ -6,20 +6,22 @@ import * as React from "react";
6
6
  import { cn } from "@/utils/cn";
7
7
 
8
8
  const badgeVariants = cva(
9
- "inline-flex items-center border rounded-full px-2 py-0.5 text-xs font-semibold transition-colors focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2",
9
+ "inline-flex items-center border rounded-full px-2 py-0.5 text-xs font-semibold transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 forced-color-adjust-none",
10
10
  {
11
11
  variants: {
12
12
  variant: {
13
13
  default:
14
- "bg-primary hover:bg-primary/60 border-transparent text-primary-foreground",
15
- defaultOutline: "bg-(--blue-2) border-(--blue-8) text-(--blue-11)",
14
+ "bg-primary hover:bg-primary/60 border-transparent text-primary-foreground forced-colors:bg-[Highlight] forced-colors:border-[Highlight] forced-colors:text-[HighlightText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
15
+ defaultOutline:
16
+ "bg-(--blue-2) border-(--blue-8) text-(--blue-11) forced-colors:bg-[Canvas] forced-colors:border-[Highlight] forced-colors:text-[CanvasText]",
16
17
  secondary:
17
- "bg-secondary hover:bg-secondary/80 border-transparent text-secondary-foreground",
18
+ "bg-secondary hover:bg-secondary/80 border-transparent text-secondary-foreground forced-colors:bg-[ButtonFace] forced-colors:border-[ButtonText] forced-colors:text-[ButtonText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
18
19
  destructive:
19
- "bg-(--red-2) border-(--red-6) text-(--red-9) hover:bg-(--red-3)",
20
+ "bg-(--red-2) border-(--red-6) text-(--red-9) hover:bg-(--red-3) forced-colors:bg-[Canvas] forced-colors:border-[ButtonText] forced-colors:text-[CanvasText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
20
21
  success:
21
- "bg-(--grass-2) border-(--grass-5) text-(--grass-9) hover:bg-(--grass-3)",
22
- outline: "text-foreground",
22
+ "bg-(--grass-2) border-(--grass-5) text-(--grass-9) hover:bg-(--grass-3) forced-colors:bg-[Canvas] forced-colors:border-[ButtonText] forced-colors:text-[CanvasText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText]",
23
+ outline:
24
+ "text-foreground forced-colors:bg-[Canvas] forced-colors:border-[ButtonText] forced-colors:text-[CanvasText]",
23
25
  },
24
26
  },
25
27
  defaultVariants: {
@@ -14,6 +14,7 @@ const buttonVariants = cva(
14
14
  cn(
15
15
  "disabled:opacity-50 disabled:pointer-events-none",
16
16
  "inline-flex items-center justify-center rounded-md text-sm font-medium focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background",
17
+ "forced-color-adjust-none forced-colors:border-[ButtonText] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText] forced-colors:disabled:border-[GrayText] forced-colors:disabled:text-[GrayText]",
17
18
  ),
18
19
  {
19
20
  variants: {
@@ -201,7 +201,7 @@ export const Combobox = <TValue,>({
201
201
  id={id}
202
202
  type="button"
203
203
  className={cn(
204
- "flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus:outline-hidden focus:ring-1 focus:ring-ring focus:border-primary focus:shadow-md-solid",
204
+ "flex h-6 w-fit mb-1 shadow-xs-solid items-center justify-between rounded-sm border border-input bg-transparent px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground hover:shadow-sm-solid focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:border-primary focus-visible:shadow-md-solid",
205
205
  disabled && "cursor-not-allowed opacity-50",
206
206
  className,
207
207
  )}
@@ -29,7 +29,7 @@ const DateSegment = ({ className, ...props }: AriaDateSegmentProps) => {
29
29
  /* Disabled */
30
30
  "data-disabled:cursor-not-allowed data-disabled:opacity-50",
31
31
  /* Focused */
32
- "data-focused:bg-accent data-focused:text-accent-foreground focus:bg-accent focus:text-accent-foreground",
32
+ "data-focused:bg-accent data-focused:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground",
33
33
  /* Invalid */
34
34
  "data-invalid:data-focused:bg-destructive data-invalid:data-focused:data-placeholder:text-destructive-foreground data-invalid:data-focused:text-destructive-foreground data-invalid:data-placeholder:text-destructive data-invalid:text-destructive",
35
35
  className,
@@ -42,6 +42,7 @@ const DialogOverlay = React.forwardRef<
42
42
  ref={ref}
43
43
  className={cn(
44
44
  "fixed inset-0 z-50 bg-background/80 backdrop-blur-xs transition-all duration-100 data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=open]:fade-in",
45
+ "forced-color-adjust-none forced-colors:bg-[CanvasText] forced-colors:opacity-50",
45
46
  className,
46
47
  )}
47
48
  {...props}
@@ -63,13 +64,14 @@ const DialogContent = React.forwardRef<
63
64
  ref={ref}
64
65
  className={cn(
65
66
  "fixed z-50 grid w-full gap-4 rounded-b-lg border bg-background p-6 shadow-sm animate-in data-[state=open]:fade-in-90 data-[state=open]:slide-in-from-bottom-10 sm:max-w-2xl sm:mx-4 sm:rounded-lg sm:zoom-in-90 sm:data-[state=open]:slide-in-from-bottom-0",
67
+ "forced-color-adjust-none forced-colors:border-[CanvasText] forced-colors:bg-[Canvas] forced-colors:text-[CanvasText]",
66
68
  className,
67
69
  )}
68
70
  {...restoreFocus}
69
71
  {...props}
70
72
  >
71
73
  {children}
72
- <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
74
+ <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
73
75
  <X className="h-4 w-4" />
74
76
  <span className="sr-only">Close</span>
75
77
  </DialogPrimitive.Close>
@@ -5,7 +5,7 @@ import React from "react";
5
5
  import { cn } from "@/utils/cn";
6
6
 
7
7
  export const menuContentCommon = cva(
8
- "z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
8
+ "z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md forced-color-adjust-none forced-colors:border-[CanvasText] forced-colors:bg-[Canvas] forced-colors:text-[CanvasText]",
9
9
  {
10
10
  variants: {
11
11
  subcontent: {
@@ -16,7 +16,7 @@ export const menuContentCommon = cva(
16
16
  );
17
17
 
18
18
  export const menuSubTriggerVariants = cva(
19
- "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
19
+ "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground forced-color-adjust-none forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText] forced-colors:data-[state=open]:bg-[Highlight] forced-colors:data-[state=open]:text-[HighlightText]",
20
20
  {
21
21
  variants: {
22
22
  inset: {
@@ -27,11 +27,11 @@ export const menuSubTriggerVariants = cva(
27
27
  );
28
28
 
29
29
  export const MENU_ITEM_DISABLED =
30
- "data-disabled:pointer-events-none data-disabled:opacity-50";
30
+ "data-disabled:pointer-events-none data-disabled:opacity-50 forced-colors:data-disabled:text-[GrayText]";
31
31
 
32
32
  export const menuControlVariants = cva(
33
33
  cn(
34
- "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground",
34
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground forced-color-adjust-none forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText]",
35
35
  MENU_ITEM_DISABLED,
36
36
  ),
37
37
  { variants: {} },
@@ -54,7 +54,7 @@ export const menuLabelVariants = cva("px-2 py-1.5 text-sm font-semibold", {
54
54
 
55
55
  export const menuItemVariants = cva(
56
56
  cn(
57
- "menu-item relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden",
57
+ "menu-item relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden forced-color-adjust-none forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText] forced-colors:aria-selected:bg-[Highlight] forced-colors:aria-selected:text-[HighlightText]",
58
58
  MENU_ITEM_DISABLED,
59
59
  ),
60
60
  {
@@ -64,13 +64,13 @@ export const menuItemVariants = cva(
64
64
  },
65
65
  variant: {
66
66
  default:
67
- "focus:bg-accent focus:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",
67
+ "data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground",
68
68
  danger:
69
- "focus:bg-(--red-5) focus:text-(--red-12) aria-selected:bg-(--red-5) aria-selected:text-(--red-12)",
69
+ "data-[highlighted]:bg-(--red-5) data-[highlighted]:text-(--red-12) aria-selected:bg-(--red-5) aria-selected:text-(--red-12)",
70
70
  muted:
71
- "focus:bg-muted/70 focus:text-muted-foreground aria-selected:bg-muted/70 aria-selected:text-muted-foreground",
71
+ "data-[highlighted]:bg-muted/70 data-[highlighted]:text-muted-foreground aria-selected:bg-muted/70 aria-selected:text-muted-foreground",
72
72
  success:
73
- "focus:bg-(--grass-3) focus:text-(--grass-11) aria-selected:bg-(--grass-3) aria-selected:text-(--grass-11)",
73
+ "data-[highlighted]:bg-(--grass-3) data-[highlighted]:text-(--grass-11) aria-selected:bg-(--grass-3) aria-selected:text-(--grass-11)",
74
74
  disabled: "text-muted-foreground",
75
75
  },
76
76
  },
@@ -6,12 +6,12 @@ import { cn } from "@/utils/cn";
6
6
  import { Events } from "@/utils/events";
7
7
 
8
8
  export const selectStyles = cva(
9
- "flex h-6 w-fit mb-1 items-center justify-between rounded-sm bg-background px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground focus:outline-hidden focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer",
9
+ "flex h-6 w-fit mb-1 items-center justify-between rounded-sm bg-background px-2 text-sm font-prose ring-offset-background placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer forced-color-adjust-none forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText] forced-colors:disabled:text-[GrayText]",
10
10
  {
11
11
  variants: {
12
12
  variant: {
13
13
  default:
14
- "shadow-xs-solid border border-input hover:shadow-sm-solid focus:border-primary focus:shadow-md-solid disabled:hover:shadow-xs-solid",
14
+ "shadow-xs-solid border border-input hover:shadow-sm-solid focus-visible:border-primary focus-visible:shadow-md-solid disabled:hover:shadow-xs-solid forced-colors:border-[ButtonText] forced-colors:disabled:border-[GrayText]",
15
15
  ghost: "opacity-70 hover:opacity-100 focus:opacity-100",
16
16
  },
17
17
  },
@@ -56,7 +56,7 @@ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
56
56
  const NavigationMenuItem = NavigationMenuPrimitive.Item;
57
57
 
58
58
  const navigationMenuTriggerStyle = cva(
59
- "group inline-flex rounded-md bg-background px-4 py-2 text-lg font-medium text-(--slate-12) transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-hidden disabled:pointer-events-none disabled:opacity-50 data-active:bg-accent/50 data-[state=open]:bg-accent/50",
59
+ "group inline-flex rounded-md bg-background px-4 py-2 text-lg font-medium text-(--slate-12) transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50 data-active:bg-accent/50 data-[state=open]:bg-accent/50",
60
60
  {
61
61
  variants: {
62
62
  orientation: {
@@ -132,7 +132,7 @@ const RangeSlider = React.forwardRef<
132
132
  "relative flex touch-none select-none hover:cursor-pointer",
133
133
  "data-[orientation=horizontal]:w-full data-[orientation=horizontal]:items-center",
134
134
  "data-[orientation=vertical]:h-full data-[orientation=vertical]:justify-center",
135
- "data-disabled:cursor-not-allowed",
135
+ "data-disabled:cursor-not-allowed forced-color-adjust-none",
136
136
  className,
137
137
  )}
138
138
  {...props}
@@ -142,6 +142,7 @@ const RangeSlider = React.forwardRef<
142
142
  data-testid="track"
143
143
  className={cn(
144
144
  "relative grow overflow-hidden rounded-full bg-slate-200 dark:bg-accent/60",
145
+ "forced-colors:border forced-colors:border-[ButtonText] forced-colors:bg-[ButtonFace]",
145
146
  "data-[orientation=horizontal]:h-2 data-[orientation=horizontal]:w-full",
146
147
  "data-[orientation=vertical]:h-full data-[orientation=vertical]:w-2",
147
148
  )}
@@ -150,6 +151,7 @@ const RangeSlider = React.forwardRef<
150
151
  data-testid="range"
151
152
  className={cn(
152
153
  "absolute bg-blue-500 dark:bg-primary",
154
+ "forced-colors:bg-[Highlight] forced-colors:data-disabled:bg-[GrayText]",
153
155
  "data-[orientation=horizontal]:h-full",
154
156
  "data-[orientation=vertical]:w-full",
155
157
  "data-disabled:opacity-50",
@@ -165,7 +167,7 @@ const RangeSlider = React.forwardRef<
165
167
  <TooltipTrigger asChild={true}>
166
168
  <SliderPrimitive.Thumb
167
169
  data-testid="thumb"
168
- className="block h-4 w-4 rounded-full shadow-xs-solid border border-blue-500 dark:border-primary dark:bg-accent bg-white hover:bg-blue-300 focus:bg-blue-300 transition-colors focus-visible:outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50"
170
+ className="block h-4 w-4 rounded-full shadow-xs-solid border border-blue-500 dark:border-primary dark:bg-accent bg-white hover:bg-blue-300 focus:bg-blue-300 transition-colors focus-visible:outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50 forced-colors:border-[ButtonText] forced-colors:bg-[ButtonFace] forced-colors:data-disabled:border-[GrayText]"
169
171
  onFocus={openActions.setTrue}
170
172
  onBlur={openActions.setFalse}
171
173
  onMouseEnter={openActions.setTrue}
@@ -186,7 +188,7 @@ const RangeSlider = React.forwardRef<
186
188
  <TooltipTrigger asChild={true}>
187
189
  <SliderPrimitive.Thumb
188
190
  data-testid="thumb"
189
- className="block h-4 w-4 rounded-full shadow-xs-solid border border-blue-500 dark:border-primary dark:bg-accent bg-white hover:bg-blue-300 focus:bg-blue-300 transition-colors focus-visible:outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50"
191
+ className="block h-4 w-4 rounded-full shadow-xs-solid border border-blue-500 dark:border-primary dark:bg-accent bg-white hover:bg-blue-300 focus:bg-blue-300 transition-colors focus-visible:outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50 forced-colors:border-[ButtonText] forced-colors:bg-[ButtonFace] forced-colors:data-disabled:border-[GrayText]"
190
192
  onFocus={openActions.setTrue}
191
193
  onBlur={openActions.setFalse}
192
194
  onMouseEnter={openActions.setTrue}
@@ -125,7 +125,7 @@ const SelectItem = React.forwardRef<
125
125
  <SelectPrimitive.Item
126
126
  ref={ref}
127
127
  className={cn(
128
- "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground",
128
+ "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-hidden data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground forced-colors:data-[highlighted]:bg-[Highlight] forced-colors:data-[highlighted]:text-[HighlightText]",
129
129
  MENU_ITEM_DISABLED,
130
130
  className,
131
131
  )}
@@ -68,7 +68,7 @@ const SheetContent = React.forwardRef<
68
68
  {...props}
69
69
  >
70
70
  {children}
71
- <SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
71
+ <SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
72
72
  <Cross2Icon className="h-4 w-4" />
73
73
  <span className="sr-only">Close</span>
74
74
  </SheetPrimitive.Close>
@@ -26,15 +26,16 @@ const ToastViewport = React.forwardRef<
26
26
  ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
27
27
 
28
28
  const VARIANT_CLASSES = {
29
- default: "bg-background border",
29
+ default:
30
+ "bg-background border forced-colors:border-[CanvasText] forced-colors:bg-[Canvas] forced-colors:text-[CanvasText]",
30
31
  danger:
31
- "group destructive text-error border-destructive bg-(--red-1) shadow-md-solid shadow-error",
32
+ "group destructive text-error border-destructive bg-(--red-1) shadow-md-solid shadow-error forced-colors:border-[CanvasText] forced-colors:bg-[Canvas] forced-colors:text-[CanvasText]",
32
33
  } as const satisfies Record<string, string>;
33
34
 
34
35
  type ToastVariant = keyof typeof VARIANT_CLASSES;
35
36
 
36
37
  const toastVariants = cva(
37
- "data-[swipe=move]:transition-none group relative pointer-events-auto flex w-full items-start justify-between gap-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=move]:translate-x-(--radix-toast-swipe-move-x) data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-(--radix-toast-swipe-end-x) data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=open]:slide-in-from-top-full sm:data-[state=open]:slide-in-from-bottom-full data-[state=closed]:slide-out-to-right-full",
38
+ "data-[swipe=move]:transition-none group relative pointer-events-auto flex w-full items-start justify-between gap-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=move]:translate-x-(--radix-toast-swipe-move-x) data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-(--radix-toast-swipe-end-x) data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=open]:slide-in-from-top-full sm:data-[state=open]:slide-in-from-bottom-full data-[state=closed]:slide-out-to-right-full forced-color-adjust-none",
38
39
  {
39
40
  variants: {
40
41
  variant: VARIANT_CLASSES,
@@ -76,7 +77,8 @@ const ToastAction = React.forwardRef<
76
77
  <ToastPrimitives.Action
77
78
  ref={ref}
78
79
  className={cn(
79
- "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-destructive/30 hover:group-[.destructive]:border-destructive/30 hover:group-[.destructive]:bg-destructive hover:group-[.destructive]:text-destructive-foreground focus:group-[.destructive]:ring-destructive",
80
+ "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-destructive/30 hover:group-[.destructive]:border-destructive/30 hover:group-[.destructive]:bg-destructive hover:group-[.destructive]:text-destructive-foreground focus-visible:group-[.destructive]:ring-destructive",
81
+ "forced-color-adjust-none forced-colors:border-[ButtonText] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText] forced-colors:hover:bg-[Highlight] forced-colors:hover:text-[HighlightText] forced-colors:disabled:border-[GrayText] forced-colors:disabled:text-[GrayText]",
80
82
  className,
81
83
  )}
82
84
  {...props}
@@ -91,7 +93,8 @@ const ToastClose = React.forwardRef<
91
93
  <ToastPrimitives.Close
92
94
  ref={ref}
93
95
  className={cn(
94
- "absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-hidden focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 hover:group-[.destructive]:text-red-500 focus:group-[.destructive]:ring-red-400 focus:group-[.destructive]:ring-offset-red-600",
96
+ "absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus-visible:outline-hidden focus-visible:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 hover:group-[.destructive]:text-red-500 focus-visible:group-[.destructive]:ring-red-400 focus-visible:group-[.destructive]:ring-offset-red-600",
97
+ "forced-colors:text-[CanvasText] forced-colors:hover:text-[CanvasText] forced-colors:group-[.destructive]:text-[CanvasText] forced-colors:hover:group-[.destructive]:text-[CanvasText]",
95
98
  className,
96
99
  )}
97
100
  toast-close=""
@@ -84,8 +84,8 @@ const ToastItem = ({
84
84
  className="h-4 w-4"
85
85
  buttonClassName={cn(
86
86
  "absolute right-8 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity",
87
- "hover:text-foreground focus:opacity-100 focus:outline-hidden group-hover:opacity-100",
88
- "group-[.destructive]:text-red-300 hover:group-[.destructive]:text-red-500 focus:group-[.destructive]:ring-red-400 focus:group-[.destructive]:ring-offset-red-600",
87
+ "hover:text-foreground focus:opacity-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 group-hover:opacity-100",
88
+ "group-[.destructive]:text-red-300 hover:group-[.destructive]:text-red-500 focus-visible:group-[.destructive]:ring-red-400 focus-visible:group-[.destructive]:ring-offset-red-600",
89
89
  )}
90
90
  value={() =>
91
91
  descriptionRef.current?.innerText ??
@@ -151,6 +151,34 @@
151
151
  }
152
152
  }
153
153
 
154
+ @media (prefers-reduced-motion: reduce) {
155
+ .marimo,
156
+ .marimo::before,
157
+ .marimo::after,
158
+ .marimo *,
159
+ .marimo *::before,
160
+ .marimo *::after {
161
+ scroll-behavior: auto !important;
162
+ animation-duration: 0.01ms !important;
163
+ animation-delay: 0s !important;
164
+ animation-iteration-count: 1 !important;
165
+ transition-duration: 0.01ms !important;
166
+ transition-delay: 0s !important;
167
+ }
168
+
169
+ .marimo .running-app-icon {
170
+ visibility: visible !important;
171
+ animation-name: none !important;
172
+ }
173
+ }
174
+
175
+ @media (forced-colors: active) {
176
+ .marimo :focus-visible {
177
+ outline: 2px solid Highlight !important;
178
+ outline-offset: 2px;
179
+ }
180
+ }
181
+
154
182
  @layer base {
155
183
  * {
156
184
  @apply border-border;