likec4 1.50.0 → 1.51.0

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.
@@ -5034,7 +5034,7 @@ function DriftsSummary() {
5034
5034
  onMouseLeave: onMouseLeaveDebounced,
5035
5035
  onClick
5036
5036
  }, { view, nodes, edges } = selected;
5037
- return view.length === 0 && nodes.length === 0 && edges.length === 0 ? null : /* @__PURE__ */ jsx(AnimatePresence, { propagate: !0, mode: "wait", children: /* @__PURE__ */ jsxs(
5037
+ return view.length === 0 && nodes.length === 0 && edges.length === 0 ? null : /* @__PURE__ */ jsx(AnimatePresence, { children: /* @__PURE__ */ jsxs(
5038
5038
  m$1.div,
5039
5039
  {
5040
5040
  layout: "size",
@@ -5053,16 +5053,16 @@ function DriftsSummary() {
5053
5053
  }),
5054
5054
  children: [
5055
5055
  t$1(view, 1) && /* @__PURE__ */ jsx(ViewDrifts, { drifts: view }),
5056
- nodes.length > 0 && /* @__PURE__ */ jsxs(m$1.div, { layout: "size", children: [
5056
+ nodes.length > 0 && /* @__PURE__ */ jsxs(m$1.div, { layout: !0, children: [
5057
5057
  /* @__PURE__ */ jsx(SectionHeader$2, { children: "Elements:" }),
5058
- /* @__PURE__ */ jsx(m$1.div, { layout: "size", className: vstack({ mt: "2", gap: "2" }), children: t$a(
5058
+ /* @__PURE__ */ jsx("div", { className: vstack({ mt: "2", gap: "2" }), children: t$a(
5059
5059
  nodes,
5060
5060
  (node2) => /* @__PURE__ */ jsx(NodeDrifts$1, { ...node2, ...handlers }, node2.id)
5061
5061
  ) })
5062
5062
  ] }, "nodes-drifts"),
5063
- edges.length > 0 && /* @__PURE__ */ jsxs(m$1.div, { layout: "size", children: [
5063
+ edges.length > 0 && /* @__PURE__ */ jsxs(m$1.div, { layout: !0, children: [
5064
5064
  /* @__PURE__ */ jsx(SectionHeader$2, { children: "Relationships:" }),
5065
- /* @__PURE__ */ jsx(m$1.div, { layout: "size", className: vstack({ mt: "2", gap: "2" }), children: t$a(edges, (edge) => /* @__PURE__ */ jsx(EdgeDrifts$1, { ...edge, ...handlers }, edge.edgeId)) })
5065
+ /* @__PURE__ */ jsx("div", { className: vstack({ mt: "2", gap: "2" }), children: t$a(edges, (edge) => /* @__PURE__ */ jsx(EdgeDrifts$1, { ...edge, ...handlers }, edge.edgeId)) })
5066
5066
  ] }, "edges-drifts")
5067
5067
  ]
5068
5068
  },
@@ -5086,6 +5086,7 @@ function ViewDrifts({ drifts }) {
5086
5086
  ) });
5087
5087
  }
5088
5088
  function NodeDrifts$1({ id, name, drifts, ...handlers }) {
5089
+ const key2 = `node-drifts-${id}`;
5089
5090
  return /* @__PURE__ */ jsxs(
5090
5091
  DriftsGroup,
5091
5092
  {
@@ -5111,28 +5112,29 @@ function NodeDrifts$1({ id, name, drifts, ...handlers }) {
5111
5112
  children: name
5112
5113
  }
5113
5114
  ),
5114
- t$a(drifts, (drift) => /* @__PURE__ */ jsx(DriftLabel, { children: drift }, id + drift))
5115
+ t$a(drifts, (drift, i) => /* @__PURE__ */ jsx(DriftLabel, { children: drift }, key2 + drift + i))
5115
5116
  ]
5116
5117
  },
5117
- `node-drifts-${id}`
5118
+ key2
5118
5119
  );
5119
5120
  }
5120
5121
  function EdgeDrifts$1({ edgeId, drifts, ...handlers }) {
5122
+ const key2 = `edge-drifts-${edgeId}`;
5121
5123
  return /* @__PURE__ */ jsx(
5122
5124
  DriftsGroup,
5123
5125
  {
5124
5126
  "data-drift-type": "edge",
5125
5127
  "data-drift-id": edgeId,
5126
5128
  ...handlers,
5127
- children: t$a(drifts, (drift) => /* @__PURE__ */ jsx(
5129
+ children: t$a(drifts, (drift, i) => /* @__PURE__ */ jsx(
5128
5130
  DriftLabel,
5129
5131
  {
5130
5132
  children: drift
5131
5133
  },
5132
- edgeId + drift
5134
+ key2 + drift + i
5133
5135
  ))
5134
5136
  },
5135
- `edge-drifts-${edgeId}`
5137
+ key2
5136
5138
  );
5137
5139
  }
5138
5140
  const DriftsGroup = styled(m$1.div, {
@@ -5153,7 +5155,7 @@ const DriftsGroup = styled(m$1.div, {
5153
5155
  defaultProps: {
5154
5156
  className: "group",
5155
5157
  variants: variants$7,
5156
- layout: "size",
5158
+ layout: !0,
5157
5159
  initial: "initial",
5158
5160
  animate: "animate",
5159
5161
  exit: "exit"
@@ -8014,17 +8016,9 @@ const selector$5 = (ctx) => {
8014
8016
  }
8015
8017
  ));
8016
8018
  function StartWalkthroughButton() {
8017
- const { enableReadOnly, enableCompareWithLatest } = useEnabledFeatures(), diagram = useDiagram(), actor = useNavigationActor();
8019
+ const { enableCompareWithLatest } = useEnabledFeatures(), diagram = useDiagram(), actor = useNavigationActor();
8018
8020
  let tooltipLabel = "Start Dynamic View Walkthrough";
8019
- switch (!0) {
8020
- case !enableReadOnly:
8021
- tooltipLabel = "Walkthrough not available in Edit mode";
8022
- break;
8023
- case enableCompareWithLatest:
8024
- tooltipLabel = "Walkthrough not available when Compare is active";
8025
- break;
8026
- }
8027
- return /* @__PURE__ */ jsx(Tooltip$6, { label: tooltipLabel, children: /* @__PURE__ */ jsx(
8021
+ return !0 === enableCompareWithLatest && (tooltipLabel = "Walkthrough not available when Compare is active"), /* @__PURE__ */ jsx(Tooltip$6, { label: tooltipLabel, children: /* @__PURE__ */ jsx(
8028
8022
  TriggerWalkthroughButton,
8029
8023
  {
8030
8024
  onClick: (e2) => {
@@ -8035,7 +8029,7 @@ function StartWalkthroughButton() {
8035
8029
  exit: { opacity: 0, translateX: -20 },
8036
8030
  size: "compact-xs",
8037
8031
  h: 26,
8038
- disabled: !enableReadOnly || enableCompareWithLatest,
8032
+ disabled: enableCompareWithLatest,
8039
8033
  classNames: {
8040
8034
  label: css({
8041
8035
  display: {
@@ -1,61 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { StrictMode } from "react";
3
3
  import { createRoot } from "react-dom/client";
4
- import { R as Routes } from "./routes/index.js";
5
- import { A as createTheme, T as Tooltip, P as Portal, S as SegmentedControl, M as MantineProvider } from "./vendors.js";
6
- const theme = createTheme({
7
- autoContrast: !0,
8
- primaryColor: "indigo",
9
- cursorType: "pointer",
10
- fontFamily: "var(--likec4-app-font)",
11
- headings: {
12
- fontWeight: "500",
13
- sizes: {
14
- h1: {
15
- // fontSize: '2rem',
16
- fontWeight: "600"
17
- },
18
- h2: {
19
- // fontSize: '1.85rem',
20
- }
21
- }
22
- },
23
- fontSizes: {
24
- xxs: "var(--font-sizes-xxs)",
25
- xs: "var(--font-sizes-xs)",
26
- sm: "var(--font-sizes-sm)",
27
- md: "var(--font-sizes-md)",
28
- lg: "var(--font-sizes-lg)",
29
- xl: "var(--font-sizes-xl)"
30
- },
31
- spacing: {
32
- xs: "var(--spacing-xs)",
33
- sm: "var(--spacing-sm)",
34
- md: "var(--spacing-md)",
35
- lg: "var(--spacing-lg)",
36
- xl: "var(--spacing-xl)"
37
- },
38
- components: {
39
- SegmentedControl: SegmentedControl.extend({
40
- vars: (theme2, props, ctx) => ({
41
- root: {
42
- // @ts-ignore
43
- "--sc-font-size": theme2.fontSizes[props.fz ?? props.size]
44
- }
45
- })
46
- }),
47
- Portal: Portal.extend({
48
- defaultProps: {
49
- reuseTargetNode: !0
50
- }
51
- }),
52
- Tooltip: Tooltip.extend({
53
- defaultProps: {
54
- color: "dark"
55
- }
56
- })
57
- }
58
- });
4
+ import { a as Routes } from "./routes/index.js";
59
5
  createRoot(document.getElementById("likec4-root")).render(
60
- /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsx(MantineProvider, { theme, defaultColorScheme: "auto", children: /* @__PURE__ */ jsx(Routes, {}) }) })
6
+ /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsx(Routes, {}) })
61
7
  );
@@ -1,10 +1,10 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { cY as useNavigate, bS as useCallbackRef, cZ as z, c_ as createRootRouteWithContext, a0 as t, c$ as stripSearchParams, d0 as Outlet, k as useMantineColorScheme, d1 as createFileRoute, d2 as redirect, d3 as useDocumentTitle, d4 as createRouter, d5 as createHashHistory, d6 as createBrowserHistory, d7 as RouterProvider } from "../vendors.js";
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cY as useNavigate, bS as useCallbackRef, cZ as z, A as createTheme, T as Tooltip, P as Portal, S as SegmentedControl, c_ as createRootRouteWithContext, a0 as t, c$ as stripSearchParams, M as MantineProvider, d0 as Outlet, d1 as createFileRoute, d2 as redirect, d3 as useDocumentTitle, d4 as createRouter, d5 as createHashHistory, d6 as createBrowserHistory, d7 as RouterProvider } from "../vendors.js";
3
3
  import { useLikeC4Projects, projects } from "likec4:projects";
4
4
  import { R as Route$3, a as Route$4, b as Route$5, c as Route$9, d as Route$a, e as Route$b, f as Route$c, g as Route$d, h as Route$h, i as Route$i, j as Route$j, k as Route$k, F as Fallback, N as NotFound } from "./single.js";
5
5
  import { pageTitle, useHashHistory, basepath } from "../const.js";
6
6
  import { L as LikeC4ProjectsProvider, B as Box } from "../likec4.js";
7
- import { useEffect, lazy } from "react";
7
+ import { lazy } from "react";
8
8
  import { R as Route$6, a as Route$7, b as Route$8, c as Route$e, d as Route$f, e as Route$g, f as Route$l, g as Route$m, h as Route$n, i as Route$o, j as Route$p } from "./projects.js";
9
9
  function LikeC4ProjectsContext({ children }) {
10
10
  const projects2 = useLikeC4Projects(), navigate = useNavigate(), onProjectChange = useCallbackRef((projectId) => {
@@ -20,17 +20,79 @@ function LikeC4ProjectsContext({ children }) {
20
20
  );
21
21
  }
22
22
  const searchParamsSchema = z.object({
23
- theme: z.literal(["light", "dark", "auto"]).default("auto").catch("auto"),
23
+ theme: z.literal(["light", "dark", "auto"]).optional().catch(void 0),
24
24
  dynamic: z.enum(["diagram", "sequence"]).default("diagram").catch("diagram"),
25
25
  padding: z.number().min(0).default(20).catch(20),
26
26
  relationships: z.string().nonempty().optional().catch(void 0).transform((v) => v)
27
+ });
28
+ function resolveForceColorScheme(theme2) {
29
+ switch (theme2) {
30
+ case "light":
31
+ case "dark":
32
+ return theme2;
33
+ default:
34
+ return;
35
+ }
36
+ }
37
+ const theme = createTheme({
38
+ autoContrast: !0,
39
+ primaryColor: "indigo",
40
+ cursorType: "pointer",
41
+ fontFamily: "var(--likec4-app-font)",
42
+ headings: {
43
+ fontWeight: "500",
44
+ sizes: {
45
+ h1: {
46
+ // fontSize: '2rem',
47
+ fontWeight: "600"
48
+ },
49
+ h2: {
50
+ // fontSize: '1.85rem',
51
+ }
52
+ }
53
+ },
54
+ fontSizes: {
55
+ xxs: "var(--font-sizes-xxs)",
56
+ xs: "var(--font-sizes-xs)",
57
+ sm: "var(--font-sizes-sm)",
58
+ md: "var(--font-sizes-md)",
59
+ lg: "var(--font-sizes-lg)",
60
+ xl: "var(--font-sizes-xl)"
61
+ },
62
+ spacing: {
63
+ xs: "var(--spacing-xs)",
64
+ sm: "var(--spacing-sm)",
65
+ md: "var(--spacing-md)",
66
+ lg: "var(--spacing-lg)",
67
+ xl: "var(--spacing-xl)"
68
+ },
69
+ components: {
70
+ SegmentedControl: SegmentedControl.extend({
71
+ vars: (theme2, props, ctx) => ({
72
+ root: {
73
+ // @ts-ignore
74
+ "--sc-font-size": theme2.fontSizes[props.fz ?? props.size]
75
+ }
76
+ })
77
+ }),
78
+ Portal: Portal.extend({
79
+ defaultProps: {
80
+ reuseTargetNode: !0
81
+ }
82
+ }),
83
+ Tooltip: Tooltip.extend({
84
+ defaultProps: {
85
+ color: "dark"
86
+ }
87
+ })
88
+ }
27
89
  }), Route$2 = createRootRouteWithContext()({
28
90
  validateSearch: searchParamsSchema,
29
91
  search: {
30
92
  middlewares: [
31
93
  stripSearchParams({
32
94
  padding: 20,
33
- theme: "auto",
95
+ theme: void 0,
34
96
  dynamic: "diagram",
35
97
  relationships: void 0
36
98
  })
@@ -46,17 +108,18 @@ const searchParamsSchema = z.object({
46
108
  component: RootComponent
47
109
  });
48
110
  function RootComponent() {
49
- return /* @__PURE__ */ jsxs(Fragment, { children: [
50
- /* @__PURE__ */ jsx(Outlet, {}),
51
- /* @__PURE__ */ jsx(ThemeSync, {})
52
- ] });
111
+ const { theme: theme$1 } = Route$2.useSearch(), forceColorScheme = resolveForceColorScheme(theme$1);
112
+ return /* @__PURE__ */ jsx(
113
+ MantineProvider,
114
+ {
115
+ theme,
116
+ defaultColorScheme: "auto",
117
+ ...forceColorScheme && { forceColorScheme },
118
+ children: /* @__PURE__ */ jsx(Outlet, {})
119
+ }
120
+ );
53
121
  }
54
- const ThemeSync = () => {
55
- const { theme } = Route$2.useSearch(), mantineColorScheme = useMantineColorScheme();
56
- return useEffect(() => {
57
- theme && mantineColorScheme.setColorScheme(theme);
58
- }, [theme]), null;
59
- }, ProjectsOverviewPage = lazy(async () => {
122
+ const ProjectsOverviewPage = lazy(async () => {
60
123
  const { ProjectsOverviewPage: ProjectsOverviewPage2 } = await import("../ProjectsOverview.js");
61
124
  return {
62
125
  default: ProjectsOverviewPage2
@@ -246,5 +309,7 @@ function Routes() {
246
309
  return /* @__PURE__ */ jsx(RouterProvider, { router });
247
310
  }
248
311
  export {
249
- Routes as R
312
+ Route$2 as R,
313
+ Routes as a,
314
+ resolveForceColorScheme as r
250
315
  };
@@ -1,13 +1,14 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { d8 as useRouter, d9 as useParams, da as isNotFound, db as Container, br as Alert, U as Text, dc as Code, W as Button, dd as e, de as e$1, as as e$2, bt as Group, bh as rem, df as Link, bZ as Title, d1 as createFileRoute, Q as m, d0 as Outlet, d as deepEqual, s as shallowEqual, dg as useMatches, dh as useIsomorphicLayoutEffect, d3 as useDocumentTitle, di as SimpleGrid, dj as useInViewport, dk as e$3, ci as Card, aQ as Box, d2 as redirect, k as useMantineColorScheme, dl as useComputedColorScheme, aA as ActionIcon, aF as MotionDiv, cN as isValidMotionProp, aD as Menu, bc as MenuTarget, bd as MenuDropdown, be as MenuItem, dm as MenuDivider, bp as Stack, b5 as CopyButton$1, dn as Select, dp as ModalRoot, dq as ModalOverlay, dr as ModalContent, ds as ModalBody, bL as Tabs, bM as TabsList, bN as TabsTab, bO as TabsPanel, dt as useMantineTheme, du as useMediaQuery, cq as useDisclosure, aG as Divider, dv as MenuLabel, dw as useSearch, dx as LoadingOverlay, dy as toBlob, c$ as stripSearchParams, cZ as z, cY as useNavigate, bS as useCallbackRef, aL as useIsMounted, T as Tooltip, dz as useAsync, dA as Tt, dB as _t, bP as ScrollArea, dC as Ht, dD as notFound } from "../vendors.js";
2
+ import { d8 as useRouter, d9 as useParams, da as isNotFound, db as Container, br as Alert, U as Text, dc as Code, W as Button, dd as e, de as e$1, as as e$2, bt as Group, bh as rem, df as Link, bZ as Title, d1 as createFileRoute, Q as m, d0 as Outlet, d as deepEqual, s as shallowEqual, dg as useMatches, dh as useIsomorphicLayoutEffect, d3 as useDocumentTitle, di as SimpleGrid, dj as useInViewport, dk as e$3, ci as Card, aQ as Box, d2 as redirect, k as useMantineColorScheme, dl as useComputedColorScheme, cY as useNavigate, aA as ActionIcon, aF as MotionDiv, cN as isValidMotionProp, aD as Menu, bc as MenuTarget, bd as MenuDropdown, be as MenuItem, dm as MenuDivider, bp as Stack, b5 as CopyButton$1, dn as Select, dp as ModalRoot, dq as ModalOverlay, dr as ModalContent, ds as ModalBody, bL as Tabs, bM as TabsList, bN as TabsTab, bO as TabsPanel, dt as useMantineTheme, du as useMediaQuery, cq as useDisclosure, aG as Divider, dv as MenuLabel, dw as useSearch, dx as LoadingOverlay, dy as toBlob, c$ as stripSearchParams, cZ as z, bS as useCallbackRef, aL as useIsMounted, T as Tooltip, dz as useAsync, dA as Tt, dB as _t, bP as ScrollArea, dC as Ht, dD as notFound } from "../vendors.js";
3
3
  import { loadModel } from "likec4:model";
4
4
  import { c as css, s as styled, I as IconRendererProvider, a as LikeC4ModelProvider, u as useUpdateEffect, S as StaticLikeC4Diagram, M as Markdown, b as LikeC4AdHocViewEditor, B as Box$1, d as IconMoonStars, e as IconSun, f as createStyleContext, n as navigationPanel, i as isCssProperty, g as useLikeC4Projects$1, h as IconChevronDown, j as IconAlertTriangle, k as IconCheck, l as IconCopy, m as IconExternalLink, o as IconShare, p as pickViewBounds, q as LikeC4Diagram, r as useLikeC4Model, t as useDiagramContext, v as useDiagram, w as useOnDiagramEvent, x as LikeC4EditorProvider } from "../likec4.js";
5
5
  import { getProjectIcons } from "likec4:icons";
6
- import { useMemo, createContext, useContext, useState, useEffect, memo, useCallback, useRef } from "react";
6
+ import { useMemo, createContext, useContext, useState, useEffect, useRef, memo, useCallback } from "react";
7
7
  import { useStore } from "likec4/vite-plugin/internal";
8
8
  import { RichText } from "@likec4/core/types";
9
9
  import { pageTitle, ComponentName, useHashHistory, isDevelopment, krokiPumlSvgUrl, krokiD2SvgUrl } from "../const.js";
10
10
  import { likec4rpc, isRpcAvailable } from "likec4:rpc";
11
+ import { R as Route$c, r as resolveForceColorScheme } from "./index.js";
11
12
  import { useLikeC4Projects } from "likec4:projects";
12
13
  function Fallback({ error: _error, resetErrorBoundary }) {
13
14
  const router = useRouter(), params = useParams({
@@ -438,15 +439,27 @@ function WebcomponentPage() {
438
439
  function ColorSchemeToggle() {
439
440
  const { setColorScheme } = useMantineColorScheme({
440
441
  keepTransitions: !0
441
- }), computedColorScheme = useComputedColorScheme("light");
442
- return /* @__PURE__ */ jsxs(
442
+ }), computedColorScheme = useComputedColorScheme("light"), navigate = useNavigate(), { theme: urlTheme } = Route$c.useSearch(), isForced = resolveForceColorScheme(urlTheme) != null, pendingScheme = useRef(null);
443
+ return useEffect(() => {
444
+ pendingScheme.current != null && !isForced && (setColorScheme(pendingScheme.current), pendingScheme.current = null);
445
+ }, [isForced, setColorScheme]), /* @__PURE__ */ jsxs(
443
446
  ActionIcon,
444
447
  {
445
448
  visibleFrom: "sm",
446
449
  size: "md",
447
450
  variant: "subtle",
448
451
  color: "gray",
449
- onClick: () => setColorScheme(computedColorScheme === "light" ? "dark" : "light"),
452
+ onClick: () => {
453
+ if (pendingScheme.current != null) return;
454
+ const next = computedColorScheme === "light" ? "dark" : "light";
455
+ isForced ? (pendingScheme.current = next, navigate({
456
+ from: Route$c.fullPath,
457
+ search: (prev) => ({ ...prev, theme: void 0 }),
458
+ replace: !0
459
+ }).catch(() => {
460
+ pendingScheme.current = null;
461
+ })) : setColorScheme(next);
462
+ },
450
463
  "aria-label": "Toggle color scheme",
451
464
  children: [
452
465
  /* @__PURE__ */ jsx(IconMoonStars, { stroke: 1.5, display: computedColorScheme === "light" ? "block" : "none" }),