@almadar/ui 4.33.0 → 4.35.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.
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ export interface BranchingQuestion {
3
+ id: string;
4
+ label: string;
5
+ optionValues?: string[];
6
+ }
7
+ export type BranchingOperator = 'equals' | 'not-equals' | 'contains' | 'in';
8
+ export declare const END_OF_SURVEY = "end-of-survey";
9
+ export interface BranchingRule {
10
+ id: string;
11
+ sourceQuestionId: string;
12
+ operator: BranchingOperator;
13
+ value: string | string[];
14
+ targetQuestionId: string | typeof END_OF_SURVEY;
15
+ }
16
+ export interface BranchingLogicBuilderProps {
17
+ questions: BranchingQuestion[];
18
+ rules: BranchingRule[];
19
+ onRulesChange?: (rules: BranchingRule[]) => void;
20
+ readOnly?: boolean;
21
+ className?: string;
22
+ }
23
+ export declare const BranchingLogicBuilder: React.FC<BranchingLogicBuilderProps>;
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ export type LikertScaleSize = "sm" | "md" | "lg";
3
+ export type LikertScaleVariant = "radios" | "buttons";
4
+ export interface LikertOption {
5
+ /** Underlying value bound to the option */
6
+ value: number | string;
7
+ /** Visible label below (radios) or inside (buttons) the control */
8
+ label: string;
9
+ }
10
+ export interface LikertScaleProps {
11
+ /** Optional row prompt above the scale */
12
+ question?: string;
13
+ /** Scale points (defaults to a 5-point agree/disagree set) */
14
+ options?: LikertOption[];
15
+ /** Selected value (controlled) */
16
+ value?: number | string | null;
17
+ /** Change callback */
18
+ onChange?: (value: number | string) => void;
19
+ /** Disabled state */
20
+ disabled?: boolean;
21
+ /** Size variant */
22
+ size?: LikertScaleSize;
23
+ /** Visual variant: classic radios or pill segmented buttons */
24
+ variant?: LikertScaleVariant;
25
+ /** Additional CSS classes */
26
+ className?: string;
27
+ }
28
+ export declare const DEFAULT_LIKERT_OPTIONS: LikertOption[];
29
+ export declare const LikertScale: React.ForwardRefExoticComponent<LikertScaleProps & React.RefAttributes<HTMLDivElement>>;
@@ -11,9 +11,31 @@ export interface MapMarkerData {
11
11
  /** Optional category for styling */
12
12
  category?: string;
13
13
  }
14
+ export interface MapRouteWaypoint {
15
+ lat: number;
16
+ lng: number;
17
+ }
18
+ export interface MapRouteData {
19
+ /** Unique route identifier */
20
+ id: string | number;
21
+ /** Ordered waypoints rendered as a polyline */
22
+ waypoints: MapRouteWaypoint[];
23
+ /** Stroke color (CSS color). Defaults to a theme-aware accent. */
24
+ color?: string;
25
+ /** Stroke weight in pixels (default 4) */
26
+ weight?: number;
27
+ /** Stroke opacity 0..1 (default 0.8) */
28
+ opacity?: number;
29
+ /** Optional dashed pattern (e.g. "8 4") */
30
+ dashArray?: string;
31
+ /** Label shown in a popup at the midpoint */
32
+ label?: string;
33
+ }
14
34
  export interface MapViewProps {
15
35
  /** Array of markers to display */
16
36
  markers?: MapMarkerData[];
37
+ /** Routes (polylines with optional popups) drawn over the tile layer */
38
+ routes?: MapRouteData[];
17
39
  /** Map center latitude */
18
40
  centerLat?: number;
19
41
  /** Map center longitude */
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ export interface MatrixRow {
3
+ id: string;
4
+ label: string;
5
+ }
6
+ export interface MatrixColumn {
7
+ value: number | string;
8
+ label: string;
9
+ }
10
+ export interface MatrixQuestionProps {
11
+ /** Optional title rendered above the matrix */
12
+ title?: string;
13
+ /** Question rows */
14
+ rows: MatrixRow[];
15
+ /** Column definitions; defaults to 5-point Likert */
16
+ columns?: MatrixColumn[];
17
+ /** Selected value per row, keyed by rowId */
18
+ values?: Record<string, number | string>;
19
+ /** Change handler invoked with rowId and selected column value */
20
+ onChange?: (rowId: string, value: number | string) => void;
21
+ /** Disable all inputs */
22
+ disabled?: boolean;
23
+ /** Visual size */
24
+ size?: 'sm' | 'md';
25
+ /** Additional CSS classes */
26
+ className?: string;
27
+ }
28
+ export declare const DEFAULT_MATRIX_COLUMNS: MatrixColumn[];
29
+ export declare const MatrixQuestion: React.FC<MatrixQuestionProps>;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * OptionConstraintGroup Molecule Component
3
+ *
4
+ * Generic constrained option selector (radio for "single", checkbox for "multi") with required/optional/multi
5
+ * constraints. Renders radio inputs for `single` constraint and checkboxes for
6
+ * `multi`. Reports validation errors inline when the current selection
7
+ * violates the constraint.
8
+ *
9
+ * **Atomic Design**: Composed using Typography atom and native form controls.
10
+ */
11
+ import React from 'react';
12
+ export interface OptionConstraintOption {
13
+ id: string;
14
+ label: string;
15
+ priceDelta?: number;
16
+ disabled?: boolean;
17
+ outOfStock?: boolean;
18
+ }
19
+ export type OptionConstraint = {
20
+ type: 'single';
21
+ required?: boolean;
22
+ } | {
23
+ type: 'multi';
24
+ min?: number;
25
+ max?: number;
26
+ };
27
+ export interface OptionConstraintGroupProps {
28
+ groupId: string;
29
+ title: string;
30
+ description?: string;
31
+ options: OptionConstraintOption[];
32
+ constraint: OptionConstraint;
33
+ selected?: string[];
34
+ onChange?: (selected: string[]) => void;
35
+ size?: 'sm' | 'md';
36
+ className?: string;
37
+ }
38
+ export declare const OptionConstraintGroup: React.FC<OptionConstraintGroupProps>;
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+ import type { EventPayloadValue } from "@almadar/core";
3
+ export type CanvasItemStatus = 'empty' | 'seated' | 'ordered' | 'awaiting-bill' | 'cleaning';
4
+ export type CanvasItemShape = 'round' | 'rectangle' | 'square';
5
+ export interface CanvasItem {
6
+ id: string;
7
+ label: string;
8
+ x: number;
9
+ y: number;
10
+ shape?: CanvasItemShape;
11
+ capacity: number;
12
+ status?: CanvasItemStatus;
13
+ partySize?: number;
14
+ serverName?: string;
15
+ }
16
+ export interface PositionedCanvasProps {
17
+ /**
18
+ * Items to render. Accepts either a typed array (direct consumers) or the
19
+ * runtime payload shape from a render-ui binding (`@payload.data`). The
20
+ * molecule narrows non-array values to `[]` and validates element shape at
21
+ * render time via the `id` / `x` / `y` guards.
22
+ */
23
+ items: readonly CanvasItem[] | EventPayloadValue;
24
+ width?: number;
25
+ height?: number;
26
+ selectedId?: string | null;
27
+ editable?: boolean;
28
+ onSelect?: (id: string | null) => void;
29
+ onMove?: (id: string, x: number, y: number) => void;
30
+ className?: string;
31
+ }
32
+ export declare const PositionedCanvas: React.FC<PositionedCanvasProps>;
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ export interface QrScanResult {
3
+ text: string;
4
+ format: string;
5
+ timestamp: number;
6
+ }
7
+ export interface QrScannerProps {
8
+ onScan?: (result: QrScanResult) => void;
9
+ onError?: (error: Error) => void;
10
+ facingMode?: 'environment' | 'user';
11
+ paused?: boolean;
12
+ showOverlay?: boolean;
13
+ showCameraControls?: boolean;
14
+ fallback?: React.ReactNode;
15
+ className?: string;
16
+ }
17
+ export declare const QrScanner: React.FC<QrScannerProps>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * ReplyTree Organism Component
3
+ *
4
+ * Recursive nested-thread reply renderer with collapse, per-node mod actions, and vote.
5
+ * Composes the VoteStack molecule + Avatar/Typography/Button atoms.
6
+ */
7
+ import React from "react";
8
+ export interface ReplyNode {
9
+ id: string;
10
+ authorName: string;
11
+ authorAvatarUrl?: string;
12
+ content: string;
13
+ postedAt: string;
14
+ voteCount?: number;
15
+ userVote?: 'up' | 'down' | null;
16
+ replies?: ReplyNode[];
17
+ collapsed?: boolean;
18
+ }
19
+ export interface ReplyTreeProps {
20
+ nodes: ReplyNode[];
21
+ maxDepth?: number;
22
+ onVote?: (nodeId: string, vote: 'up' | 'down' | null) => void;
23
+ onReply?: (parentNodeId: string) => void;
24
+ onFlag?: (nodeId: string) => void;
25
+ onContinueThread?: (nodeId: string) => void;
26
+ showActions?: boolean;
27
+ className?: string;
28
+ }
29
+ export declare const ReplyTree: React.FC<ReplyTreeProps>;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * RichBlockEditor Organism Component
3
+ *
4
+ * Notion / Lexical-style block authoring editor. Internal state owns the
5
+ * block tree; contentEditable spans flow updates back through onInput.
6
+ *
7
+ * TODO(phase-11): collaboration / undo-redo / markdown export are out of
8
+ * scope for the Phase 10 scaffold.
9
+ */
10
+ import React from "react";
11
+ export type BlockType = "paragraph" | "heading-1" | "heading-2" | "heading-3" | "bullet-list" | "numbered-list" | "quote" | "code" | "divider" | "image";
12
+ export interface RichBlock {
13
+ id: string;
14
+ type: BlockType;
15
+ content?: string;
16
+ metadata?: Record<string, string | number | boolean>;
17
+ children?: RichBlock[];
18
+ }
19
+ export interface RichBlockEditorProps {
20
+ initialBlocks?: RichBlock[];
21
+ onChange?: (blocks: RichBlock[]) => void;
22
+ readOnly?: boolean;
23
+ placeholder?: string;
24
+ showToolbar?: boolean;
25
+ className?: string;
26
+ }
27
+ export declare const RichBlockEditor: React.FC<RichBlockEditorProps>;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * VersionDiff Organism Component
3
+ *
4
+ * Side-by-side or inline diff render with line-level highlights and
5
+ * a revision picker. Composes atoms for layout. Computes a minimal
6
+ * LCS-based line diff inline (no external diff library).
7
+ */
8
+ import React from "react";
9
+ export interface DiffRevision {
10
+ id: string;
11
+ label: string;
12
+ author?: string;
13
+ timestamp?: string;
14
+ content: string;
15
+ }
16
+ export type DiffLineType = "added" | "removed" | "unchanged" | "context";
17
+ export interface DiffLine {
18
+ type: DiffLineType;
19
+ beforeLineNumber?: number;
20
+ afterLineNumber?: number;
21
+ content: string;
22
+ }
23
+ export type VersionDiffView = "side-by-side" | "inline";
24
+ export interface VersionDiffProps {
25
+ /** All available revisions (at least 2). */
26
+ revisions: DiffRevision[];
27
+ /** Currently selected "before" revision id. */
28
+ beforeId?: string;
29
+ /** Currently selected "after" revision id. */
30
+ afterId?: string;
31
+ /** Display mode. */
32
+ view?: VersionDiffView;
33
+ /** Called when the user picks a different "before" revision. */
34
+ onSelectBefore?: (id: string) => void;
35
+ /** Called when the user picks a different "after" revision. */
36
+ onSelectAfter?: (id: string) => void;
37
+ /** Called when the user clicks the revert button (passes the "before" id). */
38
+ onRevert?: (id: string) => void;
39
+ /** Language label (informational). */
40
+ language?: string;
41
+ /** Additional CSS classes. */
42
+ className?: string;
43
+ }
44
+ export declare const VersionDiff: React.FC<VersionDiffProps>;
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ export type VoteStackSize = "sm" | "md" | "lg";
3
+ export type VoteStackVariant = "vertical" | "horizontal";
4
+ export type VoteValue = "up" | "down" | null;
5
+ export interface VoteStackProps {
6
+ /** Current tally */
7
+ count: number;
8
+ /** Current user's vote (null = no vote cast) */
9
+ userVote?: VoteValue;
10
+ /** Toggle handler. Clicking the same arrow clears (emits null). */
11
+ onVote?: (next: VoteValue) => void;
12
+ /** Disabled state */
13
+ disabled?: boolean;
14
+ /** Size variant */
15
+ size?: VoteStackSize;
16
+ /** Layout orientation. `vertical` = forum/Q&A column; `horizontal` = compact row. */
17
+ variant?: VoteStackVariant;
18
+ /** Additional CSS classes */
19
+ className?: string;
20
+ /** Accessible label for the group */
21
+ label?: string;
22
+ }
23
+ export declare const VoteStack: React.FC<VoteStackProps>;
@@ -45,7 +45,7 @@ export { LineChart, type LineChartProps, type ChartDataPoint } from './LineChart
45
45
  export { ProgressDots, type ProgressDotsProps, type DotState, type DotSize } from './ProgressDots';
46
46
  export * from './game';
47
47
  export { GraphView, type GraphViewProps, type GraphViewNode, type GraphViewEdge } from './GraphView';
48
- export { MapView, type MapViewProps, type MapMarkerData } from './MapView';
48
+ export { MapView, type MapViewProps, type MapMarkerData, type MapRouteData, type MapRouteWaypoint } from './MapView';
49
49
  export { NumberStepper, type NumberStepperProps, type NumberStepperSize } from './NumberStepper';
50
50
  export { StarRating, type StarRatingProps, type StarRatingSize, type StarRatingPrecision } from './StarRating';
51
51
  export { UploadDropZone, type UploadDropZoneProps } from './UploadDropZone';
@@ -79,3 +79,13 @@ export { TeamCard, type TeamCardProps } from './TeamCard';
79
79
  export { ShowcaseCard, type ShowcaseCardProps } from './ShowcaseCard';
80
80
  export { GeometricPattern, type GeometricPatternProps } from './GeometricPattern';
81
81
  export { EdgeDecoration, type EdgeDecorationProps, type EdgeVariant, type EdgeSide } from './EdgeDecoration';
82
+ export { VoteStack, type VoteStackProps } from './VoteStack';
83
+ export { LikertScale, type LikertScaleProps, type LikertOption, DEFAULT_LIKERT_OPTIONS } from './LikertScale';
84
+ export { MatrixQuestion, type MatrixQuestionProps, type MatrixRow, type MatrixColumn, DEFAULT_MATRIX_COLUMNS } from './MatrixQuestion';
85
+ export { QrScanner, type QrScannerProps, type QrScanResult } from './QrScanner';
86
+ export { OptionConstraintGroup, type OptionConstraintGroupProps, type OptionConstraintOption, type OptionConstraint } from './OptionConstraintGroup';
87
+ export { PositionedCanvas, type PositionedCanvasProps, type CanvasItem, type CanvasItemStatus, type CanvasItemShape } from './PositionedCanvas';
88
+ export { RichBlockEditor, type RichBlockEditorProps, type RichBlock, type BlockType } from './RichBlockEditor';
89
+ export { ReplyTree, type ReplyTreeProps, type ReplyNode } from './ReplyTree';
90
+ export { BranchingLogicBuilder, type BranchingLogicBuilderProps, type BranchingQuestion, type BranchingRule } from './BranchingLogicBuilder';
91
+ export { VersionDiff, type VersionDiffProps, type DiffRevision, type DiffLine as VersionDiffLine, type DiffLineType } from './VersionDiff';
@@ -27,7 +27,7 @@ function _interopNamespace(e) {
27
27
  var React5__default = /*#__PURE__*/_interopDefault(React5);
28
28
  var LucideIcons__namespace = /*#__PURE__*/_interopNamespace(LucideIcons);
29
29
 
30
- // node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
30
+ // node_modules/clsx/dist/clsx.mjs
31
31
  function r(e) {
32
32
  var t, f, n = "";
33
33
  if ("string" == typeof e || "number" == typeof e) n += e;
@@ -42,7 +42,7 @@ function clsx() {
42
42
  return n;
43
43
  }
44
44
 
45
- // node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/dist/bundle-mjs.mjs
45
+ // node_modules/tailwind-merge/dist/bundle-mjs.mjs
46
46
  var CLASS_PART_SEPARATOR = "-";
47
47
  var createClassGroupUtils = (config) => {
48
48
  const classMap = createClassMap(config);
@@ -3,7 +3,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
3
3
  import * as LucideIcons from 'lucide-react';
4
4
  import { Loader2, ChevronDown, X } from 'lucide-react';
5
5
 
6
- // node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
6
+ // node_modules/clsx/dist/clsx.mjs
7
7
  function r(e) {
8
8
  var t, f, n = "";
9
9
  if ("string" == typeof e || "number" == typeof e) n += e;
@@ -18,7 +18,7 @@ function clsx() {
18
18
  return n;
19
19
  }
20
20
 
21
- // node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/dist/bundle-mjs.mjs
21
+ // node_modules/tailwind-merge/dist/bundle-mjs.mjs
22
22
  var CLASS_PART_SEPARATOR = "-";
23
23
  var createClassGroupUtils = (config) => {
24
24
  const classMap = createClassMap(config);
@@ -27,7 +27,7 @@ function _interopNamespace(e) {
27
27
  var React6__default = /*#__PURE__*/_interopDefault(React6);
28
28
  var LucideIcons__namespace = /*#__PURE__*/_interopNamespace(LucideIcons);
29
29
 
30
- // node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
30
+ // node_modules/clsx/dist/clsx.mjs
31
31
  function r(e) {
32
32
  var t, f3, n = "";
33
33
  if ("string" == typeof e || "number" == typeof e) n += e;
@@ -42,7 +42,7 @@ function clsx() {
42
42
  return n;
43
43
  }
44
44
 
45
- // node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/dist/bundle-mjs.mjs
45
+ // node_modules/tailwind-merge/dist/bundle-mjs.mjs
46
46
  var CLASS_PART_SEPARATOR = "-";
47
47
  var createClassGroupUtils = (config) => {
48
48
  const classMap = createClassMap(config);
@@ -3,7 +3,7 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
3
  import * as LucideIcons from 'lucide-react';
4
4
  import { Loader2, Check, User } from 'lucide-react';
5
5
 
6
- // node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
6
+ // node_modules/clsx/dist/clsx.mjs
7
7
  function r(e) {
8
8
  var t, f3, n = "";
9
9
  if ("string" == typeof e || "number" == typeof e) n += e;
@@ -18,7 +18,7 @@ function clsx() {
18
18
  return n;
19
19
  }
20
20
 
21
- // node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/dist/bundle-mjs.mjs
21
+ // node_modules/tailwind-merge/dist/bundle-mjs.mjs
22
22
  var CLASS_PART_SEPARATOR = "-";
23
23
  var createClassGroupUtils = (config) => {
24
24
  const classMap = createClassMap(config);
@@ -7002,7 +7002,7 @@ var init_MapView = __esm({
7002
7002
  import('leaflet')
7003
7003
  ]);
7004
7004
  await import('leaflet/dist/leaflet.css');
7005
- const { MapContainer, TileLayer, Marker, Popup, useMap } = reactLeaflet;
7005
+ const { MapContainer, TileLayer, Marker, Polyline, Popup, useMap } = reactLeaflet;
7006
7006
  const L = leafletMod.default;
7007
7007
  const defaultIcon = L.icon({
7008
7008
  iconUrl: "https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png",
@@ -7045,6 +7045,7 @@ var init_MapView = __esm({
7045
7045
  }
7046
7046
  function MapViewInner({
7047
7047
  markers = [],
7048
+ routes = [],
7048
7049
  centerLat = 51.505,
7049
7050
  centerLng = -0.09,
7050
7051
  zoom = 13,
@@ -7113,6 +7114,20 @@ var init_MapView = __esm({
7113
7114
  ] }) : null
7114
7115
  },
7115
7116
  marker.id
7117
+ )),
7118
+ routes.map((route) => /* @__PURE__ */ jsxRuntime.jsx(
7119
+ Polyline,
7120
+ {
7121
+ positions: route.waypoints.map((wp) => [wp.lat, wp.lng]),
7122
+ pathOptions: {
7123
+ color: route.color ?? "var(--primary, #2563eb)",
7124
+ weight: route.weight ?? 4,
7125
+ opacity: route.opacity ?? 0.8,
7126
+ dashArray: route.dashArray
7127
+ },
7128
+ children: route.label ? /* @__PURE__ */ jsxRuntime.jsx(Popup, { children: /* @__PURE__ */ jsxRuntime.jsx(Typography2, { variant: "body2", children: route.label }) }) : null
7129
+ },
7130
+ route.id
7116
7131
  ))
7117
7132
  ]
7118
7133
  },
@@ -9595,9 +9610,9 @@ var init_ScaledDiagram = __esm({
9595
9610
  }
9596
9611
  });
9597
9612
 
9598
- // node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css
9613
+ // node_modules/katex/dist/katex.min.css
9599
9614
  var init_katex_min = __esm({
9600
- "node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css"() {
9615
+ "node_modules/katex/dist/katex.min.css"() {
9601
9616
  }
9602
9617
  });
9603
9618
  var MarkdownContent;
@@ -1,4 +1,4 @@
1
- /* node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css */
1
+ /* node_modules/katex/dist/katex.min.css */
2
2
  @font-face {
3
3
  font-display: block;
4
4
  font-family: KaTeX_AMS;
@@ -6957,7 +6957,7 @@ var init_MapView = __esm({
6957
6957
  import('leaflet')
6958
6958
  ]);
6959
6959
  await import('leaflet/dist/leaflet.css');
6960
- const { MapContainer, TileLayer, Marker, Popup, useMap } = reactLeaflet;
6960
+ const { MapContainer, TileLayer, Marker, Polyline, Popup, useMap } = reactLeaflet;
6961
6961
  const L = leafletMod.default;
6962
6962
  const defaultIcon = L.icon({
6963
6963
  iconUrl: "https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png",
@@ -7000,6 +7000,7 @@ var init_MapView = __esm({
7000
7000
  }
7001
7001
  function MapViewInner({
7002
7002
  markers = [],
7003
+ routes = [],
7003
7004
  centerLat = 51.505,
7004
7005
  centerLng = -0.09,
7005
7006
  zoom = 13,
@@ -7068,6 +7069,20 @@ var init_MapView = __esm({
7068
7069
  ] }) : null
7069
7070
  },
7070
7071
  marker.id
7072
+ )),
7073
+ routes.map((route) => /* @__PURE__ */ jsx(
7074
+ Polyline,
7075
+ {
7076
+ positions: route.waypoints.map((wp) => [wp.lat, wp.lng]),
7077
+ pathOptions: {
7078
+ color: route.color ?? "var(--primary, #2563eb)",
7079
+ weight: route.weight ?? 4,
7080
+ opacity: route.opacity ?? 0.8,
7081
+ dashArray: route.dashArray
7082
+ },
7083
+ children: route.label ? /* @__PURE__ */ jsx(Popup, { children: /* @__PURE__ */ jsx(Typography2, { variant: "body2", children: route.label }) }) : null
7084
+ },
7085
+ route.id
7071
7086
  ))
7072
7087
  ]
7073
7088
  },
@@ -9550,9 +9565,9 @@ var init_ScaledDiagram = __esm({
9550
9565
  }
9551
9566
  });
9552
9567
 
9553
- // node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css
9568
+ // node_modules/katex/dist/katex.min.css
9554
9569
  var init_katex_min = __esm({
9555
- "node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css"() {
9570
+ "node_modules/katex/dist/katex.min.css"() {
9556
9571
  }
9557
9572
  });
9558
9573
  var MarkdownContent;
@@ -6890,7 +6890,7 @@ var init_MapView = __esm({
6890
6890
  import('leaflet')
6891
6891
  ]);
6892
6892
  await import('leaflet/dist/leaflet.css');
6893
- const { MapContainer, TileLayer, Marker, Popup, useMap } = reactLeaflet;
6893
+ const { MapContainer, TileLayer, Marker, Polyline, Popup, useMap } = reactLeaflet;
6894
6894
  const L = leafletMod.default;
6895
6895
  const defaultIcon = L.icon({
6896
6896
  iconUrl: "https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png",
@@ -6933,6 +6933,7 @@ var init_MapView = __esm({
6933
6933
  }
6934
6934
  function MapViewInner({
6935
6935
  markers = [],
6936
+ routes = [],
6936
6937
  centerLat = 51.505,
6937
6938
  centerLng = -0.09,
6938
6939
  zoom = 13,
@@ -7001,6 +7002,20 @@ var init_MapView = __esm({
7001
7002
  ] }) : null
7002
7003
  },
7003
7004
  marker.id
7005
+ )),
7006
+ routes.map((route) => /* @__PURE__ */ jsxRuntime.jsx(
7007
+ Polyline,
7008
+ {
7009
+ positions: route.waypoints.map((wp) => [wp.lat, wp.lng]),
7010
+ pathOptions: {
7011
+ color: route.color ?? "var(--primary, #2563eb)",
7012
+ weight: route.weight ?? 4,
7013
+ opacity: route.opacity ?? 0.8,
7014
+ dashArray: route.dashArray
7015
+ },
7016
+ children: route.label ? /* @__PURE__ */ jsxRuntime.jsx(Popup, { children: /* @__PURE__ */ jsxRuntime.jsx(Typography2, { variant: "body2", children: route.label }) }) : null
7017
+ },
7018
+ route.id
7004
7019
  ))
7005
7020
  ]
7006
7021
  },
@@ -9495,9 +9510,9 @@ var init_ScaledDiagram = __esm({
9495
9510
  }
9496
9511
  });
9497
9512
 
9498
- // node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css
9513
+ // node_modules/katex/dist/katex.min.css
9499
9514
  var init_katex_min = __esm({
9500
- "node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css"() {
9515
+ "node_modules/katex/dist/katex.min.css"() {
9501
9516
  }
9502
9517
  });
9503
9518
  var MarkdownContent;
@@ -1,4 +1,4 @@
1
- /* node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css */
1
+ /* node_modules/katex/dist/katex.min.css */
2
2
  @font-face {
3
3
  font-display: block;
4
4
  font-family: KaTeX_AMS;
@@ -6845,7 +6845,7 @@ var init_MapView = __esm({
6845
6845
  import('leaflet')
6846
6846
  ]);
6847
6847
  await import('leaflet/dist/leaflet.css');
6848
- const { MapContainer, TileLayer, Marker, Popup, useMap } = reactLeaflet;
6848
+ const { MapContainer, TileLayer, Marker, Polyline, Popup, useMap } = reactLeaflet;
6849
6849
  const L = leafletMod.default;
6850
6850
  const defaultIcon = L.icon({
6851
6851
  iconUrl: "https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png",
@@ -6888,6 +6888,7 @@ var init_MapView = __esm({
6888
6888
  }
6889
6889
  function MapViewInner({
6890
6890
  markers = [],
6891
+ routes = [],
6891
6892
  centerLat = 51.505,
6892
6893
  centerLng = -0.09,
6893
6894
  zoom = 13,
@@ -6956,6 +6957,20 @@ var init_MapView = __esm({
6956
6957
  ] }) : null
6957
6958
  },
6958
6959
  marker.id
6960
+ )),
6961
+ routes.map((route) => /* @__PURE__ */ jsx(
6962
+ Polyline,
6963
+ {
6964
+ positions: route.waypoints.map((wp) => [wp.lat, wp.lng]),
6965
+ pathOptions: {
6966
+ color: route.color ?? "var(--primary, #2563eb)",
6967
+ weight: route.weight ?? 4,
6968
+ opacity: route.opacity ?? 0.8,
6969
+ dashArray: route.dashArray
6970
+ },
6971
+ children: route.label ? /* @__PURE__ */ jsx(Popup, { children: /* @__PURE__ */ jsx(Typography2, { variant: "body2", children: route.label }) }) : null
6972
+ },
6973
+ route.id
6959
6974
  ))
6960
6975
  ]
6961
6976
  },
@@ -9450,9 +9465,9 @@ var init_ScaledDiagram = __esm({
9450
9465
  }
9451
9466
  });
9452
9467
 
9453
- // node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css
9468
+ // node_modules/katex/dist/katex.min.css
9454
9469
  var init_katex_min = __esm({
9455
- "node_modules/.pnpm/katex@0.16.45/node_modules/katex/dist/katex.min.css"() {
9470
+ "node_modules/katex/dist/katex.min.css"() {
9456
9471
  }
9457
9472
  });
9458
9473
  var MarkdownContent;