@synnaxlabs/pluto 0.21.6 → 0.21.8

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 (125) hide show
  1. package/dist/{Keyboard-DD2KYOn6.cjs → Keyboard-DaFraUsQ.cjs} +2 -2
  2. package/dist/{Keyboard-DD2KYOn6.cjs.map → Keyboard-DaFraUsQ.cjs.map} +1 -1
  3. package/dist/{Keyboard-DCHQVLbP.js → Keyboard-nDIAR7Rj.js} +2 -2
  4. package/dist/{Keyboard-DCHQVLbP.js.map → Keyboard-nDIAR7Rj.js.map} +1 -1
  5. package/dist/{LinePlot-FmPnet-3.cjs → LinePlot-BZDm4uxJ.cjs} +3 -3
  6. package/dist/{LinePlot-FmPnet-3.cjs.map → LinePlot-BZDm4uxJ.cjs.map} +1 -1
  7. package/dist/{LinePlot-D3us1amT.js → LinePlot-tOiSUMjC.js} +3 -3
  8. package/dist/{LinePlot-D3us1amT.js.map → LinePlot-tOiSUMjC.js.map} +1 -1
  9. package/dist/{Link-DlYOVhHH.cjs → Link-BdWFvK8v.cjs} +2 -2
  10. package/dist/{Link-DlYOVhHH.cjs.map → Link-BdWFvK8v.cjs.map} +1 -1
  11. package/dist/{Link-D48KH--6.js → Link-d3CXVSaO.js} +2 -2
  12. package/dist/{Link-D48KH--6.js.map → Link-d3CXVSaO.js.map} +1 -1
  13. package/dist/{List-CUO-_-jL.js → List-DcsWFiLT.js} +3 -3
  14. package/dist/{List-CUO-_-jL.js.map → List-DcsWFiLT.js.map} +1 -1
  15. package/dist/{List-CUq1lENO.cjs → List-PlMTfEHi.cjs} +3 -3
  16. package/dist/{List-CUq1lENO.cjs.map → List-PlMTfEHi.cjs.map} +1 -1
  17. package/dist/{Toggle-ClTExSi6.cjs → Toggle-C6Z8WPT3.cjs} +49 -9
  18. package/dist/Toggle-C6Z8WPT3.cjs.map +1 -0
  19. package/dist/{Toggle-DozaP3Tx.js → Toggle-DGLgYCOX.js} +49 -9
  20. package/dist/Toggle-DGLgYCOX.js.map +1 -0
  21. package/dist/Video-DFtnAOYY.cjs +14 -0
  22. package/dist/Video-DFtnAOYY.cjs.map +1 -0
  23. package/dist/Video-SGhKphYR.js +15 -0
  24. package/dist/Video-SGhKphYR.js.map +1 -0
  25. package/dist/{aggregator-Dl2jHye5.js → aggregator-BgImZc4o.js} +220 -218
  26. package/dist/aggregator-BgImZc4o.js.map +1 -0
  27. package/dist/{aggregator-Ca8xiVD2.cjs → aggregator-BpfMBUD1.cjs} +204 -202
  28. package/dist/aggregator-BpfMBUD1.cjs.map +1 -0
  29. package/dist/button.cjs +1 -1
  30. package/dist/button.js +1 -1
  31. package/dist/color.cjs +1 -1
  32. package/dist/color.js +1 -1
  33. package/dist/dropdown.cjs +1 -1
  34. package/dist/dropdown.js +1 -1
  35. package/dist/ether.cjs +2 -2
  36. package/dist/ether.js +4 -4
  37. package/dist/{external-Br3dSWZy.cjs → external-0PM7JrzG.cjs} +3 -3
  38. package/dist/{external-Br3dSWZy.cjs.map → external-0PM7JrzG.cjs.map} +1 -1
  39. package/dist/{external-Cq-yOszj.cjs → external-16K8slq8.cjs} +3 -3
  40. package/dist/{external-Cq-yOszj.cjs.map → external-16K8slq8.cjs.map} +1 -1
  41. package/dist/{external-BX1SuP7b.js → external-1osPryUV.js} +3 -3
  42. package/dist/{external-BX1SuP7b.js.map → external-1osPryUV.js.map} +1 -1
  43. package/dist/{external-BGyrJwT6.js → external-5przQjJD.js} +3 -3
  44. package/dist/{external-BGyrJwT6.js.map → external-5przQjJD.js.map} +1 -1
  45. package/dist/{external-Bw-gM1WS.js → external-96EinZfY.js} +3 -3
  46. package/dist/external-96EinZfY.js.map +1 -0
  47. package/dist/{external-CTg9-80v.cjs → external-B0z7uXZV.cjs} +3 -3
  48. package/dist/{external-CTg9-80v.cjs.map → external-B0z7uXZV.cjs.map} +1 -1
  49. package/dist/{external-DrUfLzJs.js → external-B3ly2-jy.js} +5 -5
  50. package/dist/{external-DrUfLzJs.js.map → external-B3ly2-jy.js.map} +1 -1
  51. package/dist/{external-DwY1uz6Y.js → external-BAdU6u03.js} +3 -3
  52. package/dist/{external-DwY1uz6Y.js.map → external-BAdU6u03.js.map} +1 -1
  53. package/dist/{external-JjFzMlTY.cjs → external-Blx0rtt2.cjs} +4 -4
  54. package/dist/{external-JjFzMlTY.cjs.map → external-Blx0rtt2.cjs.map} +1 -1
  55. package/dist/{external-DGEGrIB8.js → external-C6GmnG49.js} +4 -4
  56. package/dist/{external-DGEGrIB8.js.map → external-C6GmnG49.js.map} +1 -1
  57. package/dist/{external-BWNeNJEb.cjs → external-CPx8XA9-.cjs} +5 -5
  58. package/dist/{external-BWNeNJEb.cjs.map → external-CPx8XA9-.cjs.map} +1 -1
  59. package/dist/{external-jVPC18yY.js → external-CgMwmBnF.js} +3 -3
  60. package/dist/external-CgMwmBnF.js.map +1 -0
  61. package/dist/{external-rv9PfMM3.cjs → external-CsO29OsF.cjs} +5 -5
  62. package/dist/{external-rv9PfMM3.cjs.map → external-CsO29OsF.cjs.map} +1 -1
  63. package/dist/{external-gzESdEqw.cjs → external-Cu6T11fi.cjs} +8 -8
  64. package/dist/{external-gzESdEqw.cjs.map → external-Cu6T11fi.cjs.map} +1 -1
  65. package/dist/{external-DE-HpRm9.cjs → external-CzJYG1hX.cjs} +3 -3
  66. package/dist/external-CzJYG1hX.cjs.map +1 -0
  67. package/dist/{external-BbCvNSWY.cjs → external-D4ur_D1S.cjs} +3 -3
  68. package/dist/{external-BbCvNSWY.cjs.map → external-D4ur_D1S.cjs.map} +1 -1
  69. package/dist/{external-CsyhVOiV.cjs → external-D7XrxOVE.cjs} +3 -3
  70. package/dist/{external-CsyhVOiV.cjs.map → external-D7XrxOVE.cjs.map} +1 -1
  71. package/dist/{external-DWisAHYJ.js → external-DQkw1ko0.js} +3 -3
  72. package/dist/{external-DWisAHYJ.js.map → external-DQkw1ko0.js.map} +1 -1
  73. package/dist/{external-B0DCjEX5.js → external-DarqsFzT.js} +3 -3
  74. package/dist/{external-B0DCjEX5.js.map → external-DarqsFzT.js.map} +1 -1
  75. package/dist/{external-EIV24CTN.js → external-DeheWVb-.js} +8 -8
  76. package/dist/{external-EIV24CTN.js.map → external-DeheWVb-.js.map} +1 -1
  77. package/dist/{external-DX1JRejp.js → external-DiFhWWS-.js} +5 -5
  78. package/dist/{external-DX1JRejp.js.map → external-DiFhWWS-.js.map} +1 -1
  79. package/dist/{external-VofAmo6_.cjs → external-DvGqQHd8.cjs} +3 -3
  80. package/dist/external-DvGqQHd8.cjs.map +1 -0
  81. package/dist/header.cjs +1 -1
  82. package/dist/header.js +1 -1
  83. package/dist/index.cjs +16 -16
  84. package/dist/index.cjs.map +1 -1
  85. package/dist/index.js +31 -31
  86. package/dist/index.js.map +1 -1
  87. package/dist/input.cjs +1 -1
  88. package/dist/input.js +1 -1
  89. package/dist/list.cjs +1 -1
  90. package/dist/list.js +1 -1
  91. package/dist/menu.cjs +1 -1
  92. package/dist/menu.js +1 -1
  93. package/dist/src/list/Core.d.ts +1 -1
  94. package/dist/src/list/Core.d.ts.map +1 -1
  95. package/dist/src/list/Hover.d.ts.map +1 -1
  96. package/dist/src/list/Item.d.ts +1 -1
  97. package/dist/src/list/Item.d.ts.map +1 -1
  98. package/dist/src/video/Video.d.ts +2 -2
  99. package/dist/src/video/Video.d.ts.map +1 -1
  100. package/dist/style.css +1 -1
  101. package/dist/tabs.cjs +1 -1
  102. package/dist/tabs.js +1 -1
  103. package/dist/text.cjs +2 -2
  104. package/dist/text.js +2 -2
  105. package/dist/theming.cjs +2 -2
  106. package/dist/theming.js +2 -2
  107. package/dist/tree.cjs +1 -1
  108. package/dist/tree.js +1 -1
  109. package/dist/triggers.cjs +1 -1
  110. package/dist/triggers.js +1 -1
  111. package/dist/video.cjs +1 -1
  112. package/dist/video.js +1 -1
  113. package/package.json +3 -3
  114. package/dist/Toggle-ClTExSi6.cjs.map +0 -1
  115. package/dist/Toggle-DozaP3Tx.js.map +0 -1
  116. package/dist/Video-B1oW8NLd.js +0 -11
  117. package/dist/Video-B1oW8NLd.js.map +0 -1
  118. package/dist/Video-BGNx94bQ.cjs +0 -10
  119. package/dist/Video-BGNx94bQ.cjs.map +0 -1
  120. package/dist/aggregator-Ca8xiVD2.cjs.map +0 -1
  121. package/dist/aggregator-Dl2jHye5.js.map +0 -1
  122. package/dist/external-Bw-gM1WS.js.map +0 -1
  123. package/dist/external-DE-HpRm9.cjs.map +0 -1
  124. package/dist/external-VofAmo6_.cjs.map +0 -1
  125. package/dist/external-jVPC18yY.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/status/Circle.tsx","../src/status/Notification.tsx","../src/util/event.ts","../src/resize/Core.tsx","../src/resize/Multiple.tsx","../src/hooks/useCursorDrag/useCursorDrag.tsx","../src/resize/Single.tsx","../src/accordion/Accordion.tsx","../src/channel/types.ts","../src/vis/legend/Container.tsx","../src/vis/legend/Simple.tsx","../src/vis/canvas/Canvas.tsx","../../node_modules/.pnpm/@reactflow+background@11.3.12_@types+react@18.3.2_react-dom@18.3.1_react@18.3.1/node_modules/@reactflow/background/dist/esm/index.mjs","../src/vis/lineplot/LinePlot.tsx","../src/vis/lineplot/Legend.tsx","../src/vis/line/Line.tsx","../src/vis/lineplot/Line.tsx","../src/vis/lineplot/Title.tsx","../src/viewport/Mask.tsx","../src/viewport/use.ts","../src/select/ClearButton.tsx","../src/tag/Tag.tsx","../src/select/Multiple.tsx","../src/select/Single.tsx","../src/select/Direction.tsx","../src/select/DataType.tsx","../src/viewport/SelectMode.tsx","../src/vis/lineplot/Viewport.tsx","../src/vis/lineplot/Axis.tsx","../src/vis/lineplot/tooltip/Tooltip.tsx","../src/vis/measure/Measure.tsx","../src/vis/rule/Rule.tsx","../src/vis/lineplot/range/Annotation.tsx","../src/vis/lineplot/range/Provider.tsx","../src/channel/LinePlot.tsx","../src/synnax/Provider.tsx","../src/channel/AliasProvider.tsx","../src/channel/Select.tsx","../src/note/Note.tsx","../src/mosaic/tree.ts","../src/portal/Portal.tsx","../src/mosaic/Mosaic.tsx","../src/mosaic/use.tsx","../src/vis/eraser/use.tsx","../src/nav/Drawer.tsx","../src/nav/Bar.tsx","../src/os/Controls/Mac.tsx","../src/os/Controls/Windows.tsx","../src/os/use.ts","../src/os/Controls/Controls.tsx","../src/vis/diagram/edge/connector/connector.ts","../src/vis/diagram/util.ts","../src/vis/diagram/edge/Edge.tsx","../src/vis/diagram/Diagram.tsx","../src/vis/diagram/align.ts","../src/vis/value/use.ts","../src/telem/control/Controller.tsx","../src/telem/control/StateProvider.tsx","../src/telem/control/Indicator.tsx","../src/telem/control/Chip.tsx","../src/telem/control/Legend.tsx","../src/vis/button/use.ts","../src/vis/schematic/Labeled.tsx","../src/vis/schematic/primitives/Primitives.tsx","../src/vis/toggle/use.ts","../src/vis/schematic/Symbols.tsx","../../x/ts/dist/zodutil.js","../src/form/Form.tsx","../src/vis/schematic/SelectOrientation.tsx","../src/vis/schematic/Forms.tsx","../src/vis/schematic/registry.ts","../src/alamos/Provider.tsx","../src/pluto/defaultWorker.ts?url","../src/telem/Provider.tsx","../src/pluto/Pluto.tsx","../src/ranger/TimeRangeChip.tsx","../src/ranger/SelectLabel.tsx","../src/progress/Progress.tsx","../src/steps/Steps.tsx","../src/hardware/device/Select.tsx"],"sourcesContent":["// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon, type IconProps } from \"@synnaxlabs/media\";\n\nimport { type status } from \"@/status/aether\";\nimport { variantColors } from \"@/status/colors\";\n\nexport interface CircleProps extends IconProps {\n variant: status.Variant;\n}\n\nexport const Circle = ({ variant, ...props }: CircleProps): ReactElement => {\n return <Icon.Circle color={variantColors[variant]} {...props} />;\n};\n","import { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { NotificationSpec } from \"@/status/Aggregator\";\nimport { Circle } from \"@/status/Circle\";\nimport { Text } from \"@/text\";\nimport { Icon } from \"@synnaxlabs/media\";\nimport { toArray } from \"@synnaxlabs/x\";\nimport { ReactElement, isValidElement } from \"react\";\n\nimport \"@/status/Notification.css\";\n\nexport interface NotificationProps extends Align.SpaceProps {\n status: NotificationSpec;\n silence: (key: string) => void;\n actions?: ReactElement | Button.ButtonProps[];\n}\n\nexport const Notification = ({\n status: { key, time, count, message, description, variant },\n silence,\n actions,\n className,\n ...props\n}: NotificationProps): ReactElement => {\n return (\n <Align.Space\n className={CSS(CSS.B(\"notification\"), className)}\n direction=\"y\"\n key={time.toString()}\n empty\n {...props}\n >\n <Align.Space direction=\"x\" justify=\"spaceBetween\" grow style={{ width: \"100%\" }}>\n <Align.Space direction=\"x\" align=\"center\" size=\"small\">\n <Circle style={{ height: \"2.25rem\", width: \"2.5rem\" }} variant={variant} />\n <Text.Text level=\"small\" shade={7}>\n {`x${count}`}\n </Text.Text>\n <Text.DateTime\n className={CSS(CSS.BE(\"notification\", \"time\"))}\n level=\"small\"\n format=\"time\"\n >\n {time}\n </Text.DateTime>\n </Align.Space>\n <Button.Icon\n className={CSS(CSS.BE(\"notification\", \"silence\"))}\n variant=\"outlined\"\n size=\"small\"\n onClick={() => silence(key)}\n >\n <Icon.Close />\n </Button.Icon>\n </Align.Space>\n <Align.Space\n direction=\"y\"\n align=\"start\"\n className={CSS(CSS.BE(\"notification\", \"content\"))}\n size=\"small\"\n >\n <Text.Text\n className={CSS(CSS.BE(\"notification\", \"message\"))}\n level=\"p\"\n style={{ flexGrow: 1 }}\n >\n {message}\n </Text.Text>\n {description != null && (\n <Text.Text\n className={CSS(CSS.BE(\"notification\", \"description\"))}\n level=\"small\"\n style={{ flexGrow: 1 }}\n >\n {description}\n </Text.Text>\n )}\n </Align.Space>\n {actions != null && (\n <Align.Space\n direction=\"x\"\n align=\"center\"\n justify=\"end\"\n className={CSS(CSS.BE(\"notification\", \"actions\"))}\n >\n {toArray<ReactElement | Button.ButtonProps>(actions).map((a, i) => (\n <Action key={a.key} action={a} />\n ))}\n </Align.Space>\n )}\n </Align.Space>\n );\n};\n\ninterface ActionProps {\n action: ReactElement | Button.ButtonProps;\n}\n\nconst Action = ({ action }: ActionProps): ReactElement => {\n if (!isValidElement(action)) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const props = action as Button.ButtonProps;\n return <Button.Button {...props} />;\n }\n return action;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nexport const preventDefault = (e: { preventDefault: () => void }): void =>\n e.preventDefault();\n\nexport const stopPropagation = (e: { stopPropagation: () => void }): void =>\n e.stopPropagation();\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n forwardRef,\n type DetailedHTMLProps,\n type HTMLAttributes,\n type ReactElement,\n} from \"react\";\n\nimport { direction, location } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { preventDefault } from \"@/util/event\";\n\nimport \"@/resize/Core.css\";\n\nexport interface CoreProps\n extends DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement> {\n location: location.Crude;\n size: number;\n onDragStart: (e: React.DragEvent<HTMLDivElement>) => void;\n sizeUnits?: \"px\" | \"%\";\n showHandle?: boolean;\n}\n\nexport const Core = forwardRef<HTMLDivElement, CoreProps>(\n (\n {\n location: cloc,\n style,\n size,\n className,\n children,\n onDragStart,\n sizeUnits = \"px\",\n showHandle = true,\n ...props\n }: CoreProps,\n ref,\n ): ReactElement => {\n const loc_ = location.construct(cloc);\n const dir = location.direction(loc_);\n const dim = direction.dimension(dir);\n return (\n <div\n className={CSS(CSS.B(\"resize\"), CSS.loc(loc_), CSS.dir(dir), className)}\n style={{ [dim]: `${size}${sizeUnits}`, ...style }}\n ref={ref}\n {...props}\n >\n {children}\n {showHandle && (\n <div\n draggable\n className={CSS(\n CSS.BE(\"resize\", \"handle\"),\n CSS.bordered(location.swap(loc_)),\n )}\n onDragStart={onDragStart}\n onDrag={preventDefault}\n onDragEnd={preventDefault}\n />\n )}\n </div>\n );\n },\n);\n\nCore.displayName = \"Resize.Core\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n Children,\n type ForwardedRef,\n forwardRef,\n useCallback,\n useState,\n useEffect,\n useRef,\n type RefObject,\n} from \"react\";\n\nimport { box, direction, type xy, math } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { Core } from \"@/resize/Core\";\n\nimport \"@/resize/Multiple.css\";\n\n/** Props for the {@link Resize.Multiple} component. */\nexport interface MultipleProps extends Align.SpaceProps {\n sizeDistribution: number[];\n onDragHandle: (e: ResizeStartEvent, i: number) => void;\n}\n\nexport type ResizeStartEvent = xy.Client & { preventDefault: () => void };\n\n/** Props for the {@link Resize.useMultiple} hook. */\nexport interface UseMultipleProps {\n count: number;\n onResize?: (sizes: number[]) => void;\n direction?: direction.Crude;\n initialSizes?: number[];\n minSize?: number;\n}\n\n/** Return value of the {@link Resize.useMultiple} hook. */\nexport interface UseMultipleReturn {\n setSize: (i: number, size?: number) => void;\n props: Pick<MultipleProps, \"sizeDistribution\" | \"onDragHandle\" | \"direction\"> & {\n ref: RefObject<HTMLDivElement>;\n };\n}\n\ninterface MultipleState {\n sizeDistribution: number[];\n root: number | null;\n}\n\n/**\n * A hook that implements the control logic for {@link Resize.Multiple}. This hook\n * should be used in conjunction with {@link Resize.Multiple}.\n *\n * @param props - The a component props.\n * @param props.count - The number of panels to render. This should be the same as the\n * number of children passed to {@link Resize.Multiple}.\n * @param props.onResize - A callback executed when the panels are resized.\n * @param props.initialSizes - The initial sizes of the panels. This should be an array of\n * numbers, where each number is the initial size of the corresponding panel either in pixels\n * or as a decimal percentage. If this array is not provided (or is shorter than the expected length),\n * the (remaining) panels will be evenly distributed across the container.\n * @param props.direction - The direction in which the panels should be draggable. This should\n * be Default: \"x\"\n * @param props.minSize - The smallest size the panels can be resized to. Defaults to 100.\n *\n * @returns The props that should be passed to {@link Resize.Multiple} along with a few\n * utility functions. setSize can be used to manually set the size of a particular panel.\n */\nexport const useMultiple = ({\n onResize,\n count,\n initialSizes = [],\n minSize = 100,\n direction = \"x\",\n}: UseMultipleProps): UseMultipleReturn => {\n const ref = useRef<HTMLDivElement>(null);\n const [state, setState] = useState<MultipleState>({\n sizeDistribution: calculateInitialSizeDistribution(initialSizes, count),\n root: null,\n });\n\n const _handleResize = useCallback(\n (dragging: number, clientPos?: number, targetSize?: number) => {\n if (ref.current == null) return;\n const parentSize = box.dim(box.construct(ref.current), direction);\n setState((prev) =>\n handleResize(prev, parentSize, dragging, minSize, clientPos, targetSize),\n );\n },\n [minSize, setState, direction],\n );\n\n useEffect(\n () => onResize?.(state.sizeDistribution),\n [state.sizeDistribution, onResize],\n );\n\n const handleDragHandle = useCallback(\n (e: ResizeStartEvent, dragging: number): void => {\n e.preventDefault();\n const dim = direction === \"x\" ? \"clientX\" : \"clientY\";\n const handleMouseMove = (e: MouseEvent): void => _handleResize(dragging, e[dim]);\n const handleMouseUp = (): void => {\n setState((prev) => ({ ...prev, root: null }));\n document.removeEventListener(\"mousemove\", handleMouseMove);\n };\n setState((prev) => ({ ...prev, root: e[dim] }));\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp, { once: true });\n },\n [setState, direction, handleResize],\n );\n\n const setSize = useCallback(\n (i: number, size?: number) => _handleResize(i, undefined, size),\n [handleResize],\n );\n\n return {\n setSize,\n props: {\n direction,\n sizeDistribution: state.sizeDistribution,\n onDragHandle: handleDragHandle,\n ref,\n },\n };\n};\n\n/**\n * A set of panels that can be resized within their container. Resize.Multiple must be\n * used in conjunction with {@link Resize.useMultiple}.\n *\n * @param props - The component props. All unused props will be passed to the div\n * containing the div containing the panels. Generally these props should not be provided\n * directly, and you should instead spread the props returned from {@link Resize.useMultiple}.\n * The only exceptions to this are stylistic props (e.g. className, style, etc.) as well\n * as the `children` prop.\n */\nexport const Multiple = forwardRef(\n (\n {\n direction: direction_ = \"x\",\n children: _children,\n sizeDistribution,\n onDragHandle: onDrag,\n className,\n ...props\n }: MultipleProps,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const dir = direction.construct(direction_);\n const children = Children.toArray(_children);\n\n /**\n * You may be wondering, why on earth are we doing this? Well, the answer is that\n * if you're moving elements within the resize multiple, and the sizes are all the\n * same, any resize observers will not trigger. The slight offset ensures that if\n * a re-ordering occurs, the resize observers will trigger and everything will\n * be in sync.\n */\n sizeDistribution = slightlyOffsetEvenDistribution(sizeDistribution);\n\n return (\n <Align.Space\n {...props}\n ref={ref}\n direction={dir}\n className={CSS(CSS.B(\"resize-multiple\"), className)}\n empty\n grow\n >\n {children.map((child, i) => (\n <Core\n onDragStart={(e) => onDrag(e, i)}\n key={i}\n location={direction.location(dir)}\n size={sizeDistribution[i] * 100}\n sizeUnits=\"%\"\n showHandle={i !== children.length - 1}\n >\n {child}\n </Core>\n ))}\n </Align.Space>\n );\n },\n);\nMultiple.displayName = \"Resize.Multiple\";\n\nconst calculateInitialSizeDistribution = (\n initial: number[],\n count: number,\n): number[] => {\n const total = initial.reduce((a, b) => a + b, 0);\n const gap = count - initial.length;\n if (gap <= 0) return initial.slice(0, count).map((v) => v / total);\n if (initial.every((v) => v <= 1)) {\n const remaining = 1 - total;\n return [...initial, ...Array(gap).fill(remaining / gap)];\n }\n return initial.map(() => 1 / count);\n};\n\nconst DELTA = 0.001;\n\nconst slightlyOffsetEvenDistribution = (sizes: number[]): number[] => {\n if (sizes.every((v) => math.closeTo(v, 1 / sizes.length), DELTA))\n return sizes.map((v, i) => {\n if (i % 2 === 0) return v + DELTA;\n if (i === sizes.length - 1) return v;\n return v - DELTA;\n });\n return sizes;\n};\n\nconst handleResize = (\n prev: MultipleState,\n parentSize: number,\n dragging: number,\n minSize: number,\n clientPos?: number,\n targetSize?: number,\n): MultipleState => {\n const diffPercentage = calculateDiffPercentage(\n prev,\n parentSize,\n dragging,\n clientPos,\n targetSize,\n );\n let [sizeDistribution, changed] = resizeWithSibling(\n prev.sizeDistribution,\n dragging,\n diffPercentage,\n minSize / parentSize,\n );\n const root = changed ? clientPos ?? null : prev.root;\n return { ...prev, sizeDistribution, root };\n};\n\nexport const calculateDiffPercentage = (\n prev: MultipleState,\n parentSize: number,\n dragging: number,\n clientPos?: number,\n targetSize?: number,\n): number => {\n let diff: number;\n // If the caller provided a target size, prefer that.\n if (targetSize != null) {\n // If the target size is a pixel value, convert it to a percentage.\n if (targetSize > 1) targetSize = targetSize / parentSize;\n diff = targetSize - prev.sizeDistribution[dragging];\n } else if (clientPos != null) {\n if (prev.root === null) throw new Error(\"resize root is null during handle drag\");\n diff = (clientPos - prev.root) / parentSize;\n } else throw new Error(\"must provide either a MouseEvent or a targetSize\");\n return diff;\n};\n\nconst resizeWithSibling = (\n prevDistribution: number[],\n item: number,\n diff: number,\n minSizePercent: number,\n): [number[], boolean] => {\n let next = item;\n\n // The while loops find a pane we can actually resize.\n while (next > 0 && prevDistribution[next] + diff <= minSizePercent) next--;\n const nextSize = prevDistribution[next] + diff;\n\n const nextSibling = findResizableSibling(\n next,\n prevDistribution,\n minSizePercent,\n diff,\n );\n const nextSiblingSize = prevDistribution[nextSibling] - diff;\n // This means we can't resize any panes so we return null to indicate that the next\n // set of sizes should remain the same.\n if (nextSize < minSizePercent || nextSiblingSize < minSizePercent)\n return [prevDistribution, false];\n\n return [\n prevDistribution.map((p, i) => {\n if (i === next) return nextSize;\n if (i === nextSibling) return nextSiblingSize;\n return p;\n }),\n true,\n ];\n};\n\nconst findResizableSibling = (\n item: number,\n sizes: number[],\n minSize: number,\n diff: number,\n): number => {\n const f = item === sizes.length - 1 ? findBackward : findForward;\n return f(item, sizes, minSize, diff);\n};\n\nconst findForward = (\n start: number,\n sizes: number[],\n minSize: number,\n diff: number,\n): number => {\n let i = start + 1;\n while (i < sizes.length - 1 && sizes[i] - diff <= minSize) i++;\n return i;\n};\n\nconst findBackward = (\n start: number,\n sizes: number[],\n minSize: number,\n diff: number,\n): number => {\n let i = start - 1;\n while (i > 0 && sizes[i] - diff <= minSize) i--;\n return i;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type DragEvent, useCallback } from \"react\";\n\nimport { xy, box } from \"@synnaxlabs/x\";\n\nimport { Triggers } from \"@/triggers\";\n\nexport interface UseCursorDragProps {\n onStart?: (loc: xy.XY, mouseKey: Triggers.Key, e: DragEvent) => void;\n onMove?: (box: box.Box, mouseKey: Triggers.Key, e: MouseEvent) => void;\n onEnd?: (box: box.Box, mouseKey: Triggers.Key, e: MouseEvent) => void;\n}\n\nexport type UseCursorDragStart = (e: DragEvent) => void;\n\nexport const useCursorDrag = ({\n onMove,\n onStart,\n onEnd,\n}: UseCursorDragProps): UseCursorDragStart =>\n useCallback(\n (e) => {\n e.preventDefault();\n const startLoc = xy.construct(e);\n const mouseKey = Triggers.mouseKey(e.button);\n onStart?.(startLoc, mouseKey, e);\n const handleMove = (e: MouseEvent): void => {\n if (e.buttons === 0) return handleUp(e);\n const next = xy.construct(e);\n onMove?.(box.construct(startLoc, next), mouseKey, e);\n };\n window.addEventListener(\"mousemove\", handleMove);\n const handleUp = (e: xy.Crude): void => {\n window.removeEventListener(\"mousemove\", handleMove);\n const next = xy.construct(e);\n onEnd?.(box.construct(startLoc, next), mouseKey, e as MouseEvent);\n };\n window.addEventListener(\"mouseup\", handleUp, { once: true });\n },\n [onMove, onStart, onEnd],\n );\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { box, clamp, location } from \"@synnaxlabs/x\";\nimport { clsx } from \"clsx\";\n\nimport { CSS } from \"@/css\";\nimport { useCursorDrag } from \"@/hooks/useCursorDrag\";\nimport { Core, type CoreProps } from \"@/resize/Core\";\n\n/** Props for the {@link Single} component. */\nexport interface SingleProps\n extends Omit<CoreProps, \"showHandle\" | \"size\" | \"onResize\" | \"onDragStart\" | \"ref\"> {\n initialSize?: number;\n minSize?: number;\n maxSize?: number;\n onResize?: (size: number, box: box.Box) => void;\n collapseThreshold?: number;\n onCollapse?: () => void;\n}\n\nconst COLLAPSED_SIZE = 2;\n\n/**\n * A panel that can be resized in one direction by dragging its handle.\n *\n * @param props - The component props. All unused props will be passed to the div\n * containing the content.\n * @param props.location - The the location of the panel. The drag handle will be on the opposite side.\n * @param props.minSize - The smallest size the panel can be resized to.\n * @param props.maxSize - The largest size the panel can be resized to.\n * @param props.onResize - A callback executed when the panel is resized.\n */\nexport const Single = ({\n onCollapse,\n onResize,\n location: location_ = \"left\",\n minSize = 100,\n maxSize = Infinity,\n initialSize = 200,\n collapseThreshold = Infinity,\n className,\n ...props\n}: SingleProps): ReactElement => {\n const [size, setSize] = useState(clamp(initialSize, minSize, maxSize));\n const marker = useRef<number | null>(null);\n const loc = location.construct(location_);\n\n const calcNextSize = useCallback(\n (b: box.Box) => {\n if (marker.current === null) return 0;\n const dim =\n box.dim(b, location.direction(loc), true) *\n (1 - 2 * Number([\"bottom\", \"right\"].includes(loc)));\n const rawNextSize = marker.current + dim;\n const nextSize = clamp(rawNextSize, minSize, maxSize);\n if ((nextSize - rawNextSize) / minSize > collapseThreshold) return COLLAPSED_SIZE;\n return nextSize;\n },\n [loc, minSize, maxSize, collapseThreshold],\n );\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleMove = useCallback(\n (dragRegion: box.Box) => {\n const nextSize = calcNextSize(dragRegion);\n setSize(nextSize);\n if (ref.current == null) return;\n onResize?.(nextSize, box.construct(ref.current));\n },\n [onResize, calcNextSize],\n );\n\n const handleStart = useCallback(\n () =>\n setSize((prev) => {\n marker.current = prev;\n return prev;\n }),\n [setSize],\n );\n\n const handleEnd = useCallback(\n (box: box.Box) => calcNextSize(box) === COLLAPSED_SIZE && onCollapse?.(),\n [onCollapse, calcNextSize],\n );\n\n useEffect(\n () =>\n setSize((prev) => {\n const nextSize = clamp(prev, minSize, maxSize);\n marker.current = nextSize;\n return nextSize;\n }),\n [minSize, maxSize],\n );\n\n const handleDragStart = useCursorDrag({\n onMove: handleMove,\n onStart: handleStart,\n onEnd: handleEnd,\n });\n\n return (\n <Core\n ref={ref}\n location={loc}\n size={size}\n onDragStart={handleDragStart}\n className={clsx(className, CSS.expanded(size !== COLLAPSED_SIZE))}\n {...props}\n />\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, type RefObject } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { box, type direction } from \"@synnaxlabs/x/spatial\";\n\nimport { type Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { Header } from \"@/header\";\nimport { Resize } from \"@/resize\";\n\nimport \"@/accordion/Accordion.css\";\n\n/** The props for a single entry in the {@link Accordion} component. */\nexport interface Entry {\n /** A unique key for the entry. */\n key: string;\n /** The name for the entries header. */\n name: string;\n /** The content for the entry. */\n content: ReactElement;\n /**\n * The initial size for the entry. It's recommended to set this to a decimal value\n * representing the percentage of the overall parent size.\n */\n initialSize?: number;\n /**\n * A list of actions to display in the entry's header. See the {@link Header.Actions}\n * component for more details.\n */\n actions?: Array<Button.IconProps | ReactElement>;\n}\n\n/** The props for the {@link Accordion} component. */\nexport interface AccordionProps\n extends Omit<\n Resize.MultipleProps,\n \"sizeDistribution\" | \"parentSize\" | \"onDragHandle\" | \"direction\"\n > {\n data: Entry[];\n}\n\nconst DIRECTION: direction.Direction = \"y\";\nconst MIN_SIZE = 28;\nconst COLLAPSED_THRESHOLD = 32;\nconst EXPAND_THRESHOLD = 40;\nconst DEFAULT_EXPAND_SIZE = 0.5;\n\n/**\n * A resizable accordion component, whose entries can be expanded and collapsed. This\n * component is intentionally opinionated in its interface in order to provide stylistic\n * consistency and simplicity. If you need more control, look at building a custom\n * accordion component using {@link Resize.Multiple}.\n *\n * @param props - All unused props are passed to the underlying {@link Resize.Multiple}\n * component.\n * @param props.entries - The entries to display in the accordion. See the\n * {@link Entry} interface for more details.\n */\nexport const Accordion = ({ data, ...props }: AccordionProps): ReactElement => {\n const {\n setSize,\n props: { sizeDistribution: sizes, ref, ...resizeProps },\n } = Resize.useMultiple({\n direction: DIRECTION,\n count: data.length,\n minSize: MIN_SIZE,\n });\n\n const onExpand = (index: number): void => {\n if (ref.current == null) return;\n const parentSize = box.dim(box.construct(ref.current), DIRECTION);\n if (sizes[index] < EXPAND_THRESHOLD / parentSize)\n setSize(index, data[index].initialSize ?? DEFAULT_EXPAND_SIZE);\n else setSize(index, MIN_SIZE + 1);\n };\n\n return (\n <Resize.Multiple\n empty\n className={CSS.B(\"accordion\")}\n sizeDistribution={sizes}\n ref={ref}\n {...props}\n {...resizeProps}\n >\n {data.map((entry, i) => (\n <EntryC\n {...entry}\n key={entry.key}\n index={i}\n direction={DIRECTION}\n onExpand={onExpand}\n parent={ref}\n size={sizes[i]}\n />\n ))}\n </Resize.Multiple>\n );\n};\n\ninterface EntryCProps extends Omit<Entry, \"key\"> {\n index: number;\n size: number;\n parent: RefObject<HTMLDivElement>;\n onExpand: (i: number) => void;\n direction: direction.Direction;\n}\n\nconst expandedIcon = <Icon.Caret.Down aria-label=\"contract\" />;\nconst collapsedIcon = <Icon.Caret.Right aria-label=\"expand\" />;\n\nconst EntryC = ({\n index,\n name,\n content,\n actions,\n size,\n parent,\n onExpand,\n}: EntryCProps): ReactElement => {\n let expanded = true;\n if (parent.current != null) {\n const parentSize = box.dim(box.construct(parent.current), DIRECTION);\n expanded = size * parentSize > COLLAPSED_THRESHOLD;\n }\n const icon = expanded ? expandedIcon : collapsedIcon;\n return (\n <>\n <Header.Header level=\"p\" className={CSS.expanded(expanded)} empty>\n <Header.ButtonTitle startIcon={icon} onClick={() => onExpand(index)}>\n {name}\n </Header.ButtonTitle>\n {actions != null && <Header.Actions>{actions}</Header.Actions>}\n </Header.Header>\n {content}\n </>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nexport const HAUL_TYPE = \"channel\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type CSSProperties,\n memo,\n type ReactElement,\n type RefObject,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\nimport { box, location, scale, xy } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { useSyncedRef } from \"@/hooks\";\nimport { useCursorDrag } from \"@/hooks/useCursorDrag\";\nimport { type OptionalControl } from \"@/input/types\";\nimport { state } from \"@/state\";\nimport { preventDefault } from \"@/util/event\";\n\nimport \"@/vis/legend/Container.css\";\n\nexport interface ContainerProps\n extends Omit<Align.SpaceProps, \"onChange\">,\n Partial<OptionalControl<xy.XY>> {\n dragEnabled?: boolean;\n}\n\ntype CSSPosition = Partial<\n Pick<CSSProperties, \"left\" | \"right\" | \"top\" | \"bottom\" | \"display\">\n>;\n\nexport const intelligentPosition = (\n pos: xy.XY,\n ref: RefObject<HTMLDivElement>,\n): CSSPosition => {\n if (ref.current == null) return { display: \"none\" };\n const ret: CSSPosition = {};\n const parentBox = box.construct(ref.current.parentElement as HTMLDivElement);\n const b = box.construct(ref.current);\n if (pos.x > 0.8) {\n ret.right = `${(1 - pos.x) * box.width(parentBox) - box.width(b)}px`;\n } else if (pos.x < 0.2) {\n ret.left = `${pos.x * box.width(parentBox)}px`;\n } else {\n ret.left = `${pos.x * 100}%`;\n }\n if (pos.y > 0.8) {\n ret.bottom = `${(1 - pos.y) * box.height(parentBox) - box.height(b)}px`;\n } else if (pos.y < 0.2) {\n ret.top = `${pos.y * box.height(parentBox)}px`;\n } else {\n ret.top = `${pos.y * 100}%`;\n }\n return ret;\n};\n\nexport const Container = memo(\n ({\n className,\n value,\n onChange,\n style,\n draggable = true,\n ...props\n }: ContainerProps): ReactElement | null => {\n const [position, setPosition] = state.usePurePassthrough<xy.XY>({\n value,\n onChange,\n initial: xy.construct(0.1, 0.01),\n });\n\n const positionRef = useRef(position);\n const disabled = useSyncedRef(draggable === false);\n const ref = useRef<HTMLDivElement | null>(null);\n const [intelligentPos, setIntelligentPos] = useState<CSSPosition>({});\n\n if (position !== null) style = { ...style, ...intelligentPos };\n\n const refCallback = useCallback((el: HTMLDivElement | null) => {\n ref.current = el;\n setIntelligentPos(intelligentPosition(xy.construct(position), ref));\n }, []);\n\n const calculatePosition = useCallback((b: box.Box): xy.XY => {\n if (ref.current?.parentElement == null) return positionRef.current;\n const bounds = box.construct(ref.current.parentElement);\n const d = box.reRoot(box.DECIMAL, location.TOP_LEFT);\n const s = scale.XY.scale(bounds).scale(d);\n const el = s.box(box.construct(ref.current));\n const clamp = scale.XY.clamp(\n box.construct(box.topLeft(d), {\n width: box.width(d) - box.width(el),\n height: box.height(d) - box.height(el),\n }),\n );\n return clamp.pos(\n xy.translate(xy.construct(positionRef.current), box.signedDims(s.box(b))),\n );\n }, []);\n\n const handleCursorDragStart = useCursorDrag({\n onMove: useCallback(\n (box: box.Box) => {\n if (disabled.current) return;\n const pos = calculatePosition(box);\n setIntelligentPos(intelligentPosition(xy.construct(pos), ref));\n },\n [setPosition],\n ),\n onEnd: useCallback((box: box.Box) => {\n if (disabled.current) return;\n positionRef.current = calculatePosition(box);\n }, []),\n });\n\n return (\n <Align.Space\n className={CSS(className, CSS.B(\"legend\"))}\n bordered\n rounded\n style={style}\n onDragStart={handleCursorDragStart}\n draggable={draggable}\n ref={refCallback}\n {...props}\n onDrag={preventDefault}\n onDragEnd={preventDefault}\n empty\n />\n );\n },\n);\nContainer.displayName = \"Legend.Container\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useState } from \"react\";\n\nimport { Align } from \"@/align\";\nimport { Color } from \"@/color\";\nimport { Text } from \"@/text\";\nimport { Container, type ContainerProps } from \"@/vis/legend/Container\";\n\ninterface SimpleEntry {\n key: string;\n label: string;\n color: Color.Crude;\n}\n\nexport interface SimpleProps extends Omit<ContainerProps, \"value\" | \"onChange\"> {\n data?: SimpleEntry[];\n onEntryChange?: (value: SimpleEntry) => void;\n position?: ContainerProps[\"value\"];\n onPositionChange?: ContainerProps[\"onChange\"];\n}\n\nexport const Simple = ({\n data = [],\n onEntryChange,\n position,\n onPositionChange,\n ...props\n}: SimpleProps): ReactElement | null => {\n const [pickerVisible, setPickerVisible] = useState<boolean>(false);\n\n if (data.length === 0) return null;\n\n return (\n <Container\n {...props}\n draggable={!pickerVisible}\n value={position}\n onChange={onPositionChange}\n >\n {data\n .sort((a, b) => a.label.localeCompare(b.label))\n .map(({ key, color, label }) => (\n <Align.Space\n key={key}\n style={{ cursor: \"pointer\" }}\n direction=\"x\"\n align=\"center\"\n >\n <Color.Swatch\n value={color}\n onChange={(c) => onEntryChange?.({ key, color: c, label })}\n onVisibleChange={setPickerVisible}\n draggable={false}\n size=\"small\"\n />\n <Text.MaybeEditable\n level=\"small\"\n value={label}\n onChange={(l) => onEntryChange?.({ key, color, label: l })}\n noWrap\n />\n </Align.Space>\n ))}\n </Container>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type CanvasHTMLAttributes,\n type DetailedHTMLProps,\n type ReactElement,\n useCallback,\n useRef,\n useEffect,\n} from \"react\";\n\nimport { box, runtime, scale, xy } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { CSS } from \"@/css\";\nimport { type UseResizeHandler, useResize } from \"@/hooks\";\nimport { canvas } from \"@/vis/canvas/aether\";\n\nimport \"@/vis/canvas/Canvas.css\";\n\ntype HTMLDivProps = DetailedHTMLProps<\n CanvasHTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n>;\n\nexport interface CanvasProps extends Omit<HTMLDivProps, \"ref\"> {\n resizeDebounce?: number;\n}\n\nconst ZERO_PROPS = { region: box.ZERO, dpr: 1, os: runtime.getOS() as runtime.OS };\n\ninterface Canvases {\n gl: HTMLCanvasElement | null;\n lower2d: HTMLCanvasElement | null;\n upper2d: HTMLCanvasElement | null;\n bootstrapped: boolean;\n}\n\nconst ZERO_CANVASES: Canvases = {\n gl: null,\n lower2d: null,\n upper2d: null,\n bootstrapped: false,\n};\n\nexport const Canvas = Aether.wrap<CanvasProps>(\n canvas.Canvas.TYPE,\n ({\n children,\n resizeDebounce: debounce = 100,\n aetherKey,\n className,\n ...props\n }): ReactElement => {\n const [{ path }, { bootstrapped, dpr }, setState] = Aether.use({\n aetherKey,\n type: canvas.Canvas.TYPE,\n schema: canvas.canvasStateZ,\n initialState: ZERO_PROPS,\n });\n\n const canvases = useRef<Canvases>({ ...ZERO_CANVASES });\n\n const handleResize = useCallback(\n (region: box.Box) => {\n if (canvases.current.bootstrapped)\n setState(() => ({\n bootstrapped: true,\n region,\n dpr: window.devicePixelRatio,\n os: runtime.getOS({ default: \"Windows\" }) as runtime.OS,\n }));\n },\n [setState],\n );\n\n const resizeRef = useResize(handleResize, { debounce });\n\n useEffect(() => {\n // Handle device pixel ratio change i.e. when the user moves the window to a\n // different display.\n const handleChange = (): void => {\n if (window.devicePixelRatio === dpr) return;\n setState((p) => ({ ...p, dpr: window.devicePixelRatio }));\n };\n window\n .matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`)\n .addEventListener(\"change\", handleChange, { once: true });\n }, [dpr]);\n\n const refCallback = useCallback(\n (el: HTMLCanvasElement | null) => {\n resizeRef(el);\n if (el == null) return;\n\n // Store the canvas\n if (el.className.includes(\"gl\")) canvases.current.gl = el;\n else if (el.className.includes(\"upper2d\")) canvases.current.upper2d = el;\n else canvases.current.lower2d = el;\n const { gl, lower2d, upper2d, bootstrapped } = canvases.current;\n\n if (gl == null || lower2d == null || upper2d == null || bootstrapped) return;\n\n // Bootstrap the canvas\n canvases.current.bootstrapped = true;\n const glCanvas = gl.transferControlToOffscreen();\n const upper2dCanvas = upper2d.transferControlToOffscreen();\n const lower2dCanvas = lower2d.transferControlToOffscreen();\n setState(\n {\n glCanvas,\n upper2dCanvas,\n lower2dCanvas,\n bootstrap: true,\n bootstrapped: false,\n region: box.construct(gl),\n dpr: window.devicePixelRatio,\n os: runtime.getOS({ default: \"Windows\" }) as runtime.OS,\n },\n [glCanvas, upper2dCanvas, lower2dCanvas],\n );\n },\n [setState],\n );\n\n return (\n <div className={CSS(CSS.B(\"canvas-container\"), className)} {...props}>\n <canvas\n ref={refCallback}\n className={CSS(CSS.B(\"canvas\"), CSS.BM(\"canvas\", \"lower2d\"))}\n />\n <canvas\n ref={refCallback}\n className={CSS(CSS.B(\"canvas\"), CSS.BM(\"canvas\", \"gl\"))}\n />\n <canvas\n ref={refCallback}\n className={CSS(CSS.B(\"canvas\"), CSS.BM(\"canvas\", \"upper2d\"))}\n />\n <Aether.Composite path={path}>{bootstrapped && children}</Aether.Composite>\n </div>\n );\n },\n);\n\nexport const useRegion = (handler: UseResizeHandler): React.RefCallback<HTMLElement> =>\n useResize(\n useCallback(\n (b, el) => {\n const canvas = document.querySelector(\".pluto-canvas--lower2d\");\n if (canvas == null) return;\n handler(scale.XY.translate(xy.scale(box.topLeft(canvas), -1)).box(b), el);\n },\n [handler],\n ),\n );\n","import React, { memo, useRef } from 'react';\nimport cc from 'classcat';\nimport { useStore } from '@reactflow/core';\nimport { shallow } from 'zustand/shallow';\n\nvar BackgroundVariant;\n(function (BackgroundVariant) {\n BackgroundVariant[\"Lines\"] = \"lines\";\n BackgroundVariant[\"Dots\"] = \"dots\";\n BackgroundVariant[\"Cross\"] = \"cross\";\n})(BackgroundVariant || (BackgroundVariant = {}));\n\nfunction LinePattern({ color, dimensions, lineWidth }) {\n return (React.createElement(\"path\", { stroke: color, strokeWidth: lineWidth, d: `M${dimensions[0] / 2} 0 V${dimensions[1]} M0 ${dimensions[1] / 2} H${dimensions[0]}` }));\n}\nfunction DotPattern({ color, radius }) {\n return React.createElement(\"circle\", { cx: radius, cy: radius, r: radius, fill: color });\n}\n\nconst defaultColor = {\n [BackgroundVariant.Dots]: '#91919a',\n [BackgroundVariant.Lines]: '#eee',\n [BackgroundVariant.Cross]: '#e2e2e2',\n};\nconst defaultSize = {\n [BackgroundVariant.Dots]: 1,\n [BackgroundVariant.Lines]: 1,\n [BackgroundVariant.Cross]: 6,\n};\nconst selector = (s) => ({ transform: s.transform, patternId: `pattern-${s.rfId}` });\nfunction Background({ id, variant = BackgroundVariant.Dots, \n// only used for dots and cross\ngap = 20, \n// only used for lines and cross\nsize, lineWidth = 1, offset = 2, color, style, className, }) {\n const ref = useRef(null);\n const { transform, patternId } = useStore(selector, shallow);\n const patternColor = color || defaultColor[variant];\n const patternSize = size || defaultSize[variant];\n const isDots = variant === BackgroundVariant.Dots;\n const isCross = variant === BackgroundVariant.Cross;\n const gapXY = Array.isArray(gap) ? gap : [gap, gap];\n const scaledGap = [gapXY[0] * transform[2] || 1, gapXY[1] * transform[2] || 1];\n const scaledSize = patternSize * transform[2];\n const patternDimensions = isCross ? [scaledSize, scaledSize] : scaledGap;\n const patternOffset = isDots\n ? [scaledSize / offset, scaledSize / offset]\n : [patternDimensions[0] / offset, patternDimensions[1] / offset];\n return (React.createElement(\"svg\", { className: cc(['react-flow__background', className]), style: {\n ...style,\n position: 'absolute',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n }, ref: ref, \"data-testid\": \"rf__background\" },\n React.createElement(\"pattern\", { id: patternId + id, x: transform[0] % scaledGap[0], y: transform[1] % scaledGap[1], width: scaledGap[0], height: scaledGap[1], patternUnits: \"userSpaceOnUse\", patternTransform: `translate(-${patternOffset[0]},-${patternOffset[1]})` }, isDots ? (React.createElement(DotPattern, { color: patternColor, radius: scaledSize / offset })) : (React.createElement(LinePattern, { dimensions: patternDimensions, color: patternColor, lineWidth: lineWidth }))),\n React.createElement(\"rect\", { x: \"0\", y: \"0\", width: \"100%\", height: \"100%\", fill: `url(#${patternId + id})` })));\n}\nBackground.displayName = 'Background';\nvar Background$1 = memo(Background);\n\nexport { Background$1 as Background, BackgroundVariant };\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type CSSProperties,\n type DetailedHTMLProps,\n type HTMLAttributes,\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useCallback,\n useContext as reactUseContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { location, type Destructor, deep, direction, box, xy } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { type Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { useEffectCompare } from \"@/hooks\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { type Viewport } from \"@/viewport\";\nimport { Canvas } from \"@/vis/canvas\";\nimport { lineplot } from \"@/vis/lineplot/aether\";\nimport {\n type GridEntrySpec,\n filterGridEntries,\n type GridSpec,\n} from \"@/vis/lineplot/aether/grid\";\n\nimport \"@/vis/lineplot/LinePlot.css\";\n\ntype HTMLDivProps = DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\nexport interface LinePlotContextValue {\n setGridEntry: (meta: GridEntrySpec) => void;\n removeGridEntry: (key: string) => void;\n setLine: (meta: LineSpec) => void;\n removeLine: (key: string) => void;\n lines: LineSpec[];\n setViewport: (viewport: Viewport.UseEvent) => void;\n addViewportHandler: (handler: Viewport.UseHandler) => Destructor;\n setHold: (hold: boolean) => void;\n}\n\nconst Context = createContext<LinePlotContextValue | null>(null);\n\nexport const useContext = (component: string): LinePlotContextValue => {\n const ctx = reactUseContext(Context);\n if (ctx == null)\n throw new Error(`Cannot to use ${component} as a non-child of LinePlot.`);\n return ctx;\n};\n\nexport const useViewport = (handle: Viewport.UseHandler): void => {\n const ctx = useContext(\"Viewport\");\n const { addViewportHandler } = ctx;\n useEffect(() => addViewportHandler(handle), [addViewportHandler, handle]);\n};\n\nexport const useGridEntry = (meta: GridEntrySpec, component: string): CSSProperties => {\n const { setGridEntry, removeGridEntry } = useContext(component);\n const { key } = meta;\n useEffectCompare(\n () => {\n location.outer.parse(meta.loc);\n setGridEntry(meta);\n },\n ([a], [b]) => deep.equal(a, b),\n [meta],\n );\n useEffect(() => {\n return () => removeGridEntry(key);\n }, []);\n const dir = direction.swap(location.direction(meta.loc));\n const gridArea =\n dir === \"x\"\n ? `axis-start-${key} / plot-start / axis-end-${key} / plot-end`\n : `plot-start / axis-start-${key} / plot-end / axis-end-${key}`;\n return { gridArea };\n};\n\nexport interface LineSpec {\n key: string;\n color: Color.Crude;\n label: string;\n}\n\ntype LineState = LineSpec[];\n\nexport interface LinePlotProps\n extends PropsWithChildren,\n Partial<Pick<z.input<typeof lineplot.linePlotStateZ>, \"clearOverScan\" | \"hold\">>,\n HTMLDivProps {\n resizeDebounce?: number;\n onHold?: (hold: boolean) => void;\n}\n\nexport const LinePlot = Aether.wrap<LinePlotProps>(\n \"LinePlot\",\n ({\n aetherKey,\n style,\n resizeDebounce: debounce = 0,\n clearOverScan = xy.ZERO,\n children,\n hold = false,\n onHold,\n ...props\n }): ReactElement => {\n const [lines, setLines] = useState<LineState>([]);\n\n const memoProps = useMemoDeepEqualProps({ clearOverScan, hold });\n\n const [{ path }, { grid }, setState] = Aether.use({\n aetherKey,\n type: lineplot.LinePlot.TYPE,\n schema: lineplot.linePlotStateZ,\n initialState: {\n container: box.ZERO,\n viewport: box.DECIMAL,\n grid: {},\n ...memoProps,\n },\n });\n\n useEffect(() => setState((prev) => ({ ...prev, ...memoProps })), [memoProps]);\n\n const viewportHandlers = useRef<Map<Viewport.UseHandler, null>>(new Map());\n\n const addViewportHandler = useCallback(\n (handler: Viewport.UseHandler) => {\n viewportHandlers.current.set(handler, null);\n return () => viewportHandlers.current.delete(handler);\n },\n [viewportHandlers],\n );\n\n const setViewport: Viewport.UseHandler = useCallback(\n (args) => {\n const { mode, box, stage } = args;\n if (\n (mode === \"pan\" && stage !== \"start\") ||\n mode === \"zoom\" ||\n (mode === \"zoomReset\" && stage === \"start\")\n )\n setState((prev) => ({ ...prev, viewport: box }));\n viewportHandlers.current.forEach((_, handler) => handler(args));\n },\n [setState],\n );\n\n // We use a single resize handler for both the container and plotting region because\n // the container is guaranteed to only resize if the plotting region does. This allows\n // us to save a window observer.\n const handleResize = useCallback(\n (container: box.Box) => setState((prev) => ({ ...prev, container })),\n [setState],\n );\n\n const ref = Canvas.useRegion(handleResize);\n\n const setGridEntry: LinePlotContextValue[\"setGridEntry\"] = useCallback(\n (meta: GridEntrySpec) =>\n setState((prev) => ({\n ...prev,\n grid: { ...prev.grid, [meta.key]: meta },\n })),\n [setState],\n );\n\n const removeGridEntry = useCallback(\n (key: string) =>\n setState((prev) => {\n const { [key]: _, ...grid } = prev.grid;\n return { ...prev, grid };\n }),\n [setState],\n );\n\n const setLine = useCallback(\n (meta: LineSpec) => {\n setLines((prev) => [...prev.filter(({ key }) => key !== meta.key), meta]);\n },\n [setLines, setViewport],\n );\n\n const removeLine = useCallback(\n (key: string) => setLines((prev) => prev.filter(({ key: k }) => k !== key)),\n [setLine],\n );\n\n const cssGrid = useMemo(() => buildPlotGrid(grid), [grid]);\n\n const setHold = useCallback(\n (hold: boolean) => {\n setState((prev) => ({ ...prev, hold }));\n onHold?.(hold);\n },\n [setState, onHold],\n );\n\n const contextValue = useMemo<LinePlotContextValue>(\n () => ({\n lines,\n setGridEntry,\n removeGridEntry,\n setLine,\n removeLine,\n setViewport,\n addViewportHandler,\n setHold,\n }),\n [\n lines,\n setGridEntry,\n removeGridEntry,\n setLine,\n removeLine,\n setViewport,\n addViewportHandler,\n setHold,\n ],\n );\n\n return (\n <div\n className={CSS.B(\"line-plot\")}\n style={{ ...style, ...cssGrid }}\n ref={ref}\n {...props}\n >\n <Context.Provider value={contextValue}>\n <Aether.Composite path={path}>{children}</Aether.Composite>\n </Context.Provider>\n </div>\n );\n },\n);\n\nconst buildPlotGrid = (grid: GridSpec): CSSProperties => {\n const b = CSS.newGridBuilder();\n filterGridEntries(\"top\", grid).forEach(({ key, size }) =>\n b.row(`axis-start-${key}`, `axis-end-${key}`, size),\n );\n b.row(\"plot-start\", \"plot-end\", \"minmax(0, 1fr)\");\n filterGridEntries(\"bottom\", grid).forEach(({ key, size }) =>\n b.row(`axis-start-${key}`, `axis-end-${key}`, size),\n );\n filterGridEntries(\"left\", grid).forEach(({ key, size }) =>\n b.col(`axis-start-${key}`, `axis-end-${key}`, size),\n );\n b.col(\"plot-start\", \"plot-end\", \"minmax(0, 1fr)\");\n filterGridEntries(\"right\", grid).forEach(({ key, size }) =>\n b.col(`axis-start-${key}`, `axis-end-${key}`, size),\n );\n return b.build();\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Legend as Core } from \"@/vis/legend\";\nimport { type LineSpec, useContext } from \"@/vis/lineplot/LinePlot\";\n\nimport \"@/vis/legend/Container.css\";\n\nexport interface LegendProps extends Omit<Core.SimpleProps, \"data\" | \"onEntryChange\"> {\n onLineChange?: (line: LineSpec) => void;\n}\n\nexport const Legend = ({\n className,\n style,\n onLineChange,\n ...props\n}: LegendProps): ReactElement | null => {\n const { lines } = useContext(\"Legend\");\n useContext(\"Legend\");\n return <Core.Simple data={lines} onEntryChange={onLineChange} {...props} />;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useLayoutEffect } from \"react\";\n\nimport { type Optional } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { line } from \"@/vis/line/aether\";\n\nexport interface LineProps extends Optional<Omit<line.State, \"key\">, \"strokeWidth\"> {}\n\nexport const Line = Aether.wrap<LineProps>(\n \"Line\",\n ({ aetherKey, ...props }): ReactElement | null => {\n const [, , setState] = Aether.use({\n aetherKey,\n type: line.Line.TYPE,\n schema: line.stateZ,\n initialState: props,\n });\n const memoProps = useMemoDeepEqualProps(props);\n useLayoutEffect(() => setState(memoProps), [memoProps]);\n return null;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useEffect } from \"react\";\n\nimport { Aether } from \"@/aether\";\nimport { Line as Core } from \"@/vis/line\";\nimport { useContext } from \"@/vis/lineplot/LinePlot\";\n\nexport interface LineProps extends Core.LineProps {}\n\nexport const Line = Aether.wrap<LineProps>(\n \"Line\",\n ({ aetherKey, color, label = \"\", ...props }): ReactElement => {\n const { setLine, removeLine } = useContext(\"Line\");\n useEffect(() => {\n setLine({\n key: aetherKey,\n color,\n label,\n });\n return () => removeLine(aetherKey);\n }, [label, color]);\n return <Core.Line aetherKey={aetherKey} color={color} label={label} {...props} />;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Align } from \"@/align\";\nimport { useUniqueKey } from \"@/hooks/useUniqueKey\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\nimport { useGridEntry } from \"@/vis/lineplot/LinePlot\";\n\nexport type TitleProps<L extends Text.Level = \"h2\"> = Text.MaybeEditableProps<L>;\n\nexport const Title = <L extends Text.Level = \"h2\">({\n level = \"h2\" as TitleProps<L>[\"level\"],\n ...props\n}: TitleProps<L>): ReactElement => {\n const key = useUniqueKey();\n const font = Theming.useTypography(level);\n const gridStyle = useGridEntry(\n {\n key,\n size: (font.lineHeight + 2) * font.baseSize,\n loc: \"top\",\n order: \"first\",\n },\n \"Title\",\n );\n return (\n <Align.Space justify=\"center\" align=\"center\" style={gridStyle}>\n {/* @ts-expect-error */}\n <Text.MaybeEditable<L> {...props} level={level} />\n </Align.Space>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type CSSProperties, type ReactElement, forwardRef } from \"react\";\n\nimport { box } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { type UseReturn, type Mode } from \"@/viewport/use\";\n\nimport \"@/viewport/Mask.css\";\n\ntype DivProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n>;\n\nexport interface MaskProps\n extends Omit<UseReturn, \"ref\">,\n Omit<DivProps, \"onDragStart\" | \"onDragEnd\" | \"onDrag\" | \"ref\" | \"onDoubleClick\"> {}\n\nconst MODE_CURSORS: Record<Mode, CSSProperties[\"cursor\"]> = {\n select: \"pointer\",\n zoom: \"crosshair\",\n pan: \"grab\",\n zoomReset: \"crosshair\",\n click: \"pointer\",\n};\n\nexport const Mask = forwardRef<HTMLDivElement, MaskProps>(\n (\n { className, mode, maskBox, children, style, ...props },\n ref,\n ): ReactElement | null => (\n <div\n ref={ref}\n className={CSS(CSS.noSelect, CSS.BE(\"viewport-mask\", \"container\"), className)}\n style={{\n cursor: MODE_CURSORS[mode],\n ...style,\n }}\n {...props}\n >\n <div\n style={{\n ...box.css(maskBox),\n display: box.areaIsZero(maskBox) ? \"none\" : \"block\",\n }}\n className={CSS.BE(\"viewport-mask\", \"selection\")}\n />\n {children}\n </div>\n ),\n);\nMask.displayName = \"ZoomPanMask\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type MutableRefObject,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ForwardedRef,\n} from \"react\";\n\nimport { box, xy, dimensions, location, scale } from \"@synnaxlabs/x\";\n\nimport { useStateRef } from \"@/hooks/ref\";\nimport { useMemoCompare } from \"@/memo\";\nimport { Triggers } from \"@/triggers\";\n\nexport interface UseEvent {\n box: box.Box;\n cursor: xy.XY;\n mode: Mode;\n stage: Triggers.Stage;\n}\n\nexport type UseHandler = (e: UseEvent) => void;\n\nexport type UseTriggers = Triggers.ModeConfig<TriggerMode>;\n\nexport interface UseRefValue {\n reset: () => void;\n}\n\nexport interface UseProps {\n triggers?: UseTriggers;\n onChange?: UseHandler;\n resetOnDoubleClick?: boolean;\n threshold?: dimensions.Dimensions;\n initial?: box.Box;\n ref?:\n | MutableRefObject<UseRefValue | undefined>\n | ForwardedRef<UseRefValue | undefined>;\n}\n\nexport interface UseReturn {\n mode: Mode;\n maskBox: box.Box;\n ref: React.MutableRefObject<HTMLDivElement | null>;\n}\n\nconst TRUNC_PRECISION = 6;\n\ntype StringLiteral<T> = T extends string ? (string extends T ? never : T) : never;\n\nconst TRIGGER_MODES = [\"zoom\", \"pan\", \"select\", \"zoomReset\"] as const;\nexport const MODES = [...TRIGGER_MODES, \"click\"] as const;\nexport type Mode = StringLiteral<(typeof MODES)[number]>;\ntype TriggerMode = StringLiteral<(typeof TRIGGER_MODES)[number]>;\nexport const MASK_MODES: Mode[] = [\"zoom\", \"select\"];\n\nexport const ZOOM_DEFAULT_TRIGGERS: UseTriggers = {\n defaultMode: \"zoom\",\n zoom: [[\"MouseLeft\"]],\n zoomReset: [[\"MouseLeft\", \"Control\"]],\n pan: [[\"MouseLeft\", \"Shift\"]],\n select: [[\"MouseLeft\", \"Alt\"]],\n};\n\nexport const PAN_DEFAULT_TRIGGERS: UseTriggers = {\n defaultMode: \"pan\",\n pan: [[\"MouseLeft\"]],\n zoom: [[\"MouseLeft\", \"Shift\"]],\n zoomReset: [[\"MouseLeft\", \"Control\"]],\n select: [[\"MouseLeft\", \"Alt\"]],\n};\n\nexport const SELECT_DEFAULT_TRIGGERS: UseTriggers = {\n defaultMode: \"select\",\n select: [[\"MouseLeft\"]],\n pan: [[\"MouseLeft\", \"Shift\"]],\n zoom: [[\"MouseLeft\", \"Alt\"]],\n zoomReset: [[\"MouseLeft\", \"Control\"]],\n};\n\nexport const DEFAULT_TRIGGERS: Record<Mode, UseTriggers> = {\n zoom: ZOOM_DEFAULT_TRIGGERS,\n pan: PAN_DEFAULT_TRIGGERS,\n select: SELECT_DEFAULT_TRIGGERS,\n zoomReset: ZOOM_DEFAULT_TRIGGERS,\n click: ZOOM_DEFAULT_TRIGGERS,\n};\n\nconst purgeMouseTriggers = (triggers: UseTriggers): UseTriggers => {\n const e = Object.entries(triggers) as Array<\n [TriggerMode | \"defaultMode\", Triggers.Trigger[]]\n >;\n return Object.fromEntries(\n e.map(([key, value]: [string, Triggers.Trigger[]]) => {\n if (key === \"defaultMode\") return [key, value];\n return [\n key,\n value\n .map((t) => t.filter((k) => k !== \"MouseLeft\"))\n .filter((t) => t.length > 0),\n ];\n }),\n ) as unknown as UseTriggers;\n};\n\nconst D = box.construct(0, 0, 1, 1, location.TOP_LEFT);\n\nconst DEFAULT_THRESHOLD = { width: 30, height: 50 };\n\nexport const use = ({\n onChange,\n triggers: initialTriggers,\n initial = D,\n threshold: threshold_ = DEFAULT_THRESHOLD,\n ref,\n}: UseProps): UseReturn => {\n const defaultMode = initialTriggers?.defaultMode ?? \"zoom\";\n\n const [maskBox, setMaskBox] = useState<box.Box>(box.ZERO);\n const [maskMode, setMaskMode] = useState<Mode>(defaultMode);\n const [stateRef, setStateRef] = useStateRef<box.Box>(initial);\n const canvasRef = useRef<HTMLDivElement | null>(null);\n const threshold = dimensions.construct(threshold_);\n\n useEffect(() => setStateRef(() => box.truncate(initial, 3)), [initial]);\n useEffect(() => setMaskMode(defaultMode), [defaultMode]);\n\n const [triggerConfig, reducedTriggerConfig, purgedTriggers, reducedPurgedTriggers] =\n useMemoCompare(\n (): [UseTriggers, Triggers.Trigger[], UseTriggers, Triggers.Trigger[]] => {\n const config: UseTriggers = {\n ...DEFAULT_TRIGGERS[defaultMode],\n ...initialTriggers,\n };\n const reducedTriggers = Triggers.flattenConfig(config);\n const mouseTriggers = purgeMouseTriggers(config);\n return [\n config,\n reducedTriggers,\n mouseTriggers,\n Triggers.flattenConfig(mouseTriggers),\n ];\n },\n Triggers.compareModeConfigs,\n [initialTriggers],\n );\n\n const handleDrag = useCallback<Triggers.DragCallback>(\n ({ box: box_, triggers, stage, cursor }): void => {\n if (canvasRef.current == null) return;\n const mode = Triggers.determineMode<TriggerMode>(triggerConfig, triggers);\n const canvas = box.construct(canvasRef.current);\n if (mode == null) return;\n\n if (mode === \"zoomReset\") {\n setMaskBox(box.ZERO);\n onChange?.({ box: box.DECIMAL, mode, stage, cursor });\n return setStateRef(box.DECIMAL);\n }\n\n if (stage === \"end\") {\n // This prevents clicks from being registered as a drag\n if (box.width(box_) < 5 && box.height(box_) < 5) {\n if (mode === \"zoom\") setMaskBox(box.ZERO);\n onChange?.({ box: stateRef.current, mode: \"click\", stage, cursor });\n return;\n }\n return setStateRef((prev) => {\n if (mode === \"pan\") {\n const next = handlePan(box_, prev, canvas);\n if (next === null) return prev;\n onChange?.({ box: next, mode, stage, cursor });\n return next;\n }\n const next = handleZoomSelect(box_, prev, canvas);\n if (next === null) return prev;\n onChange?.({ box: next, mode, stage, cursor });\n\n if (mode === \"zoom\") {\n setMaskBox(box.ZERO);\n return next;\n }\n return box.truncate(prev, TRUNC_PRECISION);\n });\n }\n\n if (MASK_MODES.includes(mode)) {\n if (box.height(box_) < 5 && box.width(box_) < 5) return;\n return setMaskBox(\n scale.XY.scale(canvas)\n .clamp(canvas)\n .translate({ x: -box.left(canvas), y: -box.top(canvas) })\n .box(fullSize(threshold, box_, canvas)),\n );\n }\n\n setMaskBox((prev) => (!box.areaIsZero(prev) ? box.ZERO : prev));\n const next = handlePan(box_, stateRef.current, canvas);\n if (box.equals(next, stateRef.current)) return;\n onChange?.({\n box: next,\n mode,\n stage,\n cursor,\n });\n },\n [\n setMaskBox,\n setMaskMode,\n onChange,\n triggerConfig,\n threshold_.height,\n threshold_.width,\n setStateRef,\n canvasRef,\n ],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n reset: () => {\n setMaskBox(box.ZERO);\n setStateRef(box.DECIMAL);\n onChange?.({\n box: box.DECIMAL,\n mode: \"zoomReset\",\n stage: \"start\",\n cursor: xy.ZERO,\n });\n },\n }),\n [onChange],\n );\n\n const handleZoomSelect = useCallback(\n (b: box.Box, prev: box.Box, canvas: box.Box): box.Box | null =>\n box.truncate(\n constructScale(prev, canvas).box(fullSize(threshold, b, canvas)),\n TRUNC_PRECISION,\n ),\n [threshold_],\n );\n\n const verticalTrigger = Triggers.useHeldRef({ triggers: [[\"Control\"]] });\n const horizontalTrigger = Triggers.useHeldRef({ triggers: [[\"Alt\"]] });\n\n useEffect(() => {\n const handler = (e: WheelEvent): void => {\n if (canvasRef.current == null) return;\n let sf = 1;\n if (e.deltaY < 0) sf -= 0.035;\n else sf += 0.035;\n const canvasBox = box.construct(canvasRef.current);\n const rawCursor = xy.construct(e);\n if (!box.contains(canvasBox, rawCursor) || e.target !== canvasRef.current) return;\n const s2 = constructScale(stateRef.current, box.construct(canvasRef.current));\n const cursor = s2.pos(xy.construct(e));\n const s = scale.XY.magnify({\n x: verticalTrigger.current.held ? 1 : sf,\n y: horizontalTrigger.current.held ? 1 : sf,\n });\n let next = s.box(stateRef.current);\n next = box.translate(next, {\n x: verticalTrigger.current.held ? 0 : cursor.x * (1 - sf),\n y: horizontalTrigger.current.held ? 0 : cursor.y * (1 - sf),\n });\n setStateRef(next);\n onChange?.({\n stage: \"end\",\n box: next,\n cursor: xy.construct(e),\n mode: \"zoom\",\n });\n };\n window.addEventListener(\"wheel\", handler);\n return () => window.removeEventListener(\"wheel\", handler);\n }, [setStateRef, onChange]);\n\n Triggers.useDrag({\n bound: canvasRef,\n onDrag: handleDrag,\n triggers: reducedTriggerConfig,\n loose: true,\n });\n\n const handleKeyTrigger = useCallback(\n ({ triggers, stage }: Triggers.UseEvent) => {\n if (stage === \"end\") return setMaskMode(defaultMode);\n const mode = Triggers.determineMode<TriggerMode>(purgedTriggers, triggers);\n if (mode == null) return;\n setMaskMode(mode);\n },\n [purgedTriggers, defaultMode, onChange],\n );\n\n Triggers.use({\n triggers: reducedPurgedTriggers,\n callback: handleKeyTrigger,\n region: canvasRef,\n });\n\n return {\n maskBox,\n ref: canvasRef,\n mode: maskMode,\n };\n};\n\nconst constructScale = (prev: box.Box, canvas: box.Box): scale.XY =>\n scale.XY.scale(canvas).clamp(canvas).scale(prev);\n\nconst handlePan = (b: box.Box, prev: box.Box, canvas: box.Box): box.Box => {\n let dims = box.signedDims(constructScale(prev, canvas).box(b));\n dims = { signedWidth: -dims.signedWidth, signedHeight: -dims.signedHeight };\n return box.truncate(\n scale.XY.translate(xy.construct(dims)).box(prev),\n TRUNC_PRECISION,\n );\n};\n\nconst fullSize = (\n threshold: dimensions.Dimensions,\n b: box.Box,\n parent: box.Box,\n): box.Box => {\n if (box.height(b) <= threshold.height)\n return box.construct(\n box.left(b),\n box.top(parent),\n box.width(b),\n box.height(parent),\n );\n if (box.width(b) <= threshold.width)\n return box.construct(\n box.left(parent),\n box.top(b),\n box.width(parent),\n box.height(b),\n );\n return b;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\n\nexport const ClearButton = (\n props: Omit<Button.IconProps, \"children\">,\n): ReactElement => (\n <Button.Icon className={CSS.BE(\"select\", \"clear\")} variant=\"outlined\" {...props}>\n <Icon.Close aria-label=\"clear\" />\n </Button.Icon>\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Button } from \"@/button\";\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Text } from \"@/text\";\nimport { type ComponentSize } from \"@/util/component\";\n\nimport \"@/tag/Tag.css\";\n\nexport interface TagProps extends Omit<Text.TextProps, \"level\" | \"size\" | \"wrap\"> {\n icon?: ReactElement;\n onClose?: () => void;\n color?: Color.Crude;\n size?: ComponentSize;\n variant?: \"filled\" | \"outlined\";\n}\n\nexport const Tag = ({\n children = \"\",\n size = \"medium\",\n variant = \"filled\",\n color,\n icon,\n onClose,\n className,\n onDragStart,\n ...props\n}: TagProps): ReactElement => {\n const cssColor = Color.cssString(color);\n if (icon == null && color != null) icon = <Icon.Circle fill={cssColor} />;\n const closeIcon =\n onClose == null ? undefined : (\n <Button.Icon\n aria-label=\"close\"\n size={size}\n className={CSS.BE(\"tag\", \"close\")}\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n >\n <Icon.Close />\n </Button.Icon>\n );\n return (\n // @ts-expect-error - TODO: Generic Elements are weird\n <Text.WithIcon\n startIcon={icon}\n endIcon={closeIcon}\n className={CSS(\n className,\n CSS.B(\"tag\"),\n onClose != null && CSS.BM(\"tag\", \"closeable\"),\n )}\n level={Text.ComponentSizeLevels[size]}\n noWrap\n align=\"center\"\n onDragStart={onDragStart}\n {...props}\n >\n {children}\n </Text.WithIcon>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type ReactElement,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n convertRenderV,\n type Key,\n type Keyed,\n type AsyncTermSearcher,\n compare,\n toArray,\n type RenderableValue,\n} from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { type Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { useAsyncEffect } from \"@/hooks\";\nimport { Input } from \"@/input\";\nimport { List as CoreList } from \"@/list\";\nimport { selectValueIsZero, type UseSelectMultipleProps } from \"@/list/useSelect\";\nimport { ClearButton } from \"@/select/ClearButton\";\nimport { Core } from \"@/select/List\";\nimport { Tag } from \"@/tag\";\nimport { type RenderProp, componentRenderProp } from \"@/util/renderProp\";\n\nimport \"@/select/Multiple.css\";\n\nexport interface MultipleProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends Omit<Dropdown.DialogProps, \"visible\" | \"onChange\" | \"children\" | \"close\">,\n Omit<UseSelectMultipleProps<K, E>, \"data\">,\n Omit<CoreList.ListProps<K, E>, \"children\">,\n Pick<Input.TextProps, \"placeholder\"> {\n columns?: Array<CoreList.ColumnSpec<K, E>>;\n searcher?: AsyncTermSearcher<string, K, E>;\n entryRenderKey?: keyof E | ((e: E) => string | number);\n renderTag?: RenderProp<MultipleTagProps<K, E>>;\n onTagDragStart?: (e: React.DragEvent<HTMLDivElement>, key: K) => void;\n onTagDragEnd?: (e: React.DragEvent<HTMLDivElement>, key: K) => void;\n}\n\n/**\n * Allows a user to browse, search for, and select multiple values from a list of\n * options. It's important to note that Select maintains no internal selection state.\n * The caller must provide the selected value via the `value` prop and handle any\n * changes via the `onChange` prop.\n *\n * @param props - The props for the component. Any additional props will be passed to\n * the input group containing the selection input and the selected tags.\n * @param props.data - The data to be used to populate the select options.\n * @param props.columns - The columns to be used to render the select options in the\n * dropdown. See the {@link ListColumn} type for more details on how to configure\n * columns.\n * @param props.entryRenderKey - The option field rendered for each tag when selected in the\n * input group. Defaults to \"key\".\n * @param props.location - Whether to render the dropdown above or below the select\n * component. Defaults to \"below\".\n * @param props.onChange - The callback to be invoked when the selected value changes.\n * @param props.value - The currently selected value.\n */\nexport const Multiple = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n onChange,\n value,\n className,\n data,\n columns = [],\n entryRenderKey = \"key\",\n emptyContent,\n searcher,\n renderTag,\n placeholder,\n onTagDragStart,\n allowMultiple,\n allowNone,\n replaceOnSingle,\n onTagDragEnd,\n style,\n ...props\n}: MultipleProps<K, E>): ReactElement => {\n const { visible, open, close } = Dropdown.use();\n const [selected, setSelected] = useState<readonly E[]>([]);\n const [loading, setLoading] = useState(false);\n const searchMode = searcher != null;\n\n // This hook makes sure we have the selected entries fetched to render their tags\n // properly.\n useAsyncEffect(async () => {\n setLoading(true);\n if (selectValueIsZero(value)) setSelected([]);\n const inSelected = selected.map((v) => v.key);\n const nextValue = toArray(value);\n if (compare.unorderedPrimitiveArrays(inSelected, nextValue) === compare.EQUAL)\n return;\n let nextSelected: E[] = [];\n if (searchMode) {\n // Wrap this in a try-except clause just in case the searcher throws an error.\n try {\n nextSelected = await searcher.retrieve(nextValue);\n } finally {\n setLoading(false);\n }\n } else if (data != null)\n nextSelected = data.filter((v) => nextValue.includes(v.key));\n setSelected(nextSelected);\n }, [searcher, searchMode, value, data]);\n\n const handleChange: UseSelectMultipleProps<K, E>[\"onChange\"] = useCallback(\n (v, extra) => {\n setSelected(extra.entries);\n onChange(v, extra);\n },\n [onChange],\n );\n\n const InputWrapper = useMemo(\n () => (searchMode ? CoreList.Search : CoreList.Filter),\n [searchMode],\n );\n\n return (\n <Core<K, E>\n close={close}\n open={open}\n data={data}\n emptyContent={emptyContent}\n visible={visible}\n value={value}\n onChange={handleChange}\n allowNone={allowNone}\n replaceOnSingle={replaceOnSingle}\n columns={columns}\n allowMultiple\n {...props}\n >\n <InputWrapper<K, E> searcher={searcher}>\n {({ onChange, value: inputValue }) => (\n <MultipleInput<K, E>\n value={inputValue}\n selectedKeys={value}\n className={className}\n onChange={onChange}\n loading={loading}\n selected={selected}\n onFocus={open}\n entryRenderKey={entryRenderKey}\n visible={visible}\n renderTag={renderTag}\n placeholder={placeholder}\n onTagDragStart={onTagDragStart}\n onTagDragEnd={onTagDragEnd}\n style={style}\n />\n )}\n </InputWrapper>\n </Core>\n );\n};\n\ninterface SelectMultipleInputProps<K extends Key, E extends Keyed<K>>\n extends Omit<Input.TextProps, \"onFocus\"> {\n loading: boolean;\n selectedKeys: K | K[];\n selected: readonly E[];\n entryRenderKey: keyof E | ((e: E) => string | number);\n visible: boolean;\n renderTag?: RenderProp<MultipleTagProps<K, E>>;\n onTagDragStart?: (e: React.DragEvent<HTMLDivElement>, key: K) => void;\n onTagDragEnd?: (e: React.DragEvent<HTMLDivElement>, key: K) => void;\n onFocus?: () => void;\n}\n\nconst MultipleInput = <K extends Key, E extends Keyed<K>>({\n selectedKeys,\n loading,\n selected,\n onChange,\n onFocus,\n visible,\n entryRenderKey,\n renderTag = componentRenderProp(MultipleTag<K, E>),\n placeholder = \"Select...\",\n onTagDragStart,\n onTagDragEnd,\n value,\n className,\n ...props\n}: SelectMultipleInputProps<K, E>): ReactElement => {\n const { onSelect, clear } = CoreList.useSelectionUtils();\n const ref = useRef<HTMLInputElement>(null);\n\n useLayoutEffect(() => {\n if (visible) ref.current?.focus();\n }, [visible, selected]);\n\n const handleFocus: Input.TextProps[\"onFocus\"] = (e) => {\n if (!visible) onChange(\"\");\n onFocus?.();\n };\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>): void => {\n if (visible) return;\n onFocus?.();\n };\n\n const handleBlur = (): void => {\n if (visible) return;\n onChange(\"\");\n };\n\n return (\n <Input.Text\n ref={ref}\n className={CSS(\n CSS.BE(\"select-multiple\", \"input\"),\n CSS.visible(visible),\n className,\n )}\n onBlur={handleBlur}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onFocus={handleFocus}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n onClick={handleClick}\n {...props}\n >\n <Align.Space\n direction=\"x\"\n className={CSS.BE(\"select-multiple\", \"tags\")}\n align=\"center\"\n grow\n >\n {toArray(selectedKeys).map((k, i) => {\n const e = selected[i];\n return renderTag({\n key: k,\n entryKey: k,\n entryRenderKey,\n loading,\n entry: e,\n onClose: () => onSelect?.(k),\n onDragStart: (ev) => onTagDragStart?.(ev, k),\n onDragEnd: (ev) => onTagDragEnd?.(ev, k),\n });\n })}\n </Align.Space>\n <ClearButton onClick={clear} />\n </Input.Text>\n );\n};\n\nexport interface MultipleTagProps<K extends Key, E extends Keyed<K>> {\n key: K;\n entryKey: K;\n entryRenderKey: keyof E | ((e: E) => string | number);\n entry?: E;\n color?: Color.Crude;\n loading: boolean;\n onClose?: () => void;\n onDragStart: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>) => void;\n}\n\nexport const MultipleTag = <K extends Key, E extends Keyed<K>>({\n entryKey,\n entryRenderKey,\n entry,\n loading,\n ...props\n}: MultipleTagProps<K, E>): ReactElement => {\n let v: RenderableValue = entryKey;\n if (entry != null)\n v =\n typeof entryRenderKey === \"function\"\n ? entryRenderKey(entry)\n : (entry[entryRenderKey] as RenderableValue);\n return (\n <Tag.Tag\n size=\"small\"\n variant=\"outlined\"\n className={CSS(\n entry == null && !loading && CSS.BEM(\"select-multiple\", \"tag\", \"invalid\"),\n )}\n draggable\n {...props}\n key={entryKey.toString()}\n >\n {convertRenderV(v)}\n </Tag.Tag>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type FocusEventHandler,\n type ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport {\n type AsyncTermSearcher,\n type Key,\n primitiveIsZero,\n type Keyed,\n} from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { useAsyncEffect } from \"@/hooks\";\nimport { Input } from \"@/input\";\nimport { List as CoreList } from \"@/list\";\nimport {\n selectValueIsZero,\n type UseSelectSingleProps,\n type UseSelectOnChangeExtra,\n} from \"@/list/useSelect\";\nimport { ClearButton } from \"@/select/ClearButton\";\nimport { Core } from \"@/select/List\";\n\nimport \"@/select/Single.css\";\n\nexport interface SingleProps<K extends Key, E extends Keyed<K>>\n extends Omit<\n Dropdown.DialogProps,\n \"onChange\" | \"visible\" | \"children\" | \"variant\" | \"close\"\n >,\n Omit<UseSelectSingleProps<K, E>, \"data\" | \"allowMultiple\">,\n Omit<CoreList.ListProps<K, E>, \"children\">,\n Pick<Input.TextProps, \"variant\" | \"disabled\"> {\n entryRenderKey?: keyof E | ((e: E) => string | number);\n columns?: Array<CoreList.ColumnSpec<K, E>>;\n inputProps?: Omit<Input.TextProps, \"onChange\">;\n searcher?: AsyncTermSearcher<string, K, E>;\n hideColumnHeader?: boolean;\n omit?: Array<K>;\n}\n\n/**\n * Allows a user to browse, search for, and select a value from a list of options.\n * It's important to note that Select maintains no internal selection state. The caller\n * must provide the selected value via the `value` prop and handle any changes via the\n * `onChange` prop.\n *\n * @param props - The props for the component. Any additional props will be passed to the\n * underlying input element.\n * @param props.data - The data to be used to populate the select options.\n * @param props.columns - The columns to be used to render the select options in the\n * dropdown. See the {@link ListColumn} type for more details on available options.\n * @param props.entryRenderKey - The option field rendered when selected. Defaults to \"key\".\n * @param props.location - Whether to render the dropdown above or below the select\n * component. Defaults to \"below\".\n * @param props.onChange - The callback to be invoked when the selected value changes.\n * @param props.value - The currently selected value.\n */\nexport const Single = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n onChange,\n value,\n entryRenderKey = \"key\",\n columns,\n data,\n emptyContent,\n inputProps,\n allowNone,\n searcher,\n className,\n variant,\n hideColumnHeader = false,\n disabled,\n omit,\n ...props\n}: SingleProps<K, E>): ReactElement => {\n const { visible, open, close } = Dropdown.use();\n const [selected, setSelected] = useState<E | null>(null);\n const searchMode = searcher != null;\n\n // This hook runs to make sure we have the selected entry populated when the value\n // changes externally.\n useAsyncEffect(async () => {\n if (selectValueIsZero(value)) return setSelected(null);\n if (selected?.key === value) return;\n let nextSelected: E | null = null;\n if (searchMode)\n // Wrap this in a try-except clause just in case the searcher throws an error.\n try {\n [nextSelected] = await searcher.retrieve([value]);\n } finally {\n // It might be undefined, so coalesce it to null.\n nextSelected ??= null;\n }\n else if (data != null) nextSelected = data.find((e) => e.key === value) ?? null;\n setSelected(nextSelected);\n }, [searcher, value, data]);\n\n const handleChange = useCallback<UseSelectSingleProps<K, E>[\"onChange\"]>(\n (v: K, e: UseSelectOnChangeExtra<K, E>): void => {\n setSelected(v == null ? null : e.entries[0]);\n close();\n onChange(v, e);\n },\n [onChange, allowNone],\n );\n\n const InputWrapper = useMemo(\n () => (searchMode ? CoreList.Search : CoreList.Filter),\n [searchMode],\n );\n\n return (\n <Core<K, E>\n close={close}\n open={open}\n data={data}\n omit={omit}\n emptyContent={emptyContent}\n allowMultiple={false}\n visible={visible}\n value={value}\n hideColumnHeader={hideColumnHeader}\n onChange={handleChange}\n allowNone={allowNone}\n columns={columns}\n {...props}\n >\n <InputWrapper<K, E> searcher={searcher}>\n {({ onChange }) => (\n <SingleInput<K, E>\n variant={variant}\n onChange={onChange}\n onFocus={open}\n selected={selected}\n entryRenderKey={entryRenderKey}\n visible={visible}\n allowNone={allowNone}\n className={className}\n disabled={disabled}\n />\n )}\n </InputWrapper>\n </Core>\n );\n};\n\nexport interface SelectInputProps<K extends Key, E extends Keyed<K>>\n extends Omit<Input.TextProps, \"value\" | \"onFocus\"> {\n entryRenderKey: keyof E | ((e: E) => string | number);\n selected: E | null;\n visible: boolean;\n debounceSearch?: number;\n allowNone?: boolean;\n onFocus: () => void;\n}\n\nconst SingleInput = <K extends Key, E extends Keyed<K>>({\n entryRenderKey,\n selected,\n visible,\n onChange,\n onFocus,\n allowNone = true,\n debounceSearch = 250,\n placeholder = \"Select...\",\n className,\n ...props\n}: SelectInputProps<K, E>): ReactElement => {\n const { clear } = CoreList.useSelectionUtils();\n // We maintain our own value state for two reasons:\n //\n // 1. So we can avoid executing a search when the user selects an item and hides the\n // dropdown.\n // 2. So that we can display the previous search results when the user focuses on the\n // while still being able to clear the input value for searching.\n //\n const [internalValue, setInternalValue] = useState(\"\");\n\n // Runs to set the value of the input to the item selected from the list.\n useEffect(() => {\n if (visible) return;\n if (primitiveIsZero(selected?.key)) return setInternalValue(\"\");\n if (selected == null) return;\n if (typeof entryRenderKey === \"function\")\n return setInternalValue(entryRenderKey(selected).toString());\n else\n return setInternalValue(\n (selected?.[entryRenderKey] as string | number).toString(),\n );\n }, [selected, visible, entryRenderKey]);\n\n const handleChange = (v: string): void => {\n onChange(v);\n setInternalValue(v);\n };\n\n const handleFocus: FocusEventHandler<HTMLInputElement> = (e) => {\n setInternalValue(\"\");\n onFocus?.();\n };\n\n const handleClick: React.MouseEventHandler<HTMLInputElement> = (e) => {\n if (visible) return;\n e.preventDefault();\n onFocus?.();\n };\n\n const handleClear = (): void => {\n setInternalValue(\"\");\n clear?.();\n };\n\n return (\n <Input.Text\n className={CSS(CSS.BE(\"select\", \"input\"), className)}\n value={internalValue}\n onChange={handleChange}\n onFocus={handleFocus}\n style={{ flexGrow: 1 }}\n onClick={handleClick}\n placeholder={placeholder}\n {...props}\n >\n {allowNone && <ClearButton onClick={handleClear} />}\n </Input.Text>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { type direction } from \"@synnaxlabs/x\";\n\nimport { Button as CoreButton } from \"@/button\";\nimport { Button, type ButtonOptionProps, type ButtonProps } from \"@/select/Button\";\n\ninterface Entry {\n key: direction.Direction;\n icon: ReactElement;\n}\n\nexport interface DirectionProps\n extends Omit<ButtonProps<direction.Direction, Entry>, \"data\" | \"entryRenderKey\"> {}\n\nconst DATA: Entry[] = [\n {\n key: \"x\",\n icon: <Icon.Arrow.Right />,\n },\n {\n key: \"y\",\n icon: <Icon.Arrow.Down />,\n },\n];\n\nconst defaultSelectDirectionButton = ({\n key,\n entry,\n onClick,\n selected,\n}: ButtonOptionProps<direction.Crude, Entry>): ReactElement => {\n return (\n <CoreButton.Icon\n key={key}\n variant={selected ? \"filled\" : \"outlined\"}\n onClick={onClick}\n >\n {entry.icon}\n </CoreButton.Icon>\n );\n};\n\nexport const Direction = ({\n children = defaultSelectDirectionButton,\n allowMultiple = false,\n ...props\n}: DirectionProps): ReactElement => {\n return (\n <Button {...props} data={DATA}>\n {children}\n </Button>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { caseconv, DataType as TelemDataType } from \"@synnaxlabs/x\";\n\nimport { type List } from \"@/list\";\nimport { DropdownButton, type DropdownButtonProps } from \"@/select/Button\";\n\ninterface ListEntry {\n key: string;\n name: string;\n}\n\nconst DATA: ListEntry[] = TelemDataType.ALL.filter(\n (d) => d !== TelemDataType.UNKNOWN,\n).map((d) => ({\n key: d.toString(),\n name: caseconv.capitalize(d.toString()),\n}));\n\nconst COLUMNS: Array<List.ColumnSpec<string, ListEntry>> = [\n {\n key: \"name\",\n name: \"Name\",\n },\n];\n\nexport interface DataTypeProps\n extends Omit<DropdownButtonProps<string, ListEntry>, \"data\" | \"columns\"> {}\n\nexport const DataType = (props: DataTypeProps): ReactElement => (\n <DropdownButton<string, ListEntry>\n {...props}\n data={DATA}\n columns={COLUMNS}\n entryRenderKey=\"name\"\n />\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, type ReactNode } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { caseconv } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { Select } from \"@/select\";\nimport { Text } from \"@/text\";\nimport { Triggers } from \"@/triggers\";\nimport { type Trigger } from \"@/triggers/triggers\";\nimport { MODES, type Mode, type UseTriggers } from \"@/viewport/use\";\n\ninterface Entry {\n key: Mode;\n icon: ReactElement;\n tooltip: ReactNode;\n}\n\ninterface TooltipProps {\n mode: Mode;\n triggers: Trigger[];\n}\n\nconst Tooltip = ({ mode, triggers }: TooltipProps): ReactElement => (\n <Align.Space direction=\"x\" align=\"center\">\n <Text.Text level=\"small\">{caseconv.capitalize(mode)}</Text.Text>\n <Triggers.Text trigger={triggers[0]} level=\"small\" />\n </Align.Space>\n);\n\nconst MODE_ICONS: Record<Mode, ReactElement> = {\n zoom: <Icon.Zoom />,\n pan: <Icon.Pan />,\n select: <Icon.Selection />,\n zoomReset: <Icon.Expand />,\n click: <Icon.Bolt />,\n};\n\nexport interface SelectModeProps extends Omit<Select.ButtonProps<Mode>, \"data\"> {\n triggers: UseTriggers;\n disable?: Mode[];\n}\n\nexport const SelectMode = ({\n triggers,\n disable = [\"zoomReset\", \"click\"],\n ...props\n}: SelectModeProps): ReactElement => {\n const data = Object.entries(triggers)\n .filter(([key]) => !disable.includes(key as Mode) && MODES.includes(key as Mode))\n .map(([key, value]) => ({\n key: key as Mode,\n icon: MODE_ICONS[key as Mode],\n tooltip: <Tooltip mode={key as Mode} triggers={value as Trigger[]} />,\n }))\n .sort((a, b) => MODES.indexOf(a.key) - MODES.indexOf(b.key));\n\n return (\n <Select.Button<Mode, Entry> {...props} data={data} entryRenderKey=\"icon\">\n {({ title: _, entry, ...props }) => (\n <Button.Icon\n {...props}\n key={entry.key}\n variant={props.selected ? \"filled\" : \"text\"}\n size=\"medium\"\n tooltip={entry.tooltip}\n tooltipLocation={{ x: \"right\", y: \"top\" }}\n >\n {entry.icon}\n </Button.Icon>\n )}\n </Select.Button>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n useCallback,\n useLayoutEffect,\n forwardRef,\n} from \"react\";\n\nimport { box, xy } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Viewport as Core } from \"@/viewport\";\nimport { type UseRefValue } from \"@/viewport/use\";\nimport { useContext } from \"@/vis/lineplot/LinePlot\";\n\nimport \"@/vis/lineplot/Viewport.css\";\n\nexport interface ViewportProps extends PropsWithChildren, Core.UseProps {}\n\nexport const selectViewportEl = (el: HTMLElement | null): Element | null =>\n el == null\n ? null\n : document.querySelectorAll(\".pluto-line-plot__viewport\")[0] ?? null;\n\nexport const Viewport = forwardRef<UseRefValue | undefined, ViewportProps>(\n (\n { children, initial = box.DECIMAL, onChange, ...props }: ViewportProps,\n ref,\n ): ReactElement => {\n const { setViewport } = useContext(\"Viewport\");\n\n useLayoutEffect(() => {\n setViewport({ box: initial, mode: \"zoom\", cursor: xy.ZERO, stage: \"start\" });\n }, [setViewport, initial]);\n\n const handleChange = useCallback(\n (e: Core.UseEvent): void => {\n setViewport(e);\n onChange?.(e);\n },\n [onChange, setViewport],\n );\n\n const maskProps = Core.use({\n onChange: handleChange,\n initial,\n ref,\n ...props,\n });\n\n return (\n <Core.Mask className={CSS.BE(\"line-plot\", \"viewport\")} {...maskProps}>\n {children}\n </Core.Mask>\n );\n },\n);\nViewport.displayName = \"Viewport\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n useEffect,\n type FC,\n useRef,\n} from \"react\";\n\nimport { direction, type bounds } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { useMemoDeepEqualProps as useMemoDeepEqual } from \"@/memo\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\nimport { lineplot } from \"@/vis/lineplot/aether\";\nimport {\n coreAxisStateZ,\n parseAutoBounds,\n withinSizeThreshold,\n} from \"@/vis/lineplot/aether/axis\";\nimport { useGridEntry } from \"@/vis/lineplot/LinePlot\";\n\nimport \"@/vis/lineplot/Axis.css\";\n\nexport interface AxisProps\n extends PropsWithChildren,\n Omit<z.input<typeof lineplot.xAxisStateZ>, \"position\" | \"size\">,\n Omit<Align.SpaceProps, \"color\"> {\n resizeDebounce?: number;\n label?: string;\n labelLevel?: Text.Level;\n labelDirection?: direction.Direction;\n onLabelChange?: (label: string) => void;\n onAutoBoundsChange?: (bounds: bounds.Bounds) => void;\n}\n\nexport const axisFactory = (dir: direction.Direction): FC<AxisProps> => {\n const defaultLocation = dir === \"x\" ? \"bottom\" : \"left\";\n const aetherType = dir === \"x\" ? lineplot.XAxis.TYPE : lineplot.YAxis.TYPE;\n const cssClass = `${dir}-axis`;\n return Aether.wrap<AxisProps>(\n aetherType,\n ({\n aetherKey,\n children,\n resizeDebounce: debounce = 0,\n location = defaultLocation,\n label = \"\",\n labelLevel = \"small\",\n labelDirection = dir,\n onLabelChange,\n color,\n labelSize: propsLabelSize,\n showGrid,\n type,\n bounds,\n className,\n tickSpacing,\n autoBounds,\n autoBoundUpdateInterval,\n onAutoBoundsChange,\n style,\n ...props\n }): ReactElement => {\n const showLabel = (label?.length ?? 0) > 0;\n\n const aetherProps = useMemoDeepEqual({\n location,\n showGrid,\n type,\n bounds,\n label,\n labelDirection,\n tickSpacing,\n autoBounds,\n autoBoundUpdateInterval,\n });\n\n const [{ path }, { size, labelSize, ...state }, setState] = Aether.use({\n aetherKey,\n type: aetherType,\n schema: coreAxisStateZ,\n initialState: aetherProps,\n });\n\n useEffect(\n () => setState((state) => ({ ...state, ...aetherProps })),\n [aetherProps],\n );\n useEffect(() => {\n const { lower, upper } = parseAutoBounds(state.autoBounds);\n if (state.bounds == null) return;\n if (\n (lower && bounds?.lower !== state.bounds.lower) ||\n (upper && bounds?.upper !== state.bounds.upper)\n )\n onAutoBoundsChange?.(state.bounds);\n }, [state.autoBounds, state.bounds]);\n\n const gridStyle = useGridEntry(\n {\n loc: location,\n key: `${aetherType}-${aetherKey}`,\n size: size + labelSize,\n order: \"last\",\n },\n \"XAxis\",\n );\n\n const font = Theming.useTypography(labelLevel).toString();\n\n const prevLabelSize = useRef(0);\n\n useEffect(() => {\n if (dir === \"y\") {\n if (label == null) return;\n const dims = Text.dimensions(label, font);\n let labelSize =\n dims[direction.dimension(direction.construct(labelDirection))];\n if (labelSize > 0) labelSize += 6;\n setState((state) => ({\n ...state,\n labelSize,\n }));\n } else {\n const dims = Text.dimensions(label, font);\n const labelSize = dims.height + 12;\n const prevSize = prevLabelSize.current;\n if (!withinSizeThreshold(prevSize, labelSize)) {\n prevLabelSize.current = labelSize;\n setState((state) => ({\n ...state,\n labelSize,\n }));\n }\n }\n }, [label, labelDirection, font]);\n\n return (\n <>\n <Align.Space\n className={CSS(\n className,\n CSS.B(\"axis\"),\n CSS.B(cssClass),\n CSS.loc(location),\n )}\n style={{ ...style, ...gridStyle }}\n align=\"center\"\n justify={dir === \"x\" ? \"end\" : \"start\"}\n direction={direction.swap(dir)}\n {...props}\n >\n {showLabel && (\n <Text.MaybeEditable\n className={CSS(CSS.BE(\"axis\", \"label\"), CSS.dir(labelDirection))}\n value={label}\n onChange={onLabelChange}\n level={labelLevel}\n />\n )}\n </Align.Space>\n <Aether.Composite path={path}>{children}</Aether.Composite>\n </>\n );\n },\n );\n};\n\nexport const XAxis = axisFactory(\"x\");\nexport const YAxis = axisFactory(\"y\");\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useEffect, useRef } from \"react\";\n\nimport { box, xy } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { tooltip } from \"@/vis/lineplot/tooltip/aether\";\n\nexport interface TooltipProps\n extends Omit<z.input<typeof tooltip.tooltipStateZ>, \"position\"> {}\n\nexport const Tooltip = Aether.wrap<TooltipProps>(\n \"Tooltip\",\n ({ aetherKey }): ReactElement | null => {\n const [, , setState] = Aether.use({\n aetherKey,\n type: tooltip.Tooltip.TYPE,\n schema: tooltip.tooltipStateZ,\n initialState: {\n position: null,\n },\n });\n\n const ref = useRef<HTMLSpanElement>(null);\n\n const handleMove = useCallback(\n (e: MouseEvent): void => {\n // select the .pluto-canvas-container element\n const canvas = document.querySelector(\".pluto-canvas-container\");\n if (canvas == null) return;\n const topLeft = box.topLeft(canvas);\n setState({ position: xy.translation(topLeft, xy.construct(e)) });\n },\n [setState],\n );\n\n const handleLeave = useCallback(\n (): void => setState({ position: null }),\n [setState],\n );\n\n useEffect(() => {\n if (ref.current === null) return;\n // Select the parent node of the tooltip\n const parent = ref.current.parentElement;\n if (parent == null) return;\n // Bind a hover listener to the parent node\n parent.addEventListener(\"mousemove\", handleMove);\n parent.addEventListener(\"mouseleave\", handleLeave);\n return () => {\n parent.removeEventListener(\"mousemove\", handleMove);\n parent.removeEventListener(\"mouseleave\", handleLeave);\n };\n }, [handleMove]);\n\n return <span ref={ref} />;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { xy } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { Triggers } from \"@/triggers\";\nimport { type Viewport } from \"@/viewport\";\nimport { LinePlot } from \"@/vis/lineplot\";\nimport { measure } from \"@/vis/measure/aether\";\n\ntype ClickMode = \"one\" | \"two\" | \"clear\" | \"empty\";\n\nconst MEASURE_TRIGGERS: Triggers.ModeConfig<ClickMode> = {\n defaultMode: \"empty\",\n one: [[\"1\"]],\n two: [[\"2\"]],\n clear: [[\"Shift\"]],\n empty: [[]],\n};\n\nconst REDUCED_MEASURE_TRIGGERS = Triggers.flattenConfig(MEASURE_TRIGGERS);\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface MeasureProps {}\n\nexport const Measure = Aether.wrap<MeasureProps>(\"Measure\", ({ aetherKey }) => {\n const [, , setState] = Aether.use({\n aetherKey,\n type: measure.Measure.TYPE,\n schema: measure.measureStateZ,\n initialState: {\n hover: null,\n one: null,\n two: null,\n },\n });\n\n const ref = useRef<HTMLSpanElement>(null);\n\n const triggers = Triggers.useHeldRef({\n triggers: REDUCED_MEASURE_TRIGGERS,\n loose: true,\n });\n\n const handleClick: Viewport.UseHandler = useCallback(\n ({ mode, cursor }): void => {\n if (mode === \"click\") {\n const measureMode = Triggers.determineMode<ClickMode>(\n MEASURE_TRIGGERS,\n triggers.current.triggers,\n true,\n );\n if ([\"one\", \"two\"].includes(measureMode))\n return setState((p) => ({ ...p, [measureMode]: cursor }));\n else if (measureMode === \"clear\")\n setState((p) => ({ ...p, one: null, two: null }));\n else\n setState((p) => ({\n ...p,\n one: p.one ?? cursor,\n two: p.one !== null ? cursor : p.two,\n }));\n }\n },\n [setState, triggers],\n );\n\n LinePlot.useViewport(handleClick);\n\n const handleMove = useCallback(\n (e: MouseEvent): void => setState((p) => ({ ...p, hover: xy.construct(e) })),\n [setState],\n );\n\n const handleLeave = useCallback((): void => {\n setState((p) => ({\n ...p,\n hover: null,\n }));\n }, [setState]);\n\n useEffect(() => {\n if (ref.current === null) return;\n // Select the parent node of the tooltip\n const parent = ref.current.parentElement;\n if (parent == null) return;\n // Bind a hover listener to the parent node\n parent.addEventListener(\"mousemove\", handleMove);\n parent.addEventListener(\"mouseleave\", handleLeave);\n return () => {\n parent.removeEventListener(\"mousemove\", handleMove);\n parent.removeEventListener(\"mouseleave\", handleLeave);\n };\n }, [handleClick]);\n\n return <span ref={ref} />;\n});\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useEffect, useRef } from \"react\";\n\nimport { bounds, box } from \"@synnaxlabs/x/spatial\";\nimport { createPortal } from \"react-dom\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { useCursorDrag } from \"@/hooks/useCursorDrag\";\nimport { state } from \"@/state\";\nimport { Text } from \"@/text\";\nimport { selectViewportEl } from \"@/vis/lineplot/Viewport\";\nimport { rule } from \"@/vis/rule/aether\";\n\nimport \"@/vis/rule/Rule.css\";\n\nexport interface RuleProps\n extends Omit<z.input<typeof rule.ruleStateZ>, \"dragging\" | \"pixelPosition\"> {\n label?: string;\n onLabelChange?: (label: string) => void;\n units?: string;\n onPositionChange?: (position: number) => void;\n}\n\nexport const Rule = Aether.wrap<RuleProps>(\n \"Rule\",\n ({\n aetherKey,\n label,\n position: propsPosition,\n onLabelChange,\n onPositionChange,\n units = \"\",\n color,\n lineWidth,\n lineDash,\n }): ReactElement | null => {\n const [internalLabel, setInternalLabel] = state.usePurePassthrough({\n value: label,\n onChange: onLabelChange,\n initial: \"\",\n });\n\n const [, { position, pixelPosition }, setState] = Aether.use({\n aetherKey,\n type: rule.Rule.TYPE,\n schema: rule.ruleStateZ,\n initialState: {\n color,\n dragging: false,\n position: propsPosition,\n lineWidth,\n lineDash,\n },\n });\n\n useEffect(() => {\n if (position == null) return;\n if (propsPosition == null) return onPositionChange?.(position);\n const b = bounds.construct(position + 0.01, position - 0.01);\n if (propsPosition != null && !bounds.contains(b, propsPosition))\n onPositionChange?.(Math.trunc(position * 100) / 100);\n }, [position]);\n\n const pixelPosRef = useRef(pixelPosition);\n if (pixelPosition !== pixelPosRef.current) pixelPosRef.current = pixelPosition;\n\n const dragStartRef = useRef(pixelPosition);\n\n useEffect(() => {\n setState((p) => ({ ...p, position: propsPosition, color, lineWidth, lineDash }));\n }, [propsPosition, color, lineWidth, lineDash]);\n\n const handleDragStart = useCursorDrag({\n onStart: useCallback(() => {\n setState((p) => ({ ...p, dragging: true }));\n dragStartRef.current = pixelPosRef.current;\n }, []),\n onMove: (b: box.Box) => {\n setState((p) => ({\n ...p,\n pixelPosition: (dragStartRef.current ?? 0) + box.signedHeight(b),\n }));\n },\n onEnd: useCallback(() => {\n setState((p) => ({ ...p, dragging: false }));\n dragStartRef.current = pixelPosition;\n }, []),\n });\n\n const ref = useRef<HTMLDivElement>(null);\n\n if (position == null || pixelPosition == null) return null;\n\n const viewportEl = selectViewportEl(ref?.current);\n\n const content = (\n <div\n ref={ref}\n className={CSS.B(\"rule\")}\n style={{ top: `calc(${pixelPosition}px - 0.5rem)` }}\n >\n <div\n className={CSS.BE(\"rule\", \"drag-handle\")}\n onDragStart={handleDragStart}\n draggable\n />\n <Align.Space direction=\"x\" align=\"center\" style={{ marginLeft: \"2rem\" }}>\n <Text.Editable level=\"p\" value={internalLabel} onChange={setInternalLabel} />\n <Text.Text\n level=\"p\"\n style={{ padding: \"0.25rem 0\", width: \"fit-content\" }}\n >{`${position.toFixed(2)} ${units}`}</Text.Text>\n </Align.Space>\n </div>\n );\n\n if (viewportEl == null) return content;\n return createPortal(content, viewportEl);\n },\n);\n","import { Aether } from \"@/aether\";\nimport { range } from \"@/vis/lineplot/range/aether\";\nimport { z } from \"zod\";\n\ninterface AnnotationProps extends z.input<typeof range.annotationStateZ> {}\n\nexport const Annotation = Aether.wrap<AnnotationProps>(\n \"Tooltip\",\n ({ aetherKey, ...props }): null => {\n Aether.use({\n aetherKey,\n type: range.Annotation.TYPE,\n schema: range.annotationStateZ,\n initialState: props,\n });\n return null;\n },\n);\n","import { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { useGridEntry, useContext } from \"@/vis/lineplot/LinePlot\";\nimport { range } from \"@/vis/lineplot/range/aether\";\nimport { box, xy } from \"@synnaxlabs/x\";\nimport { ReactElement, useCallback, useRef } from \"react\";\nimport { Menu } from \"@/menu\";\nimport { RenderProp } from \"@/util/renderProp\";\nimport { SelectedState } from \"@/vis/lineplot/range/aether/provider\";\nimport { useSyncedRef } from \"@/hooks\";\n\nexport interface ProviderProps {\n menu?: RenderProp<range.SelectedState>;\n}\n\nexport const Provider = Aether.wrap<ProviderProps>(\n \"Annotation.Provider\",\n ({ aetherKey, menu, ...props }): ReactElement => {\n const { setViewport, setHold } = useContext(\"Range.Provider\");\n const [, { hovered, count }, setState] = Aether.use({\n aetherKey,\n type: range.Provider.TYPE,\n schema: range.providerStateZ,\n initialState: {\n ...props,\n cursor: null,\n hovered: null,\n count: 0,\n },\n });\n const gridStyle = useGridEntry(\n {\n key: aetherKey,\n loc: \"top\",\n size: count > 0 ? 32 : 0,\n order: \"last\",\n },\n \"Annotation.Provider\",\n );\n\n const menuProps = Menu.useContextMenu();\n const visibleRef = useSyncedRef(menuProps.visible);\n\n const handleMouseEnter: React.MouseEventHandler<HTMLDivElement> = useCallback(\n (e) => {\n // add an event listener for the movement until it leaves\n const handleMouseMove = (e: MouseEvent) => {\n setState((state) => ({ ...state, cursor: { x: e.clientX, y: e.clientY } }));\n };\n const target = e.currentTarget;\n target.addEventListener(\"mousemove\", handleMouseMove);\n target.addEventListener(\n \"mouseleave\",\n () => {\n target.removeEventListener(\"mousemove\", handleMouseMove);\n if (!visibleRef.current) setState((state) => ({ ...state, cursor: null }));\n },\n { once: true },\n );\n },\n [setState],\n );\n\n return (\n <Menu.ContextMenu\n style={{\n ...gridStyle,\n cursor: hovered != null ? \"pointer\" : \"default\",\n }}\n {...menuProps}\n menu={() => {\n if (menu == null || hovered == null) return null;\n return menu(hovered);\n }}\n >\n <Align.Space\n style={{ width: \"100%\", height: \"100%\" }}\n onClick={() => {\n if (hovered != null) {\n setViewport({\n box: box.construct(\n { x: hovered.viewport.lower, y: 0 },\n { x: hovered.viewport.upper, y: 1 },\n ),\n mode: \"zoom\",\n cursor: xy.ZERO,\n stage: \"start\",\n });\n setHold(true);\n }\n }}\n onMouseEnter={handleMouseEnter}\n />\n </Menu.ContextMenu>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useRef } from \"react\";\n\nimport { type channel } from \"@synnaxlabs/client\";\nimport { box, location as loc } from \"@synnaxlabs/x/spatial\";\nimport { type TimeRange, type TimeSpan } from \"@synnaxlabs/x/telem\";\n\nimport { HAUL_TYPE } from \"@/channel/types\";\nimport { type Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Haul } from \"@/haul\";\nimport { usePrevious } from \"@/hooks\";\nimport { telem } from \"@/telem/aether\";\nimport { type Text } from \"@/text\";\nimport { type Viewport } from \"@/viewport\";\nimport { LinePlot as Core } from \"@/vis/lineplot\";\nimport { Tooltip } from \"@/vis/lineplot/tooltip\";\nimport { Measure } from \"@/vis/measure\";\nimport { Rule } from \"@/vis/rule\";\nimport { Range } from \"@/vis/lineplot/range\";\n\nimport \"@/channel/LinePlot.css\";\n\n/** Props for an axis in {@link LinePlot} */\nexport interface AxisProps extends Core.AxisProps {\n /** A unique identifier for the axis */\n key: string;\n}\n\nexport interface BaseLineProps {\n key: string;\n axes: {\n x: string;\n y: string;\n };\n channels: {\n y: channel.KeyOrName;\n x?: channel.KeyOrName;\n };\n color: Color.Crude;\n strokeWidth?: number;\n label?: string;\n downsample?: number;\n}\n\nexport interface StaticLineProps extends BaseLineProps {\n variant: \"static\";\n timeRange: TimeRange;\n}\n\nexport interface DynamicLineProps extends BaseLineProps {\n variant: \"dynamic\";\n timeSpan: TimeSpan;\n}\n\nexport type LineProps = StaticLineProps | DynamicLineProps;\n\nexport interface RuleProps {\n key: string;\n position: number;\n color: Color.Crude;\n axis: string;\n label: string;\n lineWidth?: number;\n lineDash?: number;\n units?: string;\n}\n\nexport interface LinePlotProps extends Core.LinePlotProps {\n // Axes\n axes: AxisProps[];\n onAxisChannelDrop?: (axis: string, channels: channel.Key[]) => void;\n onAxisChange?: (axis: Partial<AxisProps> & { key: string }) => void;\n // Lines\n lines: LineProps[];\n onLineChange?: (line: Partial<LineProps> & { key: string }) => void;\n // Rules\n rules?: RuleProps[];\n onRuleChange?: (rule: Partial<RuleProps> & { key: string }) => void;\n // Title\n title?: string;\n showTitle?: boolean;\n onTitleChange?: (value: string) => void;\n titleLevel?: Text.Level;\n // Legend\n showLegend?: boolean;\n enableTooltip?: boolean;\n enableMeasure?: boolean;\n initialViewport?: Viewport.UseProps[\"initial\"];\n onViewportChange?: Viewport.UseProps[\"onChange\"];\n viewportTriggers?: Viewport.UseProps[\"triggers\"];\n annotationProvider?: Range.ProviderProps;\n}\n\nconst canDrop = Haul.canDropOfType(HAUL_TYPE);\n\n/**\n * A line plot component that automatically pulls data from specified channels and\n * displays it. Can be used to render both real-time and historical data.\n *\n * @param props - The props for the line plot\n * @param\n * @returns\n */\nexport const LinePlot = ({\n lines,\n axes,\n showTitle = true,\n title = \"\",\n onTitleChange,\n showLegend = true,\n titleLevel = \"h4\",\n onLineChange,\n onRuleChange,\n onAxisChannelDrop,\n onAxisChange,\n rules,\n enableTooltip = true,\n enableMeasure = false,\n initialViewport = box.DECIMAL,\n onViewportChange,\n viewportTriggers,\n annotationProvider,\n ...props\n}: LinePlotProps): ReactElement => {\n const xAxes = axes.filter(({ location: l }) => loc.isY(l));\n const ref = useRef<Viewport.UseRefValue>();\n const prevLinesLength = usePrevious(lines.length);\n const prevHold = usePrevious(props.hold);\n if (\n (prevLinesLength === 0 && lines.length !== 0) ||\n (prevHold === true && props.hold === false)\n )\n ref.current?.reset();\n return (\n <Core.LinePlot {...props}>\n {xAxes.map((a, i) => {\n const axisLines = lines.filter((l) => l.axes.x === a.key);\n const yAxes = axes.filter(({ location: l }) => loc.isX(l));\n const axisRules = rules?.filter((r) =>\n [...yAxes.map(({ key: id }) => id), a.key].includes(r.axis),\n );\n return (\n <XAxis\n key={a.key}\n axis={a}\n index={i}\n lines={axisLines}\n yAxes={yAxes}\n rules={axisRules}\n onAxisChannelDrop={onAxisChannelDrop}\n onAxisChange={onAxisChange}\n annotationProvider={annotationProvider}\n />\n );\n })}\n {showLegend && <Core.Legend onLineChange={onLineChange} />}\n {showTitle && (\n <Core.Title value={title} onChange={onTitleChange} level={titleLevel} />\n )}\n <Core.Viewport\n initial={initialViewport}\n onChange={onViewportChange}\n triggers={viewportTriggers}\n ref={ref}\n >\n {enableTooltip && <Tooltip.Tooltip />}\n {enableMeasure && <Measure.Measure />}\n </Core.Viewport>\n </Core.LinePlot>\n );\n};\n\ninterface XAxisProps\n extends Pick<\n LinePlotProps,\n \"onRuleChange\" | \"lines\" | \"rules\" | \"onAxisChannelDrop\" | \"onAxisChange\"\n > {\n axis: AxisProps;\n yAxes: AxisProps[];\n index: number;\n annotationProvider?: Range.ProviderProps;\n}\n\nconst XAxis = ({\n yAxes,\n lines,\n index,\n rules,\n onRuleChange,\n onAxisChannelDrop,\n onAxisChange,\n axis: { location, key, showGrid, ...axis },\n annotationProvider,\n}: XAxisProps): ReactElement => {\n const dropProps = Haul.useDrop({\n type: \"Channel.LinePlot.XAxis\",\n canDrop,\n onDrop: useCallback(\n ({ items }) => {\n const dropped = Haul.filterByType(HAUL_TYPE, items);\n onAxisChannelDrop?.(\n key,\n dropped.map(({ key }) => key as channel.Key),\n );\n return dropped;\n },\n [key, onAxisChannelDrop],\n ),\n });\n\n const xRules = rules?.filter((r) => r.axis === key);\n return (\n <Core.XAxis\n {...axis}\n {...dropProps}\n location={location as loc.Y}\n showGrid={showGrid ?? index === 0}\n className={CSS(\n CSS.dropRegion(Haul.canDropOfType(HAUL_TYPE)(Haul.useDraggingState())),\n )}\n onAutoBoundsChange={(bounds) => onAxisChange?.({ key, bounds })}\n >\n {yAxes.map((a, i) => {\n const yLines = lines.filter((l) => l.axes.y === a.key);\n const yRules = rules?.filter((r) => r.axis === a.key);\n return (\n <YAxis\n key={a.key}\n axis={{\n ...a,\n showGrid: showGrid ?? (index === 0 && i === 0),\n }}\n lines={yLines}\n rules={yRules}\n onRuleChange={onRuleChange}\n onAxisChannelDrop={onAxisChannelDrop}\n onAxisChange={onAxisChange}\n />\n );\n })}\n {xRules?.map((rule) => (\n <Rule.Rule\n aetherKey={rule.key}\n {...rule}\n key={rule.key}\n onLabelChange={(value) => onRuleChange?.({ key: rule.key, label: value })}\n onPositionChange={(value) =>\n onRuleChange?.({ key: rule.key, position: value })\n }\n />\n ))}\n <Range.Provider {...annotationProvider} />\n </Core.XAxis>\n );\n};\n\ninterface YAxisProps\n extends Pick<\n LinePlotProps,\n \"onRuleChange\" | \"lines\" | \"rules\" | \"onAxisChannelDrop\" | \"onAxisChange\"\n > {\n axis: AxisProps;\n}\n\nconst lineKey = ({ channels: { x, y } }: LineProps): string => `${x ?? 0}-${y}`;\n\nconst YAxis = ({\n lines,\n rules,\n onRuleChange,\n onAxisChannelDrop,\n onAxisChange,\n axis: { key, location: loc, ...props },\n}: YAxisProps): ReactElement => {\n const dropProps = Haul.useDrop({\n type: \"Channel.LinePlot.YAxis\",\n canDrop,\n onDrop: useCallback(\n ({ items }) => {\n const dropped = Haul.filterByType(HAUL_TYPE, items);\n onAxisChannelDrop?.(\n key,\n dropped.map(({ key }) => key as channel.Key),\n );\n return dropped;\n },\n [key, onAxisChannelDrop],\n ),\n });\n\n const dragging = Haul.useDraggingState();\n\n return (\n <Core.YAxis\n {...props}\n {...dropProps}\n location={loc as loc.X}\n className={CSS(CSS.dropRegion(Haul.canDropOfType(HAUL_TYPE)(dragging)))}\n onAutoBoundsChange={(bounds) => onAxisChange?.({ key, bounds })}\n >\n {lines.map((l) => (\n <Line key={lineKey(l)} line={l} />\n ))}\n {rules?.map((r) => (\n <Rule.Rule\n aetherKey={r.key}\n {...r}\n key={r.key}\n onLabelChange={(value) => onRuleChange?.({ key: r.key, label: value })}\n onPositionChange={(value) => onRuleChange?.({ key: r.key, position: value })}\n />\n ))}\n </Core.YAxis>\n );\n};\n\nconst Line = ({ line }: { line: LineProps }): ReactElement =>\n line.variant === \"static\" ? <StaticLine line={line} /> : <DynamicLine line={line} />;\n\nconst DynamicLine = ({\n line: {\n key,\n timeSpan,\n channels: { x, y },\n ...props\n },\n}: {\n line: DynamicLineProps;\n}): ReactElement => {\n const keepFor = Number(timeSpan.valueOf()) * 3;\n const yTelem = telem.streamChannelData({\n timeSpan,\n channel: y,\n keepFor,\n });\n const hasX = x != null && x !== 0;\n const xTelem = telem.streamChannelData({\n timeSpan,\n channel: hasX ? x : y,\n useIndexOfChannel: !hasX,\n keepFor,\n });\n return <Core.Line aetherKey={key} y={yTelem} x={xTelem} {...props} />;\n};\n\nconst StaticLine = ({\n line: {\n timeRange,\n key,\n channels: { x, y },\n ...props\n },\n}: {\n line: StaticLineProps;\n}): ReactElement => {\n const yTelem = telem.channelData({ timeRange, channel: y });\n const hasX = x != null && x !== 0;\n const xTelem = telem.channelData({\n timeRange,\n channel: hasX ? x : y,\n useIndexOfChannel: !hasX,\n });\n return <Core.Line aetherKey={key} y={yTelem} x={xTelem} {...props} />;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useCallback,\n useContext,\n} from \"react\";\n\nimport {\n type connection,\n Synnax,\n type SynnaxProps,\n TimeSpan,\n} from \"@synnaxlabs/client\";\nimport { caseconv } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { useAsyncEffect, useCombinedStateAndRef } from \"@/hooks\";\nimport { Status } from \"@/status\";\nimport { synnax } from \"@/synnax/aether\";\n\nconst Context = createContext<synnax.ContextValue>(synnax.ZERO_CONTEXT_VALUE);\n\nexport const use = (): Synnax | null => useContext(Context).synnax;\n\nexport const useConnectionState = (): connection.State => useContext(Context).state;\n\nexport interface ProviderProps extends PropsWithChildren {\n connParams?: SynnaxProps;\n}\n\nconst CONNECTION_STATE_VARIANT: Record<connection.Status, Status.Variant> = {\n connected: \"success\",\n connecting: \"info\",\n disconnected: \"info\",\n failed: \"error\",\n};\n\nexport const Provider = Aether.wrap<ProviderProps>(\n synnax.Provider.TYPE,\n ({ aetherKey, connParams, children }): ReactElement => {\n const [state, setState, ref] = useCombinedStateAndRef<synnax.ContextValue>(\n synnax.ZERO_CONTEXT_VALUE,\n );\n\n const [{ path }, , setAetherState] = Aether.use({\n aetherKey,\n type: synnax.Provider.TYPE,\n schema: synnax.Provider.stateZ,\n initialState: { props: connParams ?? null, state: null },\n });\n\n const add = Status.useAggregator();\n\n const handleChange = useCallback(\n (state: connection.State) => {\n if (ref.current.state.status !== state.status) {\n add({\n variant: CONNECTION_STATE_VARIANT[state.status],\n message: state.message ?? caseconv.capitalize(state.status),\n });\n }\n setState((prev) => ({ ...prev, state }));\n },\n [add],\n );\n\n useAsyncEffect(async () => {\n if (state.synnax != null) state.synnax.close();\n if (connParams == null) return setState(synnax.ZERO_CONTEXT_VALUE);\n\n const c = new Synnax({\n ...connParams,\n connectivityPollFrequency: TimeSpan.seconds(5),\n });\n\n setState({\n synnax: c,\n state: {\n clusterKey: \"\",\n status: \"connecting\",\n message: \"Connecting...\",\n },\n });\n\n const connectivity = await c.connectivity.check();\n\n setState({\n synnax: c,\n state: connectivity,\n });\n add({\n variant: CONNECTION_STATE_VARIANT[connectivity.status],\n message: connectivity.message ?? connectivity.status.toUpperCase(),\n });\n\n c.connectivity.onChange(handleChange);\n\n setAetherState({ props: connParams, state: connectivity });\n\n return () => {\n c.close();\n setState(synnax.ZERO_CONTEXT_VALUE);\n setAetherState({ props: null, state: null });\n };\n }, [connParams, handleChange]);\n\n return (\n <Context.Provider value={state}>\n <Aether.Composite path={path}>{children}</Aether.Composite>\n </Context.Provider>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n useState,\n type PropsWithChildren,\n type ReactElement,\n useCallback,\n createContext,\n useContext as reactUseContext,\n} from \"react\";\n\nimport { type channel, type ranger } from \"@synnaxlabs/client\";\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Button } from \"@/button\";\nimport { useAsyncEffect } from \"@/hooks\";\nimport { Input } from \"@/input\";\nimport { Synnax } from \"@/synnax\";\nimport { Text } from \"@/text\";\n\ninterface AliasContextValue {\n aliases: Record<channel.Key, string>;\n getName: (key: channel.Key) => Promise<string | undefined>;\n setAlias: ((key: channel.Key, alias: string) => Promise<void>) | null;\n activeRange?: string | null;\n}\n\nconst AliasContext = createContext<AliasContextValue>({\n aliases: {},\n getName: async () => await Promise.resolve(undefined),\n setAlias: null,\n});\n\nexport const useContext = (): AliasContextValue => {\n return reactUseContext(AliasContext);\n};\n\nexport interface AliasProviderProps extends PropsWithChildren {\n activeRange?: string | null;\n}\n\nexport const useAlias = (key: channel.Key): string | null => {\n const { aliases } = reactUseContext(AliasContext);\n return aliases[key] ?? null;\n};\n\nexport const useAliases = (): Record<channel.Key, string> => {\n const { aliases } = reactUseContext(AliasContext);\n return aliases;\n};\n\nexport const useName = (key: channel.Key, def: string = \"\"): string => {\n const { getName } = reactUseContext(AliasContext);\n const [name, setName] = useState(def);\n useAsyncEffect(async () => {\n const n = await getName(key);\n if (n != null) setName(n);\n }, [key, getName]);\n return name;\n};\n\nexport const useActiveRange = (): string | undefined => {\n const { activeRange } = reactUseContext(AliasContext);\n return activeRange ?? undefined;\n};\n\nexport const AliasProvider = ({\n activeRange,\n children,\n}: AliasProviderProps): ReactElement => {\n const c = Synnax.use();\n const [aliases, setAliases] = useState<Record<channel.Key, string>>({});\n\n const handleAliasChange = useCallback(\n (changes: ranger.AliasChange[]) => {\n setAliases((aliases) => {\n const newAliases = { ...aliases };\n changes.forEach(({ variant, key, value }) => {\n const channelKey = Number(key.split(\"---\")[1]);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n if (variant === \"delete\") delete newAliases[channelKey];\n else newAliases[value.channel] = value.alias;\n });\n return newAliases;\n });\n },\n [setAliases],\n );\n\n const setAlias = useCallback(\n async (key: channel.Key, alias: string) => {\n if (c == null || activeRange == null) return;\n const r = await c.ranges.retrieve(activeRange);\n await r.setAlias(key, alias);\n },\n [c, activeRange],\n );\n\n const getName = useCallback(\n async (key: channel.Key): Promise<string | undefined> => {\n if (c == null || key === 0) return undefined;\n const alias = aliases[key];\n if (alias != null) return alias;\n return (await c.channels.retrieve(key)).name;\n },\n [aliases, c],\n );\n\n useAsyncEffect(async () => {\n if (c == null || activeRange == null) {\n setAliases({});\n return;\n }\n const r = await c.ranges.retrieve(activeRange);\n const aliases = await r.listAliases();\n setAliases(aliases);\n const tracker = await r.openAliasTracker();\n const disconnect = tracker.onChange(handleAliasChange);\n return () => {\n disconnect();\n void tracker.close();\n };\n }, [c, activeRange]);\n\n return (\n <AliasContext.Provider\n value={{\n aliases,\n activeRange,\n setAlias: activeRange != null ? setAlias : null,\n getName,\n }}\n >\n {children}\n </AliasContext.Provider>\n );\n};\n\nexport interface AliasInputProps extends Input.TextProps {\n channelKey: channel.Key;\n shadow?: boolean;\n}\n\nexport const AliasInput = ({\n channelKey,\n value,\n shadow,\n className,\n ...props\n}: AliasInputProps): ReactElement => {\n const [loading, setLoading] = useState(false);\n const { setAlias } = useContext();\n const alias = useAlias(channelKey);\n const name = useName(channelKey);\n let icon = <Icon.Rename />;\n if (loading) icon = <Icon.Loading />;\n else if (alias === value) icon = <Icon.Check />;\n const canSetAlias =\n setAlias != null && !loading && alias !== value && channelKey !== 0;\n const handleSetAlias = (): void => {\n if (!canSetAlias) return;\n void (async () => {\n setLoading(true);\n await setAlias(channelKey, value);\n setLoading(false);\n })();\n };\n\n const handleSetValueToAlias = (): void => {\n if (alias == null) return;\n props.onChange?.(alias);\n };\n\n const SetAliasTooltip = (): ReactElement => {\n if (channelKey === 0)\n return (\n <Text.Text level=\"small\">\n Select a channel to enable alias syncing with this label\n </Text.Text>\n );\n if (setAlias == null)\n return (\n <Text.Text level=\"small\">\n Select a range to enable alias syncing with this label\n </Text.Text>\n );\n if (value.length === 0)\n return (\n <Text.Text level=\"small\">\n Enter a value to enable alias syncing with this label\n </Text.Text>\n );\n if (alias === value)\n return <Text.Text level=\"small\">Alias synced with this label</Text.Text>;\n return <Text.Text level=\"small\">Sync alias for {name} with this label</Text.Text>;\n };\n\n return (\n <Input.Text value={value} {...props}>\n {canSetAlias && (\n <Button.Icon\n onClick={handleSetValueToAlias}\n tooltip={<Text.Text level=\"small\">Set {name} as label</Text.Text>}\n tooltipLocation={{ y: \"top\" }}\n variant=\"outlined\"\n >\n <Icon.Sync />\n </Button.Icon>\n )}\n <Button.Icon\n onClick={handleSetAlias}\n disabled={!canSetAlias}\n tooltip={<SetAliasTooltip />}\n tooltipLocation={{ y: \"top\" }}\n variant=\"outlined\"\n >\n {icon}\n </Button.Icon>\n </Input.Text>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type DragEvent, type ReactElement, useCallback, useId, useMemo } from \"react\";\n\nimport { type channel } from \"@synnaxlabs/client\";\nimport { nullToArr, toArray, unique } from \"@synnaxlabs/x\";\n\nimport { useActiveRange, useAliases } from \"@/channel/AliasProvider\";\nimport { HAUL_TYPE } from \"@/channel/types\";\nimport { CSS } from \"@/css\";\nimport { Haul } from \"@/haul\";\nimport { type DraggingState } from \"@/haul/Haul\";\nimport { type List } from \"@/list\";\nimport { Select } from \"@/select\";\nimport { Status } from \"@/status\";\nimport { Synnax } from \"@/synnax\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\n\nconst channelColumns: Array<List.ColumnSpec<channel.Key, channel.Payload>> = [\n {\n key: \"name\",\n name: \"Name\",\n },\n {\n key: \"alias\",\n name: \"Alias\",\n },\n {\n key: \"rate\",\n name: \"Rate\",\n },\n {\n key: \"dataType\",\n name: \"Data Type\",\n },\n {\n key: \"index\",\n name: \"Index\",\n },\n {\n key: \"key\",\n name: \"Key\",\n },\n {\n key: \"isIndex\",\n name: \"Is Index\",\n },\n];\n\nconst canDrop = (\n { items: entities }: DraggingState,\n value: channel.Key[] | readonly channel.Key[],\n): boolean => {\n const f = Haul.filterByType(HAUL_TYPE, entities);\n return f.length > 0 && !f.every((h) => value.includes(h.key as channel.Key));\n};\n\nexport interface SelectMultipleProps\n extends Omit<\n Select.MultipleProps<channel.Key, channel.Payload>,\n \"columns\" | \"searcher\"\n > {\n columns?: string[];\n searchOptions?: channel.RetrieveOptions;\n}\n\nconst DEFAULT_FILTER = [\"name\", \"alias\"];\n\nconst useColumns = (\n filter: string[],\n): Array<List.ColumnSpec<channel.Key, channel.Payload>> => {\n const aliases = useAliases();\n return useMemo(() => {\n if (filter.length === 0) return channelColumns;\n return channelColumns.filter((column) => filter.includes(column.key));\n }, [filter, aliases]);\n};\n\nexport const SelectMultiple = ({\n columns: filter = DEFAULT_FILTER,\n onChange,\n className,\n value,\n searchOptions,\n ...props\n}: SelectMultipleProps): ReactElement => {\n const client = Synnax.use();\n const aliases = useAliases();\n const columns = useColumns(filter);\n const activeRange = useActiveRange();\n const memoSearchOptions = useMemoDeepEqualProps(searchOptions);\n const searcher = useMemo(\n () =>\n client?.channels.newSearcherWithOptions({\n rangeKey: activeRange,\n internal: false,\n ...memoSearchOptions,\n }),\n [client, activeRange, memoSearchOptions],\n );\n const emptyContent =\n client != null ? undefined : (\n <Status.Text.Centered variant=\"error\" level=\"h4\" style={{ height: 150 }}>\n No client available\n </Status.Text.Centered>\n );\n\n const {\n startDrag,\n onDragEnd: endDrag,\n ...dropProps\n } = Haul.useDragAndDrop({\n type: \"Channel.SelectMultiple\",\n canDrop: useCallback((hauled) => canDrop(hauled, toArray(value)), [value]),\n onDrop: useCallback(\n ({ items }) => {\n const dropped = Haul.filterByType(HAUL_TYPE, items);\n if (dropped.length === 0) return [];\n const v = unique([\n ...toArray(value),\n ...(dropped.map((c) => c.key) as channel.Keys),\n ]);\n onChange(v, {\n clickedIndex: null,\n clicked: null,\n entries: [],\n });\n return dropped;\n },\n [onChange, value],\n ),\n });\n const dragging = Haul.useDraggingState();\n\n const handleSuccessfulDrop = useCallback(\n ({ dropped }: Haul.OnSuccessfulDropProps) => {\n onChange(\n toArray(value).filter((key) => !dropped.some((h) => h.key === key)),\n {\n clickedIndex: null,\n clicked: null,\n entries: [],\n },\n );\n },\n [onChange, value],\n );\n\n const onDragStart = useCallback(\n (_: DragEvent<HTMLDivElement>, key: channel.Key) =>\n startDrag([{ key, type: HAUL_TYPE }], handleSuccessfulDrop),\n [startDrag, handleSuccessfulDrop],\n );\n\n const entryRenderKey = useCallback(\n (e: channel.Payload) => aliases[e.key] ?? e.name,\n [aliases],\n );\n\n return (\n <Select.Multiple\n className={CSS(className, CSS.dropRegion(canDrop(dragging, toArray(value))))}\n value={value}\n onTagDragStart={onDragStart}\n onTagDragEnd={endDrag}\n searcher={searcher}\n onChange={onChange}\n columns={columns}\n emptyContent={emptyContent}\n entryRenderKey={entryRenderKey}\n {...dropProps}\n {...props}\n />\n );\n};\n\nexport interface SelectSingleProps\n extends Omit<Select.SingleProps<channel.Key, channel.Payload>, \"columns\"> {\n columns?: string[];\n searchOptions?: channel.RetrieveOptions;\n}\n\nexport const SelectSingle = ({\n columns: filter = DEFAULT_FILTER,\n onChange,\n value,\n className,\n data,\n searchOptions,\n ...props\n}: SelectSingleProps): ReactElement => {\n const client = Synnax.use();\n const aliases = useAliases();\n const columns = useColumns(filter);\n const activeRange = useActiveRange();\n const memoSearchOptions = useMemoDeepEqualProps(searchOptions);\n const searcher = useMemo(() => {\n if (data != null && data.length > 0) return undefined;\n return client?.channels.newSearcherWithOptions({\n rangeKey: activeRange,\n internal: false,\n ...memoSearchOptions,\n });\n }, [client, activeRange, data?.length, memoSearchOptions]);\n\n const emptyContent =\n client != null ? undefined : (\n <Status.Text.Centered variant=\"error\" level=\"h4\" style={{ height: 150 }}>\n No client available\n </Status.Text.Centered>\n );\n\n const id = useId();\n const sourceAndTarget: Haul.Item = useMemo(\n () => ({ key: id, type: \"Channel.SelectMultiple\" }),\n [id],\n );\n\n const {\n startDrag,\n onDragEnd: endDrag,\n ...dragProps\n } = Haul.useDragAndDrop({\n type: \"Channel.SelectSingle\",\n canDrop: useCallback((hauled) => canDrop(hauled, nullToArr(value)), [value]),\n onDrop: useCallback(\n ({ items }) => {\n const ch = Haul.filterByType(HAUL_TYPE, items);\n if (ch.length === 0) return [];\n onChange(ch[0].key as channel.Key, {\n clickedIndex: null,\n clicked: null,\n entries: [],\n });\n return ch;\n },\n [sourceAndTarget, onChange],\n ),\n });\n\n const dragging = Haul.useDraggingState();\n const onDragStart = useCallback(\n () => value != null && startDrag([{ type: HAUL_TYPE, key: value }]),\n [startDrag, value],\n );\n\n const entryRenderKey = useCallback(\n (e: channel.Payload) => aliases[e.key] ?? e.name,\n [aliases],\n );\n\n return (\n <Select.Single\n data={data}\n className={CSS(className, CSS.dropRegion(canDrop(dragging, nullToArr(value))))}\n value={value}\n onDragStart={onDragStart}\n onDragEnd={endDrag}\n onChange={onChange}\n searcher={searcher}\n columns={columns}\n emptyContent={emptyContent}\n entryRenderKey={entryRenderKey}\n {...dragProps}\n {...props}\n />\n );\n};\n","import { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { Status } from \"@/status\";\nimport { PropsWithChildren } from \"react\";\nimport \"@/note/Note.css\";\n\nexport interface NoteProps extends Align.SpaceProps<\"div\"> {\n variant: Status.Variant;\n}\n\nexport const Note = ({\n variant,\n className,\n children,\n ...props\n}: NoteProps): JSX.Element => (\n <Align.Space\n className={CSS(className, CSS.B(\"note\"), CSS.M(variant))}\n align=\"stretch\"\n empty\n {...props}\n >\n {children}\n </Align.Space>\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { deep, type direction, type location, type spatial } from \"@synnaxlabs/x\";\n\nimport { type Node } from \"@/mosaic/types\";\nimport { Tabs } from \"@/tabs\";\n\nconst TabNotFound = new Error(\"Tab not found\");\nconst InvalidMosaic = new Error(\"Invalid Mosaic\");\n\n/**\n * Inserts a tab into a node in the mosaic. If the given key is not found,\n * the tab is inserted into the closest ancestor. This is to deal\n * with mosaic garbage collection.\n *\n * @param key - The key of the node to insert the tab into.\n * @param tab - The tab to insert.\n * @param loc - The location where the tab was 'dropped' relative to the node.\n */\nexport const insertTab = (\n root: Node,\n tab: Tabs.Tab,\n loc: location.Location = \"center\",\n key?: number,\n): Node => {\n root = shallowCopyNode(root);\n if (key === undefined) return insertAnywhere(root, tab);\n\n const node = findNodeOrAncestor(root, key);\n\n // In the case where we're dropping the node in the center,\n // simply add the tab, change the selection, and return.\n if (loc === \"center\") {\n node.tabs?.push(tab);\n node.selected = tab.tabKey;\n return root;\n }\n\n // If we're not dropping the tab in the center,\n // and we have no tabs in the current node,\n // we can't split the node (because one side would be empty),\n // so we do nothing.\n if (node.tabs == null || node.tabs.length === 0) return root;\n\n const [insertOrder, siblingOrder, dir] = splitArrangement(loc);\n node.direction = dir;\n\n node[insertOrder] = { key: 0, tabs: [tab], selected: tab.tabKey };\n node[siblingOrder] = { key: 0, tabs: node.tabs, selected: node.selected };\n\n if (node.first == null || node.last == null) throw InvalidMosaic;\n\n // Assigning these keeps the mosaic sorted so we can do ancestor searches.\n node.first.key = node.key * 2;\n node.last.key = node.key * 2 + 1;\n\n // Clear the previous node, as it's now been and is not used\n // for rendering.\n node.tabs = undefined;\n node.size = undefined;\n node.selected = undefined;\n\n return root;\n};\n\nconst insertAnywhere = (root: Node, tab: Tabs.Tab): Node => {\n root = shallowCopyNode(root);\n if (root.tabs != null) {\n root.tabs.push(tab);\n root.selected = tab.tabKey;\n return root;\n }\n if (root.first != null) root.first = insertAnywhere(root.first, tab);\n else if (root.last != null) root.last = insertAnywhere(root.last, tab);\n return root;\n};\n\n/**\n * Automatically selects tabs for all nodes in the mosaic if they don't already have\n * a selection.\n *\n * @param root - The root of the mosaic.\n * @returns A shallow copy of the root with all nodes having a selection.\n */\nexport const autoSelectTabs = (root: Node): [Node, string[]] => {\n root = shallowCopyNode(root);\n const selected: string[] = [];\n if (root.tabs != null) {\n root.selected = Tabs.resetSelection(root.selected, root.tabs);\n if (root.selected != null) selected.push(root.selected);\n }\n if (root.first != null) {\n const [f, s] = autoSelectTabs(root.first);\n root.first = f;\n selected.push(...s);\n }\n if (root.last != null) {\n const [r, l] = autoSelectTabs(root.last);\n root.last = r;\n selected.push(...l);\n }\n return [root, selected];\n};\n\n/**\n * Removes a tab from the mosaic and performs any necessary garbage collection.\n *\n * @param root - The root of the mosaic.\n * @param tabKey - The key of the tab to remove. This tab must exist in the mosaic.\n */\nexport const removeTab = (root: Node, tabKey: string): [Node, string | null] => {\n root = shallowCopyNode(root);\n const [, node] = findMosaicTab(root, tabKey);\n if (node == null) return [root, null];\n node.tabs = node.tabs?.filter((t) => t.tabKey !== tabKey);\n node.selected = Tabs.resetSelection(node.selected, node.tabs);\n root = gc(root);\n const selected = node.selected ?? findSelected(root);\n return [root, selected];\n};\n\nexport const findSelected = (root: Node): string | null => {\n if (root.selected != null) return root.selected;\n if (root.first != null) return findSelected(root.first);\n if (root.last != null) return findSelected(root.last);\n return null;\n};\n\n/**\n * Marks the given tab as selected.\n *\n * @param root - The root of the mosaic.\n * @param tabKey - The key of the tab to select. This tab must exist in the mosaic.\n * @returns A shallow copy of the root of the mosaic with the tab selected.\n */\nexport const selectTab = (root: Node, tabKey: string): Node => {\n root = shallowCopyNode(root);\n const [tab, entry] = findMosaicTab(root, tabKey);\n if (tab == null || entry == null) throw TabNotFound;\n entry.selected = tabKey;\n return root;\n};\n\n/**\n * Moves a tab from one node to another.\n *\n * @param root - The root of the mosaic.\n * @param to - The key of the node to move the tab to.\n * @param tabKey - The key of the tab to move. This tab must exist in the mosaic.\n * @param loc - The location where the tab was 'dropped' relative to the node.\n * @returns A shallow copy of the root of the mosaic with the tab moved.\n */\nexport const moveTab = (\n root: Node,\n tabKey: string,\n loc: location.Location,\n to: number,\n): [Node, string | null] => {\n root = shallowCopyNode(root);\n const [tab, entry] = findMosaicTab(root, tabKey);\n if (tab == null || entry == null) throw TabNotFound;\n const [r2, selected] = removeTab(root, tabKey);\n const r3 = insertTab(r2, tab, loc, to);\n return [r3, selected];\n};\n\n/**\n * Resizes the given mosaic leaf.\n *\n * @param root - The root of the mosaic.\n * @param key - The key of the leaf to resize.\n * @param size - The new size distribution for the leaf. Expressed as either a percentage\n * or a number of pixels of the first child.\n * @returns A shallow copy of the root of the mosaic with the leaf resized.\n */\nexport const resizeNode = (root: Node, key: number, size: number): Node => {\n const node = findMosaicNode(root, key);\n if (node == null) throw new Error(\"Node not found\");\n else node.size = size;\n return root;\n};\n\n/**\n * Sets the title of a tab.\n *\n * @param root - The root of the mosaic.\n * @param tabKey - The key of the tab to resize.\n * @param name - The new title of the tab.\n * @returns A shallow copy of the root of the mosaic with the tab title changed.\n */\nexport const renameTab = (root: Node, tabKey: string, name: string): Node => {\n root = shallowCopyNode(root);\n const [, leaf] = findMosaicTab(root, tabKey);\n if (leaf?.tabs == null) throw TabNotFound;\n leaf.tabs = Tabs.rename(tabKey, name, leaf?.tabs ?? []);\n return root;\n};\n\n/***\n * @returns True if the given mosaic node is empty, false otherwise.\n */\nexport const isEmpty = (root: Node): boolean => {\n if (root.tabs != null) return root.tabs.length === 0;\n return root.first == null && root.last == null;\n};\n\n/** Finds the node with the given key or its closest ancestor. */\nconst findNodeOrAncestor = (root: Node, key: number): Node => {\n const node = findMosaicNode(root, key);\n if (node != null) return node;\n const next = Math.floor(key / 2);\n return next === 0 ? root : findNodeOrAncestor(root, next);\n};\n\nconst gc = (root: Node): Node => {\n let gced = true;\n while (gced) [root, gced] = _gc(root);\n if (root.first == null && root.last == null) root.key = 1;\n return root;\n};\n\nconst _gc = (node: Node): [Node, boolean] => {\n if (node.first == null || node.last == null) return [node, false];\n if (shouldGc(node.first)) return [liftUp(node.last, true), true];\n if (shouldGc(node.last)) return [liftUp(node.first, false), true];\n let [sGC, eGC] = [false, false];\n [node.first, sGC] = _gc(node.first);\n [node.last, eGC] = _gc(node.last);\n return [node, sGC || eGC];\n};\n\nconst liftUp = (node: Node, isLast: boolean): Node => {\n node.size = undefined;\n node.key = (node.key - Number(isLast)) / 2;\n return node;\n};\n\nconst shouldGc = (node: Node): boolean =>\n node.first == null &&\n node.last == null &&\n (node.tabs == null || node.tabs.length === 0);\n\nconst findMosaicTab = (\n node: Node,\n tabKey: string,\n): [Tabs.Tab | undefined, Node | undefined] => {\n if (node.tabs != null) {\n const tab = node.tabs.find((t) => t.tabKey === tabKey);\n if (tab != null) return [tab, node];\n }\n if (node.first == null || node.last == null) return [undefined, undefined];\n const [t1Tab, t2Tree] = findMosaicTab(node.first, tabKey);\n if (t1Tab != null && t2Tree != null) return [t1Tab, t2Tree];\n const [t2Tab, t2Tree2] = findMosaicTab(node.last, tabKey);\n return [t2Tab, t2Tree2];\n};\n\nconst findMosaicNode = (node: Node, key: number): Node | undefined => {\n if (node.key === key) return node;\n if (node.first == null || node.last == null) return undefined;\n const n1 = findMosaicNode(node.first, key);\n if (n1 != null) return n1;\n return findMosaicNode(node.last, key);\n};\n\nconst splitArrangement = (\n insertPosition: location.Location,\n): [spatial.Order, spatial.Order, direction.Direction] => {\n switch (insertPosition) {\n case \"top\":\n return [\"first\", \"last\", \"y\"];\n case \"left\":\n return [\"first\", \"last\", \"x\"];\n case \"bottom\":\n return [\"last\", \"first\", \"y\"];\n case \"right\":\n return [\"last\", \"first\", \"x\"];\n case \"center\":\n throw new Error(\"cannot split a center placed tab\");\n }\n};\n\nconst shallowCopyNode = (node: Node): Node => deep.copy(node);\n\nexport const mapNodes = <O>(root: Node, fn: (node: Node) => O, acc: O[] = []): O[] => {\n acc.push(fn(root));\n if (root.first != null) mapNodes(root.first, fn, acc);\n if (root.last != null) mapNodes(root.last, fn, acc);\n return acc;\n};\n","import { createRef, useEffect, useRef } from \"react\";\n\nimport { createPortal } from \"react-dom\";\n\ntype NodeProps = Record<string, string>;\n\nexport class Node {\n parent: ParentNode | undefined;\n stub: HTMLElement | undefined;\n el: HTMLElement;\n\n constructor(props: NodeProps = {}) {\n this.el = document.createElement(\"div\");\n Object.entries(props).forEach(([k, v]) => this.el.setAttribute(k, v));\n }\n\n mount(to: ParentNode, stub: HTMLElement): void {\n if (stub === this.stub) return;\n this.unmount(null);\n to.replaceChild(this.el, stub);\n this.parent = to;\n this.stub = stub;\n }\n\n unmount(stub: HTMLElement | null): void {\n // Skip unmounts for placeholders that aren't currently mounted\n // They will have been automatically unmounted already by a subsequent mount()\n if (\n (stub != null && stub !== this.stub) ||\n this.parent == null ||\n this.stub == null\n )\n return;\n this.parent.replaceChild(this.stub, this.el);\n this.parent = undefined;\n this.stub = undefined;\n }\n}\n\nexport interface OutProps {\n node: Node;\n}\n\nexport const Out = ({ node }: OutProps): React.ReactElement => {\n const stub = createRef<HTMLDivElement>();\n const portal = useRef<Node>(node);\n useEffect(() => {\n const placeholder = stub.current;\n if (placeholder == null) return;\n const parent = placeholder.parentNode;\n if (parent == null) return;\n node.mount(parent, placeholder);\n return () => {\n if (stub.current != null) node.unmount(stub.current);\n };\n }, []);\n useEffect(() => {\n if (portal.current != null && node !== portal.current) {\n portal.current.unmount(stub.current);\n portal.current = node;\n }\n const placeholder = stub.current;\n if (placeholder == null) return;\n const parent = placeholder.parentNode;\n if (parent == null) return;\n node.mount(parent, placeholder);\n }, [node]);\n return <div ref={stub} />;\n};\n\ninterface InProps extends OutProps {\n children: React.ReactNode;\n}\n\nexport const In = ({ node, children }: InProps): React.ReactElement =>\n createPortal(children, node.el);\n","// Copyright 2023 Synnax Lab, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n useState,\n memo,\n useCallback,\n type ReactElement,\n useRef,\n type MutableRefObject,\n} from \"react\";\n\nimport { type box, type location } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Haul } from \"@/haul\";\nimport { type CanDrop } from \"@/haul/Haul\";\nimport { mapNodes } from \"@/mosaic/tree\";\nimport { type Node } from \"@/mosaic/types\";\nimport { Portal } from \"@/portal\";\nimport { Resize } from \"@/resize\";\nimport { Tabs } from \"@/tabs\";\n\nimport \"@/mosaic/Mosaic.css\";\n\n/** Props for the {@link Mosaic} component */\nexport interface MosaicProps\n extends Omit<\n Tabs.TabsProps,\n \"onDrop\" | \"tabs\" | \"onResize\" | \"onCreate\" | \"children\"\n > {\n root: Node;\n onDrop: (key: number, tabKey: string, loc: location.Location) => void;\n onResize: (key: number, size: number) => void;\n onCreate?: (key: number, loc: location.Location, tabKeys?: string[]) => void;\n children: Tabs.TabRenderProp;\n}\n\nexport const Mosaic = memo(({ children, ...props }: MosaicProps): ReactElement => {\n const ref = useRef<Map<string, Portal.Node>>(new Map());\n const existing = new Set<string>();\n const portaledNodes = mapNodes(props.root, (node) => {\n if (node.selected == null) return null;\n let pNode: Portal.Node | undefined = ref.current.get(node.selected);\n const tab = node.tabs?.find((t) => t.tabKey === node.selected);\n if (tab == null) return null;\n if (pNode == null) {\n pNode = new Portal.Node({\n style: \"width: 100%; height: 100%; position: relative;\",\n });\n // Events don't propagate upward from the portaled node, so we need to bind\n // the onsSelect handler here.\n pNode.el.addEventListener(\"click\", () => props.onSelect?.(tab.tabKey));\n ref.current.set(node.selected, pNode);\n }\n existing.add(node.selected);\n return (\n <Portal.In key={tab.tabKey} node={pNode}>\n {children(tab)}\n </Portal.In>\n );\n });\n ref.current.forEach((_, key) => !existing.has(key) && ref.current.delete(key));\n\n return (\n <>\n {portaledNodes}\n <MosaicInternal portalNodes={ref} {...props} />\n </>\n );\n});\n\ninterface MosaicInternalProps extends Omit<MosaicProps, \"children\"> {\n portalNodes: MutableRefObject<Map<string, Portal.Node>>;\n}\n\n/***\n * Mosaic renders a tree of tab panes, with the ability to drag and drop tabs to\n * different locations in the tree as well as resize the panes (think of your typical\n * code editor). This component should be used in conjunction with the Mosaic.use hook\n * to implement the mosaic logic and maintain the state.\n *\n * @param props - The props for the Mosaic component. All props not listed below are\n * passed to the Tabs component of each set of tabs in the mosaic.\n * @param props.root - The root of the mosaic tree. This prop is provided by the\n * Mosaic.use hook.\n * @param props.onDrop - The callback executed when a tab is dropped in a new location.\n * This prop is provided by the Mosaic.use hook.\n * @param props.onResize - The callback executed when a pane is resized. This prop is\n * provided by the Mosaic.use hook.\n */\nconst MosaicInternal = memo((props: MosaicInternalProps): ReactElement | null => {\n const { onResize, ...tabsProps } = props;\n const {\n root: { tabs, direction, first, last, key, size },\n emptyContent,\n ...childProps\n } = tabsProps;\n\n const handleResize = useCallback(\n ([size]: number[]) => onResize(key, size),\n [onResize],\n );\n\n const { props: resizeProps } = Resize.useMultiple({\n direction,\n onResize: handleResize,\n count: 2,\n initialSizes: size != null ? [size] : undefined,\n });\n\n let content: ReactElement | null;\n if (tabs !== undefined)\n content = <TabLeaf emptyContent={emptyContent} {...tabsProps} />;\n else if (first != null && last != null)\n content = (\n <Resize.Multiple\n align=\"stretch\"\n className={CSS.BE(\"mosaic\", \"resize\")}\n {...resizeProps}\n >\n <MosaicInternal\n key={first.key}\n {...childProps}\n root={first}\n onResize={onResize}\n />\n <MosaicInternal\n key={last.key}\n {...childProps}\n root={last}\n onResize={onResize}\n />\n </Resize.Multiple>\n );\n else {\n content = null;\n console.warn(\"Mosaic tree is malformed\");\n }\n\n return key === 1 ? <Haul.Provider>{content}</Haul.Provider> : content;\n});\nMosaic.displayName = \"Mosaic\";\nMosaicInternal.displayName = \"Mosaic\";\n\ninterface TabLeafProps extends Omit<MosaicInternalProps, \"onResize\"> {}\n\n/**\n * This type should be used when the user wants to drop a tab in the mosaic.\n * Dropping an item with this signature will call the {@link Mosaic} onDrop handler.\n */\nexport const HAUL_DROP_TYPE = \"pluto-mosaic-tab-drop\";\n/** This type should be used when the user wants to create a new tab in the mosaic. \nDropping an item with this signature will call the {@link Mosaic} onCreate handler. */\nexport const HAUL_CREATE_TYPE = \"pluto-mosaic-tab-create\";\n\n/** Checks whether the tab can actually be dropped in this location or not */\nconst validDrop = (tabs: Tabs.Tab[], dragging: Haul.Item[]): boolean => {\n const drop = Haul.filterByType(HAUL_DROP_TYPE, dragging).map((t) => t.key);\n const willHaveTabRemaining = tabs.filter((t) => !drop.includes(t.tabKey)).length > 0;\n const create = Haul.filterByType(HAUL_CREATE_TYPE, dragging);\n return (\n create.length > 0 ||\n (drop.length > 0 && (willHaveTabRemaining || tabs.length === 0))\n );\n};\n\nconst TabLeaf = memo(\n ({\n root: node,\n onDrop,\n onCreate,\n portalNodes,\n ...props\n }: TabLeafProps): ReactElement => {\n const { key, tabs } = node as Omit<Node, \"tabs\"> & { tabs: Tabs.Tab[] };\n\n const [dragMask, setDragMask] = useState<location.Location | null>(null);\n\n const canDrop: CanDrop = useCallback(({ items }) => validDrop(tabs, items), [tabs]);\n\n const handleDrop = useCallback(\n ({ items, event }: Haul.OnDropProps): Haul.Item[] => {\n setDragMask(null);\n const dropped = Haul.filterByType(HAUL_DROP_TYPE, items);\n const loc =\n tabs.length === 0 ? \"center\" : insertLocation(getDragLocationPercents(event));\n if (dropped.length > 0) {\n const tabKey = dropped.map(({ key }) => key)[0];\n onDrop(key, tabKey as string, loc);\n }\n const created = Haul.filterByType(HAUL_CREATE_TYPE, items);\n if (created.length > 0) {\n const tabKey = created.map(({ key }) => key);\n onCreate?.(key, loc, tabKey as string[]);\n }\n return dropped;\n },\n [onDrop, tabs.length],\n );\n\n const handleDragOver = useCallback(\n ({ event }: Haul.OnDragOverProps): void => {\n const location: location.Location =\n tabs.length === 0 ? \"center\" : insertLocation(getDragLocationPercents(event));\n setDragMask(location);\n },\n [tabs.length],\n );\n\n const { startDrag, ...haulProps } = Haul.useDragAndDrop({\n type: \"Mosaic\",\n canDrop,\n onDrop: handleDrop,\n onDragOver: handleDragOver,\n });\n\n const dragging = canDrop(Haul.useDraggingState());\n\n const handleDragLeave = useCallback((): void => setDragMask(null), []);\n\n const handleDragStart = useCallback(\n (_: unknown, { tabKey }: Tabs.Tab): void =>\n startDrag([{ key: tabKey, type: HAUL_DROP_TYPE }]),\n [startDrag],\n );\n\n const handleTabCreate = useCallback((): void => onCreate?.(key, \"center\"), [key]);\n\n return (\n <div className={CSS.BE(\"mosaic\", \"leaf\")}>\n <Tabs.Tabs\n id={`tab-${key}`}\n tabs={tabs}\n onDragLeave={handleDragLeave}\n selected={node.selected}\n onDragStart={handleDragStart}\n onCreate={handleTabCreate}\n {...props}\n {...haulProps}\n >\n <Portal.Out\n node={portalNodes.current.get(node.selected as string) as Portal.Node}\n />\n {dragging && (\n <div\n style={{\n zIndex: 1000,\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n }}\n />\n )}\n </Tabs.Tabs>\n {dragMask != null && (\n <div className={CSS.BE(\"mosaic\", \"mask\")} style={maskStyle[dragMask]} />\n )}\n </div>\n );\n },\n);\n\nTabLeaf.displayName = \"MosaicTabLeaf\";\n\nconst maskStyle: Record<location.Location, box.CSS> = {\n top: { left: \"0%\", top: \"0%\", width: \"100%\", height: \"50%\" },\n bottom: { left: \"0%\", top: \"50%\", width: \"100%\", height: \"50%\" },\n left: { left: \"0%\", top: \"0%\", width: \"50%\", height: \"100%\" },\n right: { left: \"50%\", top: \"0%\", width: \"50%\", height: \"100%\" },\n center: { left: \"0%\", top: \"0%\", width: \"100%\", height: \"100%\" },\n};\n\nconst getDragLocationPercents = (\n e: React.DragEvent<Element>,\n): { px: number; py: number } => {\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n // This means we're in the selector.\n // TODO: This size depends on the theme and the size of the tabs,\n // we need to handle this better in the future.\n if (y < 24) return { px: 0.5, py: 0.5 };\n return { px: x / rect.width, py: y / rect.height };\n};\n\nconst crossHairA = (px: number): number => px;\n\nconst crossHairB = (px: number): number => 1 - px;\n\nconst insertLocation = ({ px, py }: { px: number; py: number }): location.Location => {\n if (px > 0.33 && px < 0.66 && py > 0.33 && py < 0.66) return \"center\";\n const [aY, bY] = [crossHairA(px), crossHairB(px)];\n if (py > aY && py > bY) return \"bottom\";\n if (py < aY && py < bY) return \"top\";\n if (py > aY && py < bY) return \"left\";\n if (py < aY && py > bY) return \"right\";\n throw new Error(\"[bug] - invalid insert position\");\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useEffect, useState } from \"react\";\n\nimport { type location } from \"@synnaxlabs/x\";\n\nimport {\n moveTab,\n removeTab,\n resizeNode,\n selectTab,\n renameTab,\n autoSelectTabs,\n} from \"@/mosaic/tree\";\nimport { type Node } from \"@/mosaic/types\";\n\nexport interface UseProps {\n allowRename?: boolean;\n initialTree: Node;\n}\n\nexport interface UseReturn {\n root: Node;\n onDrop: (key: number, tabKey: string, loc: location.Location) => void;\n onClose: (tabKey: string) => void;\n onSelect: (tabKey: string) => void;\n onResize: (key: number, sizes: number) => void;\n onRename?: (tabKey: string, name: string) => void;\n}\n\n/**\n * The Mosaic.use hook implements the state management and logic for the Mosaic\n * component. This hook should be used in conjunction with the Mosaic component.\n *\n * @param props - The props for the Mosaic.use hook.\n * @param props.initialValue - The initial root node of the mosaic tree. For\n * information on what this node should look like, see the {@link Node}\n * type.\n */\nexport const use = ({ allowRename = false, initialTree }: UseProps): UseReturn => {\n const [root, setRoot] = useState(initialTree);\n\n useEffect(() => setRoot(autoSelectTabs(initialTree)[0]), [initialTree]);\n\n const handleDrop = (key: number, tabKey: string, loc: location.Location): void =>\n setRoot((r) => moveTab(r, tabKey, loc, key)[0]);\n\n const handleClose = (tabKey: string): void => setRoot((r) => removeTab(r, tabKey)[0]);\n\n const handleSelect = (tabKey: string): void => setRoot((r) => selectTab(r, tabKey));\n\n const handleResize = (key: number, size: number): void =>\n setRoot((r) => resizeNode(r, key, size));\n\n const handleRename = (tabKey: string, title: string): void =>\n setRoot((r) => renameTab(r, tabKey, title));\n\n return {\n root,\n onDrop: handleDrop,\n onClose: handleClose,\n onSelect: handleSelect,\n onResize: handleResize,\n onRename: allowRename ? handleRename : undefined,\n };\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type PropsWithChildren, useCallback } from \"react\";\n\nimport { box } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { CSS } from \"@/css\";\nimport { useResize, useSyncedRef } from \"@/hooks\";\nimport { eraser } from \"@/vis/eraser/aether\";\n\nexport interface UseProps {\n aetherKey: string;\n}\n\nexport interface UseReturn {\n setEnabled: (enabled: boolean) => void;\n erase: (region: box.Box) => void;\n}\n\nexport const use = ({ aetherKey }: UseProps): UseReturn => {\n const [, { region }, setState] = Aether.use({\n aetherKey,\n type: eraser.Eraser.TYPE,\n schema: eraser.eraserStateZ,\n initialState: { region: box.ZERO, enabled: true },\n });\n const regionRef = useSyncedRef(region);\n const erase = useCallback(\n (b: box.Box) => {\n if (box.equals(b, regionRef.current)) return;\n setState((p) => ({ ...p, region: b }));\n },\n [setState],\n );\n const setEnabled = useCallback(\n (enabled: boolean) => setState((p) => ({ ...p, enabled })),\n [setState],\n );\n\n return { setEnabled, erase };\n};\n\nexport interface EraserProps extends PropsWithChildren {}\n\nexport const Eraser = Aether.wrap<EraserProps>(\n eraser.Eraser.TYPE,\n ({ aetherKey, children }) => {\n const { erase } = use({ aetherKey });\n const ref = useResize(erase);\n return (\n <div ref={ref} className={CSS(CSS.inheritDims())}>\n {children}\n </div>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useState, useLayoutEffect } from \"react\";\n\nimport { type box, location } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { CSS } from \"@/css\";\nimport { type BarProps } from \"@/nav/Bar\";\nimport { Resize } from \"@/resize\";\nimport { Eraser } from \"@/vis/eraser\";\n\nimport \"@/nav/Drawer.css\";\n\nexport interface DrawerItem {\n key: string;\n content: ReactElement;\n minSize?: number;\n maxSize?: number;\n initialSize?: number;\n}\n\nexport interface UseDrawerProps {\n initialKey?: string;\n items: DrawerItem[];\n}\n\nexport interface UseDrawerReturn {\n activeItem?: DrawerItem;\n onSelect?: (key: string) => void;\n}\n\nexport interface DrawerProps\n extends Omit<BarProps, \"onSelect\" | \"onResize\">,\n UseDrawerReturn,\n Partial<Pick<Resize.SingleProps, \"onResize\" | \"collapseThreshold\">> {}\n\nexport const useDrawer = ({ items, initialKey }: UseDrawerProps): UseDrawerReturn => {\n const [activeKey, setActiveKey] = useState<string | undefined>(initialKey);\n const handleSelect = (key: string): void =>\n setActiveKey(key === activeKey ? undefined : key);\n const activeItem = items.find((item) => item.key === activeKey);\n return { onSelect: handleSelect, activeItem };\n};\n\nexport const Drawer = Aether.wrap<DrawerProps>(\n \"Nav.Drawer\",\n ({\n aetherKey,\n activeItem,\n children,\n onSelect,\n location: loc_ = \"left\",\n collapseThreshold = 0.65,\n className,\n onResize,\n ...props\n }): ReactElement | null => {\n const dir = location.direction(loc_);\n const handleCollapse = useCallback(\n () => activeItem != null && onSelect?.(activeItem.key),\n [onSelect, activeItem?.key],\n );\n const { erase, setEnabled } = Eraser.use({ aetherKey });\n const handleResize = useCallback(\n (size: number, box: box.Box) => {\n onResize?.(size, box);\n erase(box);\n },\n [onResize, erase],\n );\n useLayoutEffect(() => {\n setEnabled(activeItem != null);\n }, [activeItem, setEnabled]);\n if (activeItem == null) return null;\n const { content, key, ...rest } = activeItem;\n return (\n <Resize.Single\n key={key}\n className={CSS(CSS.BE(\"navdrawer\", \"content\"), CSS.dir(dir), className)}\n collapseThreshold={collapseThreshold}\n onCollapse={handleCollapse}\n location={loc_}\n onResize={handleResize}\n {...rest}\n {...props}\n >\n {activeItem.content}\n </Resize.Single>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type FunctionComponent, type ReactElement } from \"react\";\n\nimport { direction, location, type spatial } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\n\nimport \"@/nav/Bar.css\";\n\nexport interface BarProps extends Omit<Align.SpaceProps, \"direction\" | \"size\" | \"ref\"> {\n location?: location.Crude;\n size?: string | number;\n}\n\nconst CoreBar = ({\n location: location_ = \"left\",\n size = \"9rem\",\n className,\n style,\n ...props\n}: BarProps): ReactElement => {\n const loc = location.construct(location_);\n const dir = location.direction(loc);\n const oppositeDir = direction.swap(dir);\n return (\n <Align.Space\n className={CSS(\n CSS.B(\"navbar\"),\n CSS.bordered(location.swap(loc)),\n CSS.dir(oppositeDir),\n CSS.loc(loc),\n className,\n )}\n direction={oppositeDir}\n style={{\n [direction.dimension(dir)]: size,\n ...style,\n }}\n align=\"center\"\n empty\n {...props}\n />\n );\n};\n\nexport interface BarContentProps extends Omit<Align.SpaceProps<\"div\">, \"ref\"> {\n bordered?: boolean;\n className?: string;\n}\n\nconst contentFactory =\n (\n pos: spatial.Alignment | \"\" | \"absolute-center\",\n ): FunctionComponent<BarContentProps> =>\n // eslint-disable-next-line react/display-name\n ({ bordered = false, className, ...props }: BarContentProps): ReactElement => (\n <Align.Space\n className={CSS(\n CSS.BE(\"navbar\", \"content\"),\n pos === \"absolute-center\" ? CSS.M(pos) : CSS.align(pos),\n pos !== \"\" && bordered && CSS.bordered(pos),\n className,\n )}\n align=\"center\"\n {...props}\n />\n );\n\ntype CoreBarType = typeof CoreBar;\n\nconst Start = contentFactory(\"start\");\nStart.displayName = \"NavbarStart\";\nconst End = contentFactory(\"end\");\nEnd.displayName = \"NavbarEnd\";\nconst Center = contentFactory(\"center\");\nCenter.displayName = \"NavbarCenter\";\nconst Content = contentFactory(\"\");\nContent.displayName = \"NavbarContent\";\nconst AbsoluteCenter = contentFactory(\"absolute-center\");\nAbsoluteCenter.displayName = \"NavbarAbsoluteCenter\";\n\nexport interface BarType extends CoreBarType {\n Start: typeof Start;\n Center: typeof Center;\n End: typeof End;\n AbsoluteCenter: typeof AbsoluteCenter;\n Content: typeof Content;\n}\n\nexport const Bar = CoreBar as BarType;\n\nBar.Start = Start;\nBar.Center = Center;\nBar.End = End;\nBar.AbsoluteCenter = AbsoluteCenter;\nBar.Content = Content;\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Align } from \"@/align\";\nimport { type Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { type InternalControlsProps } from \"@/os/Controls/types\";\nimport { type ComponentSize } from \"@/util/component\";\n\nimport \"@/os/Controls/Mac.css\";\n\nexport const Icon = {\n Close: (\n <svg\n width=\"124\"\n height=\"124\"\n viewBox=\"0 0 124 124\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"26.8701\"\n y=\"88.3883\"\n width=\"87\"\n height=\"11\"\n transform=\"rotate(-45 26.8701 88.3883)\"\n fill=\"#7E0508\"\n />\n <rect\n x=\"26.8701\"\n y=\"34.6482\"\n width=\"11\"\n height=\"87\"\n transform=\"rotate(-45 26.8701 34.6482)\"\n fill=\"#7E0508\"\n />\n </svg>\n ),\n Minimize: (\n <svg\n width=\"87\"\n height=\"11\"\n viewBox=\"0 0 87 11\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"15\" width=\"60\" height=\"11\" fill=\"#985712\" />\n </svg>\n ),\n Maximize: (\n <svg\n width=\"143\"\n height=\"143\"\n viewBox=\"0 0 143 143\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M108.242 32.8833C108.797 32.8817 109.247 33.3317 109.245 33.8862L109.092 87.5891C109.09 88.4786 108.014 88.9223 107.385 88.2933L53.8351 34.7432C53.2061 34.1142 53.6499 33.0387 54.5394 33.0361L108.242 32.8833Z\"\n fill=\"#0B650D\"\n />\n <path\n d=\"M33.8862 109.245C33.3317 109.247 32.8818 108.797 32.8833 108.242L33.0361 54.5394C33.0387 53.6499 34.1142 53.2061 34.7432 53.8351L88.2934 107.385C88.9223 108.014 88.4786 109.09 87.5891 109.092L33.8862 109.245Z\"\n fill=\"#0B650D\"\n />\n </svg>\n ),\n};\n\nexport const MacOS = ({\n disabled = [],\n className,\n focused = true,\n onMinimize,\n onMaximize,\n onFullscreen,\n onClose,\n ...props\n}: InternalControlsProps): ReactElement => (\n <Align.Space\n size={1.5}\n direction=\"x\"\n className={CSS(\n CSS.B(\"macos-controls\"),\n !focused && CSS.BM(\"macos-controls\", \"blurred\"),\n className,\n )}\n {...props}\n >\n <TrafficLight\n onClick={onClose}\n className={CSS.BM(\"macos-control\", \"close\")}\n disabled={disabled.includes(\"close\")}\n >\n {Icon.Close}\n </TrafficLight>\n <TrafficLight\n onClick={onMinimize}\n className={CSS.BM(\"macos-control\", \"minimize\")}\n disabled={disabled.includes(\"minimize\")}\n >\n {Icon.Minimize}\n </TrafficLight>\n <TrafficLight\n onClick={onFullscreen}\n className={CSS.BM(\"macos-control\", \"maximize\")}\n disabled={disabled.includes(\"maximize\")}\n >\n {Icon.Maximize}\n </TrafficLight>\n </Align.Space>\n);\n\ninterface TrafficLightProps extends Button.IconProps {}\n\nconst TrafficLight = ({\n className,\n disabled,\n ...props\n}: TrafficLightProps): ReactElement => (\n <button\n className={CSS(CSS.B(\"macos-control\"), CSS.disabled(disabled), className)}\n tabIndex={-1}\n disabled={disabled}\n size={\"\" as ComponentSize}\n {...props}\n />\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Align } from \"@/align\";\nimport { Button as CoreButton } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { type InternalControlsProps } from \"@/os/Controls/types\";\n\nimport \"@/os/Controls/Windows.css\";\n\nexport const Windows = ({\n disabled = [],\n onMinimize,\n onMaximize,\n onClose,\n // no-op on windows\n onFullscreen: _,\n ...props\n}: InternalControlsProps): ReactElement => (\n <Align.Pack {...props}>\n <Button\n className={CSS.BM(\"windows-control\", \"minimize\")}\n onClick={onMinimize}\n disabled={disabled.includes(\"minimize\")}\n >\n <Icon.Subtract />\n </Button>\n <Button\n className={CSS.BM(\"windows-control\", \"maximize\")}\n onClick={onMaximize}\n disabled={disabled.includes(\"maximize\")}\n >\n <Icon.Box />\n </Button>\n <Button\n onClick={onClose}\n className={CSS.BM(\"windows-control\", \"close\")}\n disabled={disabled.includes(\"close\")}\n >\n <Icon.Close />\n </Button>\n </Align.Pack>\n);\n\nconst Button = ({\n disabled = false,\n className,\n ...props\n}: CoreButton.IconProps): ReactElement | null =>\n !disabled ? (\n <CoreButton.Icon\n className={CSS(CSS.B(\"windows-control\"), className)}\n tabIndex={-1}\n {...props}\n />\n ) : null;\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { runtime } from \"@synnaxlabs/x\";\n\nexport const use = (props?: runtime.GetOSProps): runtime.OS | undefined =>\n runtime.getOS(props);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { type runtime } from \"@synnaxlabs/x\";\n\nimport { MacOS } from \"@/os/Controls/Mac\";\nimport { type InternalControlsProps } from \"@/os/Controls/types\";\nimport { Windows } from \"@/os/Controls/Windows\";\nimport { use } from \"@/os/use\";\n\nconst Variants: Record<runtime.OS, React.FC<InternalControlsProps>> = {\n MacOS,\n Windows,\n Linux: Windows,\n Docker: Windows,\n};\n\nconst DEFAULT_OS = \"Windows\";\n\nexport interface ControlsProps extends InternalControlsProps {\n visibleIfOS?: runtime.OS;\n}\n\nexport const Controls = ({\n forceOS,\n visibleIfOS,\n ...props\n}: ControlsProps): ReactElement | null => {\n const os = use({ force: forceOS, default: DEFAULT_OS }) as runtime.OS;\n const C = Variants[os];\n if (visibleIfOS != null && visibleIfOS !== os) return null;\n return <C {...props} />;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { xy, location, box, direction } from \"@synnaxlabs/x\";\n\nexport interface CheckIntegrityProps {\n sourcePos: xy.XY;\n targetPos: xy.XY;\n next: Segment[];\n prev: Segment[];\n}\n\nexport const checkIntegrity = ({\n sourcePos,\n targetPos,\n next,\n prev,\n}: CheckIntegrityProps): boolean => {\n const theoTarget = travelSegments(sourcePos, ...next);\n if (xy.distance(theoTarget, targetPos) < 1) return true;\n console.warn(\"Connector is out of sync with target\");\n console.log(\"Theoretical target\", theoTarget);\n console.log(\"Actual target\", targetPos);\n console.log(\"Segments\", next);\n console.log(\"Prev segments\", prev);\n return false;\n};\n\nexport interface ChangeOrientationProps {\n orientation: location.Outer;\n segments: Segment[];\n}\n\nexport const changeSourceOrientation = (props: ChangeOrientationProps): Segment[] =>\n compressSegments(internalChangeOrientation(props, false));\n\nexport const changeTargetOrientation = (props: ChangeOrientationProps): Segment[] =>\n compressSegments(internalChangeOrientation(props, true));\n\nconst internalChangeOrientation = (\n { orientation, segments }: ChangeOrientationProps,\n reverse: boolean,\n): Segment[] => {\n const stumschematicx = reverse ? segments.length - 1 : 0;\n let next = [...segments];\n const stump = next[stumschematicx];\n const currOrientation = segmentOrientation(stump);\n if (currOrientation === orientation) return next;\n const dir = direction.construct(orientation);\n const newStumpLength = setOrientationOnLength(orientation, STUMP_LENGTH);\n next = moveNodeInDirection(dir, xy.set(xy.ZERO, dir, -newStumpLength), next, reverse);\n\n const newStump = { direction: dir, length: newStumpLength };\n if (reverse) next.push(newStump);\n else next.unshift(newStump);\n return next;\n};\nexport interface PrepareNodeProps {\n sourceStumpTip: xy.XY;\n sourceOrientation: location.Outer;\n sourceBox: box.Box;\n targetStumpTip: xy.XY;\n targetOrientation: location.Outer;\n targetBox: box.Box;\n}\n\nexport const prepareNode = ({\n sourceStumpTip: sourcePos,\n sourceOrientation,\n sourceBox,\n targetStumpTip: targetPos,\n targetOrientation,\n targetBox,\n}: PrepareNodeProps): Segment | undefined => {\n // This is the case where the final connection line will not overlap with the node,\n // so we don't need to create an extra segment.\n if (!needToGoAround({ sourcePos, sourceOrientation, targetPos })) return;\n\n const sourceDirection = direction.construct(sourceOrientation);\n const swappedSourceDirection = direction.swap(sourceDirection);\n\n // This is the direction we need to travel in\n let orientationToTravelIn = orientationFromLength(\n swappedSourceDirection,\n targetPos[swappedSourceDirection] - sourcePos[swappedSourceDirection],\n );\n\n // We need to grab the edge of the node in this direction\n const nodeEdge = box.loc(sourceBox, orientationToTravelIn);\n\n // If they are pointing in opposite directions, we need to check if we need to\n // go completely around the node if there isn't enough space for a connector\n // between the two nodes.\n if (location.swap(sourceOrientation) === targetOrientation) {\n // In this case we do need to go around the node.\n const targetNodeEdge = box.loc(targetBox, location.swap(orientationToTravelIn));\n if (Math.abs(nodeEdge - targetNodeEdge) < STUMP_LENGTH)\n orientationToTravelIn = location.swap(orientationToTravelIn) as location.Outer;\n }\n // We need to travel from the source to the edge of the node plus MIN_LENGTH\n return {\n direction: swappedSourceDirection,\n length:\n nodeEdge -\n sourcePos[swappedSourceDirection] +\n setOrientationOnLength(orientationToTravelIn, STUMP_LENGTH),\n };\n};\n\nexport interface Segment {\n direction: direction.Direction;\n length: number;\n}\n\nexport const travelSegments = (source: xy.XY, ...segments: Segment[]): xy.XY => {\n let current = source;\n for (const segment of segments) {\n current = xy.translate(current, segment.direction, segment.length);\n }\n return current;\n};\n\nexport const segmentsToPoints = (\n source: xy.XY,\n segments: Segment[],\n zoom: number,\n applyTransform: boolean,\n): xy.XY[] => {\n try {\n let current = source;\n const points: xy.XY[] = [\n source,\n ...segments.map((s) => {\n current = xy.translate(current, s.direction, s.length);\n return current;\n }),\n ];\n if (!applyTransform) return points;\n\n const firstSeg = segments[0];\n const firstSegOrientation = orientationFromLength(\n firstSeg.direction,\n firstSeg.length,\n );\n const firstMag = orientationMagnitude(firstSegOrientation);\n points[0] = xy.translate(points[0], {\n [firstSeg.direction]: -1 * firstMag * 4 * zoom,\n [direction.swap(firstSeg.direction)]: 0,\n } as const as xy.XY);\n const lastSeg = segments[segments.length - 1];\n const lastSegOrientation = orientationFromLength(lastSeg.direction, lastSeg.length);\n const lastMag = orientationMagnitude(lastSegOrientation);\n points[points.length - 1] = xy.translate(points[points.length - 1], {\n [lastSeg.direction]: lastMag * 4 * zoom,\n [direction.swap(lastSeg.direction)]: 0,\n } as const as xy.XY);\n\n return points;\n } catch (e) {\n return [];\n }\n};\n\nexport interface BuildNew {\n sourceBox: box.Box;\n targetBox: box.Box;\n sourcePos: xy.XY;\n targetPos: xy.XY;\n sourceOrientation: location.Outer;\n targetOrientation: location.Outer;\n}\n\nexport const STUMP_LENGTH = 10;\n\nconst orientationMagnitude = (or: location.Outer): number =>\n or === \"top\" || or === \"left\" ? -1 : 1;\n\nconst setOrientationOnLength = (or: location.Outer, length: number): number =>\n or === \"top\" || or === \"left\" ? -length : length;\n\nconst orientationFromLength = (\n direction: direction.Direction,\n length: number,\n): location.Outer => {\n if (direction === \"x\") return length > 0 ? \"right\" : \"left\";\n return length > 0 ? \"bottom\" : \"top\";\n};\n\nconst segmentOrientation = (segment: Segment): location.Outer =>\n orientationFromLength(segment.direction, segment.length);\n\nexport interface NeedToGoAroundSourceProps {\n sourcePos: xy.XY;\n targetPos: xy.XY;\n sourceOrientation: location.Outer;\n}\n\nexport const needToGoAround = ({\n sourcePos,\n targetPos,\n sourceOrientation,\n}: NeedToGoAroundSourceProps): boolean => {\n const sourceDirection = direction.construct(sourceOrientation);\n const delta = targetPos[sourceDirection] - sourcePos[sourceDirection];\n return setOrientationOnLength(sourceOrientation, delta) < 0;\n};\n\nexport const stump = (orientation: location.Outer): Segment => ({\n direction: direction.construct(orientation),\n length: setOrientationOnLength(orientation, STUMP_LENGTH),\n});\n\nconst STUMPS = {\n top: stump(\"top\"),\n bottom: stump(\"bottom\"),\n left: stump(\"left\"),\n right: stump(\"right\"),\n};\n\nconst COMPRESSION_THRESHOLD = 4;\nconst DIRECT_REMOVAL_THRESHOLD = 0.25;\n\nexport const compressSegments = (segments: Segment[]): Segment[] => {\n return removeSameOrientationSegments(\n removeShortSegments(removeSameOrientationSegments(segments)),\n );\n};\n\nconst removeShortSegments = (segments: Segment[]): Segment[] => {\n const next: Segment[] = [...segments];\n const ok = segments.findIndex((seg, i) => {\n // If it's below the compression threshold and the user is making it smaller,\n // then we compress.\n const mag = Math.abs(seg.length);\n if (mag < COMPRESSION_THRESHOLD) {\n if (mag < DIRECT_REMOVAL_THRESHOLD) return true;\n if (i === 0 || i === segments.length - 1) return false;\n if (segments.length <= 3) return false;\n if (i + 2 < segments.length) {\n const toAdjust = next[i + 2];\n if (toAdjust.direction !== seg.direction) return false;\n next[i + 2] = { ...toAdjust, length: toAdjust.length + seg.length };\n } else {\n const toAdjust = next[i - 2];\n if (toAdjust.direction !== seg.direction) return false;\n next[i - 2] = { ...toAdjust, length: toAdjust.length + seg.length };\n }\n return true;\n }\n return false;\n });\n if (ok !== -1) {\n // splice out the short segment\n next.splice(ok, 1);\n return next;\n }\n return next;\n};\n\nconst removeSameOrientationSegments = (segments: Segment[]): Segment[] => {\n const next: Segment[] = [...segments];\n const idx = segments.findIndex((seg, i) => {\n const prevSeg = next[i - 1];\n if (i === 0 || seg.direction !== prevSeg.direction) return false;\n\n if (i === 1) {\n const stumschematicx = i - 1;\n const segIdx = i;\n const stumpOrientation = segmentOrientation(prevSeg);\n const segOrientation = segmentOrientation(seg);\n if (stumpOrientation === segOrientation) {\n next[i - 1] = {\n direction: next[i - 1].direction,\n length: next[i - 1].length + next[i].length,\n };\n next.splice(i, 1);\n return true;\n }\n if (Math.abs(prevSeg.length) === STUMP_LENGTH) return false;\n\n const stumpLength = setOrientationOnLength(stumpOrientation, STUMP_LENGTH);\n const delta = next[stumschematicx].length - stumpLength;\n const nextLength = next[segIdx].length + delta;\n if (Math.abs(nextLength) < STUMP_LENGTH) return false;\n next[stumschematicx] = { ...next[stumschematicx], length: stumpLength };\n next[segIdx] = { ...next[segIdx], length: nextLength };\n return true;\n }\n\n if (i === segments.length - 1) {\n const stumschematicx = i;\n const segIdx = i - 1;\n const stumpOrientation = segmentOrientation(seg);\n const segOrientation = segmentOrientation(prevSeg);\n if (stumpOrientation === segOrientation) {\n next[i - 1] = {\n direction: next[i - 1].direction,\n length: next[i - 1].length + next[i].length,\n };\n next.splice(i, 1);\n return true;\n }\n\n if (Math.abs(seg.length) === STUMP_LENGTH) return false;\n\n const stumpLength = setOrientationOnLength(stumpOrientation, STUMP_LENGTH);\n const delta = next[stumschematicx].length - stumpLength;\n const nextLength = next[segIdx].length + delta;\n if (Math.abs(nextLength) < STUMP_LENGTH) return false;\n next[stumschematicx] = { ...next[stumschematicx], length: stumpLength };\n next[segIdx] = { ...next[segIdx], length: nextLength };\n return true;\n }\n\n // splice out the short segment\n next[i - 1] = {\n direction: next[i - 1].direction,\n length: next[i - 1].length + next[i].length,\n };\n next.splice(i, 1);\n return true;\n });\n if (idx !== -1) return removeSameOrientationSegments(next);\n return next;\n};\n\nexport const buildNew = (props: BuildNew): Segment[] =>\n compressSegments(internalNewConnector(props));\n\nconst internalNewConnector = ({\n sourceBox,\n targetBox,\n sourcePos,\n targetPos,\n targetOrientation,\n sourceOrientation,\n}: BuildNew): Segment[] => {\n let sourceStumpOrientation = sourceOrientation;\n let targetStumpOrientation = targetOrientation;\n\n let sourceStump = { ...STUMPS[sourceOrientation] };\n let sourceStumpTip = travelSegments(sourcePos, sourceStump);\n\n const targetStump = { ...STUMPS[targetOrientation] };\n let targetStumpTip = travelSegments(targetPos, targetStump);\n\n const segments = [sourceStump];\n const extraSourceSeg = prepareNode({\n sourceStumpTip,\n sourceOrientation,\n sourceBox,\n targetStumpTip,\n targetOrientation,\n targetBox,\n });\n if (extraSourceSeg != null) {\n segments.push(extraSourceSeg);\n sourceStumpTip = travelSegments(sourceStumpTip, extraSourceSeg);\n sourceStumpOrientation = segmentOrientation(extraSourceSeg);\n sourceStump = extraSourceSeg;\n }\n\n const extraTargetSeg = prepareNode({\n sourceStumpTip: targetStumpTip,\n sourceOrientation: targetStumpOrientation,\n sourceBox: targetBox,\n targetStumpTip: sourceStumpTip,\n targetOrientation: sourceStumpOrientation,\n targetBox: sourceBox,\n });\n\n if (extraTargetSeg != null) {\n targetStumpTip = travelSegments(targetStumpTip, extraTargetSeg);\n targetStumpOrientation = orientationFromLength(\n extraTargetSeg.direction,\n extraTargetSeg.length,\n );\n }\n\n const addTargetSegments = (): void => {\n // We need to swap the orientations of the target stumps so that\n // they create the correct path when traversing the segments.\n if (extraTargetSeg != null) {\n extraTargetSeg.length *= -1;\n segments.push(extraTargetSeg);\n }\n targetStump.length *= -1;\n segments.push(targetStump);\n };\n\n // Here is where we draw the final connection line.\n // In this case we split the delta in half and draw three lines.\n if (location.swap(sourceStumpOrientation) === targetOrientation) {\n const dir = direction.construct(sourceStumpOrientation);\n // push three segments on\n // first segment is in same direction as source stump orientation and half way to the\n // target stump tip\n const dist = (targetStumpTip[dir] - sourceStumpTip[dir]) / 2;\n segments.push({ direction: dir, length: dist });\n const swappedDir = direction.swap(dir);\n // second segment is in the swapped direction of the source stump orientation and\n // the distance between the source stump tip and the target stump tip\n segments.push({\n direction: swappedDir,\n length: targetStumpTip[swappedDir] - sourceStumpTip[swappedDir],\n });\n // third segment is in the same direction as the source stump orientation and the\n // remaining distance to the target stump tip\n segments.push({ direction: dir, length: dist });\n addTargetSegments();\n return segments;\n }\n\n // In this case we draw two lines.\n // Check the delta in the direction of the source stump\n const delta =\n targetStumpTip[sourceStump.direction] - sourceStumpTip[sourceStump.direction];\n let swapped = direction.swap(sourceStump.direction);\n const swappedDelta = sourceStumpTip[swapped] - targetStumpTip[swapped];\n // Check if the delta is in the same direction as the source stump\n let firstSeg: Segment;\n if (\n orientationFromLength(sourceStump.direction, delta) === sourceStumpOrientation &&\n orientationFromLength(swapped, swappedDelta) === targetStumpOrientation\n ) {\n // This means we're good to go in this direction\n firstSeg = {\n direction: sourceStump.direction,\n length: delta,\n };\n } else {\n // This means we need to go orthogonally\n firstSeg = {\n direction: swapped,\n length: targetStumpTip[swapped] - sourceStumpTip[swapped],\n };\n swapped = direction.swap(swapped);\n }\n\n segments.push(firstSeg);\n // All we need to do next is draw a line\n const secondSeg = {\n direction: swapped,\n length: targetStumpTip[swapped] - sourceStumpTip[swapped],\n };\n segments.push(secondSeg);\n addTargetSegments();\n return segments;\n};\n\nexport interface MoveConnectorProps {\n segments: Segment[];\n index: number;\n magnitude: number;\n}\n\nexport const dragSegment = (props: MoveConnectorProps): Segment[] =>\n compressSegments(internalDragSegment(props));\n\nconst internalDragSegment = ({\n segments,\n index,\n magnitude,\n}: MoveConnectorProps): Segment[] => {\n const next = [...segments];\n const seg = next[index];\n const dir = direction.swap(seg.direction);\n const orientation = segmentOrientation(seg);\n\n // If we're dragging on a stump, we need to add two new segments.\n if (index === 0) {\n next.unshift({ direction: dir, length: magnitude });\n const stumpLength = setOrientationOnLength(orientation, STUMP_LENGTH);\n next.unshift({ direction: seg.direction, length: stumpLength });\n // Move the index up by two since we added two segments\n index += 2;\n // Since we added a new stump in the same direction as the old one, we need to\n // subtract the stump length from the segment.\n next[index] = { ...next[index], length: next[index].length - stumpLength };\n }\n // If it's not the stump just move it directly.\n else\n next[index - 1] = {\n direction: next[index - 1].direction,\n length: next[index - 1].length + magnitude,\n };\n\n // If we're dragging on the target stump, we need to add two new segments.\n if (index === next.length - 1) {\n next.push({ direction: dir, length: -magnitude });\n const stumpLength = setOrientationOnLength(orientation, STUMP_LENGTH);\n next.push({ direction: seg.direction, length: stumpLength });\n next[index] = { ...next[index], length: next[index].length - stumpLength };\n } else {\n next[index + 1] = {\n direction: next[index + 1].direction,\n length: next[index + 1].length - magnitude,\n };\n }\n\n return next;\n};\n\nconst findIndexBackwards = (\n segments: Segment[],\n cb: (seg: Segment, i: number) => boolean,\n): number => {\n for (let i = segments.length - 1; i >= 0; i--) {\n if (cb(segments[i], i)) return i;\n }\n return -1;\n};\n\nconst findNonTargetIdx = (\n segments: Segment[],\n cb: (seg: Segment, i: number) => boolean,\n reverse = false,\n ...exclude: number[]\n): number => {\n const internalCB = (seg: Segment, i: number): boolean =>\n !exclude.includes(i) && cb(seg, i);\n return reverse\n ? findIndexBackwards(segments, internalCB)\n : segments.findIndex(internalCB);\n};\n\nexport interface MoveNodeProps {\n delta: xy.XY;\n segments: Segment[];\n}\n\nexport const moveSourceNode = ({ delta, segments }: MoveNodeProps): Segment[] =>\n compressSegments(moveNodeInternal(delta, segments, false));\n\nexport const moveTargetNode = ({ delta, segments }: MoveNodeProps): Segment[] =>\n compressSegments(moveNodeInternal(delta, segments, true));\n\nconst moveNodeInternal = (\n delta: xy.XY,\n segments: Segment[],\n reverse: boolean,\n): Segment[] => {\n let next = [...segments];\n if (delta.x !== 0) next = moveNodeInDirection(\"x\", delta, next, reverse);\n if (delta.y !== 0) next = moveNodeInDirection(\"y\", delta, next, reverse);\n return next;\n};\n\nconst canAdjustStump = (\n dir: direction.Direction,\n seg: Segment,\n delta: xy.XY,\n): boolean => {\n if (seg.direction !== dir) return false;\n const next = { ...seg, length: seg.length - delta[dir] };\n const firstSegOrientation = segmentOrientation(seg);\n const nextFirstSegOrientation = segmentOrientation(next);\n const isAboveMinLength = Math.abs(next.length) > STUMP_LENGTH;\n const isSameOrientation = firstSegOrientation === nextFirstSegOrientation;\n return isAboveMinLength && isSameOrientation;\n};\n\nconst moveNodeInDirection = (\n dir: direction.Direction,\n delta: xy.XY,\n segments: Segment[],\n reverse: boolean,\n): Segment[] => {\n const swappedDirection = direction.swap(dir);\n // We'd always like to adjust the stump closest to the node if possible, but only\n // if compressing it won't make it too small OR cause it to reverse its orientation.\n const stumschematicx = reverse ? segments.length - 1 : 0;\n const stump = segments[stumschematicx];\n if (canAdjustStump(dir, stump, delta)) {\n segments[stumschematicx] = { ...stump, length: stump.length - delta[dir] };\n return segments;\n }\n\n const oppositeStumschematicx = reverse ? 0 : segments.length - 1;\n const isX = (seg: Segment): boolean => seg.direction === dir;\n const idxToAdjust = findNonTargetIdx(segments, isX, reverse, stumschematicx);\n if (idxToAdjust === oppositeStumschematicx) {\n const oppositeStump = segments[oppositeStumschematicx];\n if (canAdjustStump(dir, oppositeStump, delta)) {\n segments[oppositeStumschematicx] = {\n ...oppositeStump,\n length: oppositeStump.length - delta[dir],\n };\n return segments;\n } else {\n if (stump.direction === dir)\n segments[stumschematicx] = { ...stump, length: stump.length - delta[dir] };\n else\n segments[oppositeStumschematicx] = {\n ...oppositeStump,\n length: oppositeStump.length - delta[dir],\n };\n return segments;\n }\n }\n // This means that there is only one segment in the 'swappedDirection' direction in the whole\n // connector, so we split it in half and add a new segment.\n if (idxToAdjust === -1)\n if (segments.length === 1) {\n if (segments[0].direction === dir)\n return [{ direction: dir, length: segments[0].length - delta[dir] }];\n return [\n { direction: swappedDirection, length: segments[0].length / 2 },\n { direction: dir, length: -delta[dir] },\n { direction: swappedDirection, length: segments[0].length / 2 },\n ];\n } else {\n if (stump.direction === dir) {\n // just adjust the stump\n segments[stumschematicx] = { ...stump, length: stump.length - delta[dir] };\n return segments;\n } else {\n return [\n { direction: swappedDirection, length: segments[0].length },\n { direction: dir, length: -delta[dir] },\n ...segments.slice(1),\n ];\n }\n }\n\n const prev = segments[idxToAdjust];\n segments[idxToAdjust] = { ...prev, length: prev.length - delta[dir] };\n return segments;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { xy, box, location } from \"@synnaxlabs/x\";\nimport { type ReactFlowInstance } from \"reactflow\";\n\nexport const selectNode = (key: string): HTMLDivElement => {\n const el = document.querySelector(`[data-id=\"${key}\"]`);\n if (el == null) throw new Error(`[diagram] - cannot find node with key: ${key}`);\n return el as HTMLDivElement;\n};\n\nexport const selectNodeBox = (flow: ReactFlowInstance, key: string): box.Box => {\n const n = selectNode(key);\n const flowN = flow.getNodes().find((n) => n.id === key);\n if (flowN == null) throw new Error(`[diagram] - cannot find node with key: ${key}`);\n return box.construct(flowN.position, box.dims(box.construct(n)));\n};\n\nexport const selectNodeLayout = (key: string, flow: ReactFlowInstance): NodeLayout => {\n return NodeLayout.fromFlow(key, flow);\n};\n\nexport class HandleLayout {\n node_: NodeLayout | null = null;\n position: xy.XY;\n orientation: location.Outer;\n\n constructor(position: xy.XY, orientation: location.Outer) {\n this.position = position;\n this.orientation = orientation;\n }\n\n set node(node: NodeLayout) {\n this.node_ = node;\n }\n\n get node(): NodeLayout {\n if (this.node_ == null) throw new Error(`[schematic] - handle has no node`);\n return this.node_;\n }\n\n get absolutePosition(): xy.XY {\n return xy.translate(box.topLeft(this.node.box), this.position);\n }\n}\n\nexport class NodeLayout {\n key: string;\n box: box.Box;\n\n handles: HandleLayout[];\n\n constructor(key: string, box: box.Box, handles: HandleLayout[]) {\n this.key = key;\n this.box = box;\n this.handles = handles;\n handles.forEach((h) => (h.node = this));\n }\n\n static fromFlow(key: string, flow: ReactFlowInstance): NodeLayout {\n const nodeBox = selectNodeBox(flow, key);\n // grab all child elements with the class 'react-flow__handle'\n const nodeEl = selectNode(key);\n const handleEls = nodeEl.getElementsByClassName(\"react-flow__handle\");\n const nodeElBox = box.construct(nodeEl);\n const handles = Array.from(handleEls).map((el) => {\n const pos = box.center(box.construct(el));\n const dist = xy.translation(box.topLeft(nodeElBox), pos);\n const match = el.className.match(/react-flow__handle-(\\w+)/);\n if (match == null)\n throw new Error(`[schematic] - cannot find handle orientation`);\n const orientation = location.construct(match[0]) as location.Outer;\n return new HandleLayout(dist, orientation);\n });\n return new NodeLayout(key, nodeBox, handles);\n }\n}\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type DragEvent,\n Fragment,\n type ReactElement,\n useCallback,\n useRef,\n} from \"react\";\n\nimport { box, direction, location, xy } from \"@synnaxlabs/x\";\nimport {\n BaseEdge,\n type EdgeProps as RFEdgeProps,\n useReactFlow,\n type ConnectionLineComponentProps,\n type Position,\n} from \"reactflow\";\n\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { useCombinedStateAndRef, useDebouncedCallback } from \"@/hooks\";\nimport { useCursorDrag } from \"@/hooks/useCursorDrag\";\nimport { type Key } from \"@/triggers/triggers\";\nimport { connector } from \"@/vis/diagram/edge/connector\";\nimport { selectNodeBox } from \"@/vis/diagram/util\";\n\nimport \"@/vis/diagram/edge/Edge.css\";\n\ninterface CurrentlyDragging {\n segments: connector.Segment[];\n index: number;\n}\n\nexport interface EdgeProps extends RFEdgeProps {\n segments: connector.Segment[];\n onSegmentsChange: (segments: connector.Segment[]) => void;\n color?: Color.Crude;\n}\n\nexport const CustomConnectionLine = ({\n fromX,\n fromY,\n toX,\n toY,\n fromPosition,\n toPosition,\n fromNode,\n connectionLineStyle,\n connectionStatus,\n}: ConnectionLineComponentProps): ReactElement => {\n // select an element with 'react-flow__handle-connecting' class\n const connectedHandle = document.querySelector(\".react-flow__handle-connecting\");\n const toNodeHandle = connectedHandle?.className.match(/react-flow__handle-(\\w+)/);\n if (toNodeHandle != null) {\n const res = location.outer.safeParse(toNodeHandle[1]);\n if (res.success) toPosition = res.data as Position;\n }\n const conn = connector.buildNew({\n sourcePos: xy.construct(fromX, fromY),\n targetPos: xy.construct(toX, toY),\n sourceOrientation: fromPosition,\n targetOrientation: toPosition,\n sourceBox: selectNodeBox(useReactFlow(), fromNode?.id ?? \"\"),\n targetBox: selectNodeBox(useReactFlow(), fromNode?.id ?? \"\"),\n });\n const flow = useReactFlow();\n const points = connector.segmentsToPoints(\n xy.construct(fromX, fromY),\n conn,\n flow.getZoom(),\n false,\n );\n\n return (\n <BaseEdge\n path={calcPath(points)}\n style={{\n ...connectionLineStyle,\n stroke: Color.cssString(\n connectionStatus === \"invalid\"\n ? \"var(--pluto-error-z)\"\n : \"var(--pluto-gray-l9)\",\n ),\n strokeWidth: 2,\n fill: \"none\",\n }}\n />\n );\n};\n\nexport const Edge = ({\n id,\n source,\n target,\n sourcePosition: sourceOrientation,\n targetHandleId,\n targetPosition: targetOrientation,\n style,\n segments: propsSegments = [],\n onSegmentsChange,\n color = \"var(--pluto-gray-l9)\",\n selected = false,\n ...props\n}: EdgeProps): ReactElement => {\n const sourcePos = xy.construct(props.sourceX, props.sourceY);\n const sourcePosRef = useRef(sourcePos);\n const sourcePosEq = xy.equals(sourcePos, sourcePosRef.current);\n\n const targetPos = xy.construct(props.targetX, props.targetY);\n const targetPosRef = useRef(targetPos);\n const targetPosEq = xy.equals(targetPos, targetPosRef.current);\n\n const flow = useReactFlow();\n const [segments, setSegments, segRef] = useCombinedStateAndRef<connector.Segment[]>(\n () =>\n propsSegments.length > 0\n ? propsSegments\n : connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n }),\n );\n\n const targetOrientationRef = useRef(targetOrientation);\n const sourceOrientationRef = useRef(sourceOrientation);\n\n const debouncedOnSegmentsChange = useDebouncedCallback(onSegmentsChange, 100, [\n onSegmentsChange,\n ]);\n\n if (!sourcePosEq || !targetPosEq) {\n let next: connector.Segment[] = segments;\n const sourceDelta = xy.translation(sourcePosRef.current, sourcePos);\n const targetDelta = xy.translation(targetPos, targetPosRef.current);\n if (xy.equals(sourceDelta, xy.scale(targetDelta, -1), 0.001)) {\n sourcePosRef.current = sourcePos;\n targetPosRef.current = targetPos;\n } else {\n if (!sourcePosEq) {\n next = connector.moveSourceNode({ delta: sourceDelta, segments: next });\n if (sourceOrientationRef.current !== sourceOrientation) {\n sourceOrientationRef.current = sourceOrientation;\n next = connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n });\n }\n if (!connector.checkIntegrity({ sourcePos, targetPos, next, prev: segments })) {\n next = connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n });\n }\n sourcePosRef.current = sourcePos;\n } else if (!targetPosEq) {\n next = connector.moveTargetNode({ delta: targetDelta, segments: next });\n if (targetOrientationRef.current !== targetOrientation) {\n targetOrientationRef.current = targetOrientation;\n next = connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n });\n }\n if (!connector.checkIntegrity({ sourcePos, targetPos, next, prev: segments })) {\n next = connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n });\n }\n targetPosRef.current = targetPos;\n }\n debouncedOnSegmentsChange(next);\n setSegments(next);\n }\n }\n\n const dragRef = useRef<CurrentlyDragging | null>(null);\n\n const dragStart = useCursorDrag({\n onStart: useCallback((_: xy.XY, __: Key, e: DragEvent) => {\n dragRef.current = {\n index: Number(e.currentTarget.id.split(\"-\")[1]),\n segments: [...segRef.current],\n };\n }, []),\n onMove: useCallback((b: box.Box) => {\n if (dragRef.current == null) return;\n const next = connector.dragSegment({\n segments: dragRef.current.segments,\n index: dragRef.current.index,\n magnitude:\n box.dim(\n b,\n direction.swap(dragRef.current.segments[dragRef.current.index].direction),\n true,\n ) / flow.getZoom(),\n });\n setSegments(next);\n }, []),\n onEnd: useCallback(() => onSegmentsChange(segRef.current), [onSegmentsChange]),\n });\n\n const points = connector.segmentsToPoints(sourcePos, segments, flow.getZoom(), true);\n\n return (\n <>\n <BaseEdge\n path={calcPath(points)}\n style={{ ...style, stroke: Color.cssString(color) }}\n {...props}\n />\n {selected &&\n calcMidPoints(points).map((p, i) => {\n const dir = segments[i].direction;\n const swapped = direction.swap(dir);\n const dims = {\n [direction.dimension(dir)]: \"18px\",\n [direction.dimension(swapped)]: \"4px\",\n };\n const pos = {\n [dir]: p[dir] - 9,\n [swapped]: p[swapped] - 2,\n };\n return (\n <Fragment key={i}>\n <rect\n className={CSS.BE(\"diagram-edge-handle\", \"background\")}\n fill=\"var(--pluto-gray-l0)\"\n stroke=\"var(--pluto-primary-z)\"\n {...dims}\n {...pos}\n rx=\"2px\"\n ry=\"2px\"\n />\n <foreignObject x={p.x - 9} y={p.y - 9} width=\"18px\" height=\"18px\">\n <div\n id={`handle-${i}`}\n className={CSS(\n CSS.BE(\"diagram-edge-handle\", \"dragger\"),\n CSS.dir(dir),\n )}\n draggable\n onDragStart={dragStart}\n />\n </foreignObject>\n </Fragment>\n );\n })}\n </>\n );\n};\n\nexport const calcPath = (coords: xy.XY[]): string => {\n let path = \"\";\n const close = false;\n const radius = 6;\n const length = coords.length + (close ? 1 : -1);\n for (let i = 0; i < length; i++) {\n const a = coords[i % coords.length];\n const b = coords[(i + 1) % coords.length];\n const t = Math.min(radius / Math.hypot(b.x - a.x, b.y - a.y), 0.5);\n\n if (i > 0)\n path += `Q${a.x},${a.y} ${a.x * (1 - t) + b.x * t},${a.y * (1 - t) + b.y * t}`;\n\n if (!close && i === 0) path += `M${a.x},${a.y}`;\n else if (i === 0) path += `M${a.x * (1 - t) + b.x * t},${a.y * (1 - t) + b.y * t}`;\n\n if (!close && i === length - 1) path += `L${b.x},${b.y}`;\n else if (i < length - 1)\n path += `L${a.x * t + b.x * (1 - t)},${a.y * t + b.y * (1 - t)}`;\n }\n if (close) path += \"Z\";\n return path;\n};\n\nexport const calcMidPoints = (points: xy.XY[]): xy.XY[] => {\n return points.slice(1).map((p, i) => {\n const prev = points[i];\n return xy.construct((p.x + prev.x) / 2, (p.y + prev.y) / 2);\n });\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type ReactElement,\n createContext,\n useCallback,\n useMemo,\n useRef,\n useState,\n useContext as reactUseContext,\n type ComponentPropsWithoutRef,\n useEffect,\n memo,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { box, location, xy } from \"@synnaxlabs/x\";\nimport ReactFlow, {\n ReactFlowProvider,\n type Viewport as RFViewport,\n useOnViewportChange as useRFOnViewportChange,\n applyEdgeChanges as rfApplyEdgeChanges,\n applyNodeChanges as rfApplyNodeChanges,\n addEdge as rfAddEdge,\n Background as RFBackground,\n type Edge as RFEdge,\n type NodeProps as RFNodeProps,\n type NodeChange as RFNodeChange,\n type EdgeChange as RFEdgeChange,\n type Connection as RFConnection,\n type ReactFlowProps,\n useReactFlow,\n ConnectionMode,\n updateEdge,\n type EdgeProps as RFEdgeProps,\n SelectionMode,\n type FitViewOptions,\n type ProOptions,\n} from \"reactflow\";\n\nimport { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { useCombinedRefs } from \"@/hooks\";\nimport { useMemoCompare } from \"@/memo\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\nimport { Triggers } from \"@/triggers\";\nimport { type RenderProp } from \"@/util/renderProp\";\nimport { Viewport as CoreViewport } from \"@/viewport\";\nimport { Canvas } from \"@/vis/canvas\";\nimport { diagram } from \"@/vis/diagram/aether\";\nimport { Edge as EdgeComponent } from \"@/vis/diagram/edge\";\nimport { type connector } from \"@/vis/diagram/edge/connector\";\nimport { CustomConnectionLine } from \"@/vis/diagram/edge/Edge\";\nimport {\n type Edge,\n type Node,\n type Viewport,\n edgeConverter,\n nodeConverter,\n translateEdgesForward,\n translateNodesForward,\n translateViewportBackward,\n translateViewportForward,\n} from \"@/vis/diagram/types\";\n\nimport \"@/vis/diagram/Diagram.css\";\nimport \"reactflow/dist/style.css\";\n\nexport interface SymbolProps {\n symbolKey: string;\n position: xy.XY;\n selected: boolean;\n}\n\nexport interface UseProps {\n allowEdit?: boolean;\n initialEdges: Edge[];\n initialNodes: Node[];\n initialViewport?: Viewport;\n}\n\nexport const use = ({\n initialNodes,\n initialEdges,\n allowEdit = true,\n initialViewport = { position: xy.ZERO, zoom: 1 },\n}: UseProps): UseReturn => {\n const [editable, onEditableChange] = useState(allowEdit);\n const [nodes, onNodesChange] = useState<Node[]>(initialNodes);\n const [edges, onEdgesChange] = useState<Edge[]>(initialEdges);\n const [viewport, onViewportChange] = useState<Viewport>(initialViewport);\n const [fitViewOnResize, setFitViewOnResize] = useState(false);\n\n return {\n viewport,\n onViewportChange,\n edges,\n nodes,\n onNodesChange,\n onEdgesChange,\n editable,\n onEditableChange,\n fitViewOnResize,\n setFitViewOnResize,\n };\n};\n\nconst isValidConnection = (connection: RFConnection): boolean =>\n connection.source !== connection.target;\n\nexport interface UseReturn {\n edges: Edge[];\n nodes: Node[];\n onNodesChange: (nodes: Node[]) => void;\n onEdgesChange: (edges: Edge[]) => void;\n editable: boolean;\n onEditableChange: (v: boolean) => void;\n onViewportChange: (vp: Viewport) => void;\n viewport: Viewport;\n fitViewOnResize: boolean;\n setFitViewOnResize: (v: boolean) => void;\n}\n\nconst EDITABLE_PROPS: ReactFlowProps = {\n nodesDraggable: true,\n nodesConnectable: true,\n elementsSelectable: true,\n zoomOnDoubleClick: false,\n};\n\nconst NOT_EDITABLE_PROPS: ReactFlowProps = {\n connectionRadius: 0,\n nodesDraggable: false,\n nodesConnectable: false,\n elementsSelectable: false,\n panOnDrag: false,\n panOnScroll: false,\n zoomOnScroll: false,\n zoomOnDoubleClick: false,\n zoomOnPinch: false,\n edgesFocusable: false,\n edgesUpdatable: false,\n nodesFocusable: false,\n edgeUpdaterRadius: 0,\n};\n\nconst FIT_VIEW_OPTIONS: FitViewOptions = {\n padding: 0,\n maxZoom: 1,\n minZoom: 0.5,\n};\n\nconst PRO_OPTIONS: ProOptions = {\n hideAttribution: true,\n};\n\nexport interface DiagramProps\n extends UseReturn,\n Omit<ComponentPropsWithoutRef<\"div\">, \"onError\"> {\n triggers?: CoreViewport.UseTriggers;\n}\n\ninterface ContextValue {\n editable: boolean;\n onEditableChange: (v: boolean) => void;\n registerNodeRenderer: (renderer: RenderProp<SymbolProps>) => void;\n fitViewOnResize: boolean;\n setFitViewOnResize: (v: boolean) => void;\n}\n\nconst Context = createContext<ContextValue>({\n editable: true,\n onEditableChange: () => {},\n registerNodeRenderer: () => {},\n fitViewOnResize: false,\n setFitViewOnResize: () => {},\n});\n\nexport const useContext = (): ContextValue => reactUseContext(Context);\n\nexport interface NodeRendererProps {\n children: RenderProp<SymbolProps>;\n}\n\nexport const NodeRenderer = memo(\n ({ children }: NodeRendererProps): ReactElement | null => {\n const { registerNodeRenderer } = useContext();\n useEffect(() => registerNodeRenderer(children), [registerNodeRenderer, children]);\n return null;\n },\n);\nNodeRenderer.displayName = \"NodeRenderer\";\n\nconst DELETE_KEY_CODES: Triggers.Trigger = [\"Backspace\", \"Delete\"];\n\nconst Core = Aether.wrap<DiagramProps>(\n diagram.Diagram.TYPE,\n // eslint-disable-next-line react/display-name\n ({\n aetherKey,\n children,\n onNodesChange,\n onEdgesChange,\n nodes,\n edges,\n onEditableChange,\n editable,\n viewport,\n triggers: pTriggers,\n onViewportChange,\n fitViewOnResize,\n setFitViewOnResize,\n ...props\n }): ReactElement => {\n const [{ path }, , setState] = Aether.use({\n aetherKey,\n type: diagram.Diagram.TYPE,\n schema: diagram.diagramStateZ,\n initialState: {\n position: viewport.position,\n region: box.ZERO,\n zoom: viewport.zoom,\n },\n });\n\n const defaultEdgeColor = Theming.use().colors.gray.l9.hex;\n\n const triggers = useMemoCompare(\n () => pTriggers ?? CoreViewport.DEFAULT_TRIGGERS.zoom,\n Triggers.compareModeConfigs,\n [pTriggers],\n );\n\n const { fitView } = useReactFlow();\n const resizeRef = Canvas.useRegion(\n useCallback(\n (b) => {\n if (fitViewOnResize) fitView({ maxZoom: 1 });\n setState((prev) => ({ ...prev, region: b }));\n },\n [setState, fitView, fitViewOnResize],\n ),\n );\n\n // For some reason, react flow repeatedly calls onViewportChange with the same\n // parameters, so we do a need equality check to prevent unnecessary re-renders.\n const viewportRef = useRef<RFViewport | null>(null);\n const handleViewport = useCallback(\n (vp: RFViewport): void => {\n const prev = viewportRef.current;\n if (prev != null && prev.x === vp.x && prev.y === vp.y && prev.zoom === vp.zoom)\n return;\n viewportRef.current = vp;\n setState((prev) => ({ ...prev, position: vp, zoom: vp.zoom }));\n onViewportChange(translateViewportBackward(vp));\n },\n [setState, onViewportChange],\n );\n\n useRFOnViewportChange({\n onStart: handleViewport,\n onChange: handleViewport,\n onEnd: handleViewport,\n });\n\n const [renderer, setRenderer] = useState<RenderProp<SymbolProps>>(() => () => null);\n\n const registerNodeRenderer = useCallback(\n (renderer: RenderProp<SymbolProps>) => setRenderer(() => renderer),\n [],\n );\n\n const nodeTypes = useMemo(\n () => ({\n custom: ({ id, xPos, yPos, selected }: RFNodeProps) => {\n return renderer({\n symbolKey: id,\n position: { x: xPos, y: yPos },\n selected,\n });\n },\n }),\n [renderer],\n );\n\n const edgesRef = useRef(edges);\n const edges_ = useMemo(() => {\n edgesRef.current = edges;\n return translateEdgesForward(edges);\n }, [edges]);\n const nodesRef = useRef(nodes);\n const nodes_ = useMemo(() => {\n nodesRef.current = nodes;\n return translateNodesForward(nodes);\n }, [nodes]);\n\n const handleNodesChange = useCallback(\n (changes: RFNodeChange[]) =>\n onNodesChange(\n nodeConverter(nodesRef.current, (n) => rfApplyNodeChanges(changes, n)),\n ),\n [onNodesChange],\n );\n\n const handleEdgesChange = useCallback(\n (changes: RFEdgeChange[]) =>\n onEdgesChange(\n edgeConverter(\n edgesRef.current,\n (e) => rfApplyEdgeChanges(changes, e),\n defaultEdgeColor,\n ),\n ),\n [onEdgesChange, defaultEdgeColor],\n );\n\n const handleEdgeUpdate = useCallback(\n (oldEdge: RFEdge, newConnection: RFConnection) =>\n onEdgesChange(\n edgeConverter(\n edgesRef.current,\n (e) => updateEdge(oldEdge, newConnection, e),\n defaultEdgeColor,\n ),\n ),\n [],\n );\n\n const handleConnect = useCallback(\n (conn: RFConnection) => {\n onEdgesChange(\n edgeConverter(edgesRef.current, (e) => rfAddEdge(conn, e), defaultEdgeColor),\n );\n },\n [onEdgesChange, defaultEdgeColor],\n );\n\n const handleEdgeSegmentsChange = useCallback(\n (id: string, segments: connector.Segment[]) => {\n const next = [...edgesRef.current];\n const index = next.findIndex((e) => e.key === id);\n if (index === -1) return;\n next[index] = { ...next[index], segments };\n edgesRef.current = next;\n onEdgesChange(next);\n },\n [onEdgesChange],\n );\n\n const editableProps = editable ? EDITABLE_PROPS : NOT_EDITABLE_PROPS;\n\n const EDGE_TYPES = useMemo(\n () => ({\n default: (props: RFEdgeProps) => (\n <EdgeComponent\n key={props.id}\n {...props}\n segments={props.data.segments}\n color={props.data.color}\n onSegmentsChange={useCallback(\n (segment) => handleEdgeSegmentsChange(props.id, segment),\n [props.id],\n )}\n />\n ),\n }),\n [handleEdgeSegmentsChange],\n );\n\n const triggerRef = useRef<HTMLElement>(null);\n Triggers.use({\n triggers: triggers.zoomReset,\n callback: useCallback(\n ({ stage, cursor }: Triggers.UseEvent) => {\n const reg = triggerRef.current;\n if (reg == null || stage !== \"start\" || !box.contains(reg, cursor)) return;\n fitView();\n },\n [fitView],\n ),\n });\n\n const selectTriggers = Triggers.purgeMouse(triggers.select)[0] ?? null;\n const panTriggers = Triggers.purgeMouse(triggers.pan)[0] ?? null;\n const zoomTriggers = Triggers.purgeMouse(triggers.zoom)[0] ?? null;\n const triggerProps: Partial<ReactFlowProps> = {\n selectionOnDrag: selectTriggers == null,\n panOnDrag: panTriggers == null,\n selectionKeyCode: selectTriggers,\n panActivationKeyCode: panTriggers,\n zoomActivationKeyCode: zoomTriggers,\n };\n\n const combinedRefs = useCombinedRefs(triggerRef, resizeRef);\n\n const ctxValue = useMemo(\n () => ({\n editable,\n onEditableChange,\n registerNodeRenderer,\n fitViewOnResize,\n setFitViewOnResize,\n }),\n [editable, onEditableChange, registerNodeRenderer, fitViewOnResize],\n );\n\n return (\n <Context.Provider value={ctxValue}>\n <Aether.Composite path={path}>\n <ReactFlow\n {...triggerProps}\n className={CSS(CSS.B(\"diagram\"), CSS.editable(editable))}\n nodes={nodes_}\n edges={edges_}\n nodeTypes={nodeTypes}\n edgeTypes={EDGE_TYPES}\n ref={combinedRefs}\n fitView\n onNodesChange={handleNodesChange}\n onEdgesChange={handleEdgesChange}\n onConnect={handleConnect}\n onEdgeUpdate={handleEdgeUpdate}\n defaultViewport={translateViewportForward(viewport)}\n connectionLineComponent={CustomConnectionLine}\n elevateEdgesOnSelect\n minZoom={0.5}\n maxZoom={1.2}\n isValidConnection={isValidConnection}\n connectionMode={ConnectionMode.Loose}\n snapGrid={[3, 3]}\n fitViewOptions={FIT_VIEW_OPTIONS}\n selectionMode={SelectionMode.Partial}\n proOptions={PRO_OPTIONS}\n deleteKeyCode={DELETE_KEY_CODES}\n {...props}\n style={{\n [CSS.var(\"diagram-zoom\")]: viewport.zoom,\n ...props.style,\n }}\n {...editableProps}\n >\n {children}\n </ReactFlow>\n </Aether.Composite>\n </Context.Provider>\n );\n },\n);\n\nexport const Background = (): ReactElement | null => {\n const { editable } = useContext();\n return editable ? <RFBackground /> : null;\n};\n\nexport interface ControlsProps extends Align.PackProps {}\n\nexport const Controls = ({ children, ...props }: ControlsProps): ReactElement => (\n <Align.Pack direction=\"y\" className={CSS.BE(\"diagram\", \"controls\")} {...props}>\n {children}\n </Align.Pack>\n);\n\nexport type ToggleEditControlProps = Omit<\n Button.ToggleIconProps,\n \"value\" | \"onChange\" | \"children\"\n>;\n\nexport const ToggleEditControl = ({\n onClick,\n ...props\n}: ToggleEditControlProps): ReactElement => {\n const { editable, onEditableChange } = useContext();\n return (\n <Button.ToggleIcon\n onChange={() => onEditableChange(!editable)}\n value={editable}\n uncheckedVariant=\"outlined\"\n checkedVariant=\"filled\"\n tooltipLocation={location.RIGHT_CENTER}\n tooltip={\n editable ? (\n <Text.Text level=\"small\">Disable edit mode</Text.Text>\n ) : (\n <Text.Text level=\"small\">Enable edit mode</Text.Text>\n )\n }\n {...props}\n >\n {editable ? <Icon.EditOff /> : <Icon.Edit />}\n </Button.ToggleIcon>\n );\n};\n\nexport type FitViewControlProps = Omit<Button.IconProps, \"children\">;\n\nexport const FitViewControl = ({\n onClick,\n ...props\n}: FitViewControlProps): ReactElement => {\n const { fitView } = useReactFlow();\n const { fitViewOnResize, setFitViewOnResize } = useContext();\n return (\n <Button.ToggleIcon\n onClick={(e) => {\n fitView(FIT_VIEW_OPTIONS);\n onClick?.(e);\n }}\n // @ts-expect-error\n value={fitViewOnResize}\n // @ts-expect-error\n onChange={(v) => setFitViewOnResize(v)}\n rightClickToggle\n tooltip={<Text.Text level=\"small\">Fit view to contents</Text.Text>}\n tooltipLocation={location.RIGHT_CENTER}\n variant=\"outlined\"\n {...props}\n >\n <Icon.Expand />\n </Button.ToggleIcon>\n );\n};\n\nexport const Diagram = (props: DiagramProps): ReactElement => (\n <ReactFlowProvider>\n <Core {...props} />\n </ReactFlowProvider>\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { box, xy, type direction, location } from \"@synnaxlabs/x\";\n\nimport { type NodeLayout } from \"@/vis/diagram/util\";\n\nexport const alignNodes = (\n layouts: NodeLayout[],\n dir: direction.Direction = \"x\",\n): NodeLayout[] => {\n if (layouts.length === 0) return [];\n const loc = location.construct(dir);\n const oppositeLoc = location.swap(loc);\n // sort the layouts in order of their x position, lowest to highest\n layouts.sort((a, b) => box.loc(a.box, loc) - box.loc(b.box, loc));\n // grab the first node\n layouts.forEach((layout, i) => {\n if (i === 0) return;\n const prev = layouts[i - 1];\n const prevRightHandle = prev.handles.find((h) => h.orientation === oppositeLoc);\n const leftHandle = layout.handles.find((h) => h.orientation === loc);\n if (prevRightHandle == null || leftHandle == null) return;\n // We want to align the left handle of the current node with the right handle of the previous node\n const prevHandleAbsPos = prevRightHandle.absolutePosition;\n const leftHandleAbsPos = leftHandle.absolutePosition;\n const dist = xy.set(xy.translation(leftHandleAbsPos, prevHandleAbsPos), dir, 0);\n const newPos = xy.translate(box.topLeft(layout.box), dist);\n layout.box = box.construct(newPos, box.dims(layout.box));\n });\n return layouts;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useLayoutEffect } from \"react\";\n\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { text } from \"@/text/core\";\nimport { Value } from \"@/vis/value/aether/value\";\n\nexport const corePropsZ = Value.z\n .omit({ font: true })\n .partial({ color: true })\n .extend({ level: text.levelZ.optional() });\n\nexport interface UseProps extends z.input<typeof corePropsZ> {\n aetherKey: string;\n}\n\nexport interface UseReturn {\n width: number;\n}\n\nexport const use = ({\n aetherKey,\n box,\n telem,\n color,\n precision,\n minWidth,\n level = \"small\",\n}: UseProps): UseReturn => {\n const memoProps = useMemoDeepEqualProps({\n box,\n telem,\n color,\n precision,\n level,\n minWidth,\n });\n\n const [, state, setState] = Aether.use({\n aetherKey,\n type: Value.TYPE,\n schema: Value.z,\n initialState: memoProps,\n });\n\n useLayoutEffect(() => setState((prev) => ({ ...prev, ...memoProps })), [memoProps]);\n return { width: state.width ?? state.minWidth };\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n createContext,\n type PropsWithChildren,\n useEffect,\n useContext as reactUseContext,\n} from \"react\";\n\nimport { type channel } from \"@synnaxlabs/client\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { control } from \"@/telem/control/aether\";\n\nexport interface ControllerProps\n extends Omit<z.input<typeof control.controllerStateZ>, \"needsControlOf\">,\n PropsWithChildren {\n onStatusChange?: (status: control.Status) => void;\n name: string;\n}\n\nexport interface ContextValue {\n needsControlOf: channel.Keys;\n}\n\nconst Context = createContext<ContextValue>({ needsControlOf: [] });\n\nexport const useContext = (): ContextValue => reactUseContext(Context);\n\nexport const Controller = Aether.wrap<ControllerProps>(\n control.Controller.TYPE,\n ({ aetherKey, children, onStatusChange, ...props }) => {\n const memoProps = useMemoDeepEqualProps(props);\n const [{ path }, { status, needsControlOf }, setState] = Aether.use({\n aetherKey,\n type: control.Controller.TYPE,\n schema: control.controllerStateZ,\n initialState: memoProps,\n });\n useEffect(() => {\n if (status != null) onStatusChange?.(status);\n }, [status, onStatusChange]);\n useEffect(() => {\n setState((state) => ({ ...state, ...memoProps }));\n }, [memoProps, setState]);\n useEffect(() => {\n return () => onStatusChange?.(\"released\");\n }, []);\n\n return (\n <Context.Provider value={{ needsControlOf }}>\n <Aether.Composite path={path}>{children}</Aether.Composite>;\n </Context.Provider>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type PropsWithChildren } from \"react\";\n\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { control } from \"@/telem/control/aether\";\n\nexport interface StateProviderProps\n extends z.input<typeof control.stateProviderStateZ>,\n PropsWithChildren {}\n\nexport const StateProvider = Aether.wrap<StateProviderProps>(\n control.StateProvider.TYPE,\n ({ aetherKey, children }) => {\n const [{ path }] = Aether.use({\n aetherKey,\n type: control.StateProvider.TYPE,\n schema: control.stateProviderStateZ,\n initialState: {},\n });\n return <Aether.Composite path={path}>{children}</Aether.Composite>;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useEffect, type PropsWithChildren } from \"react\";\n\nimport { TimeStamp } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { control } from \"@/telem/control/aether\";\nimport { Text } from \"@/text\";\nimport { Tooltip } from \"@/tooltip\";\n\nimport \"@/telem/control/Indicator.css\";\n\nexport interface IndicatorProps\n extends Omit<z.input<typeof control.indicatorStateZ>, \"status\" | \"color\">,\n PropsWithChildren {}\n\nexport const Indicator = Aether.wrap<IndicatorProps>(\n control.Indicator.TYPE,\n ({ aetherKey, colorSource, statusSource }): ReactElement => {\n const memoProps = useMemoDeepEqualProps({ colorSource, statusSource });\n\n const [, { color, status }, setState] = Aether.use({\n aetherKey,\n type: control.Indicator.TYPE,\n initialState: {\n ...memoProps,\n status: {\n key: \"no_chip\",\n variant: \"warning\",\n message: \"No chip connected.\",\n time: TimeStamp.now(),\n },\n },\n schema: control.indicatorStateZ,\n });\n\n useEffect(() => {\n setState((p) => ({ ...p, ...memoProps }));\n }, [memoProps, setState]);\n\n let parsedColor: Color.Crude;\n if (status.data?.color != null)\n parsedColor = Color.Color.z.parse(status.data.color);\n else if (color != null && !color.isZero) parsedColor = color;\n else parsedColor = \"var(--pluto-gray-l8)\";\n\n return (\n <Tooltip.Dialog location={{ x: \"center\", y: \"bottom\" }}>\n <Text.Text level=\"p\">{status.message}</Text.Text>\n <div\n className={CSS.B(\"indicator\")}\n style={{\n backgroundColor: Color.cssString(parsedColor),\n flexGrow: 1,\n }}\n />\n </Tooltip.Dialog>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type CSSProperties, type ReactElement, useCallback, useEffect } from \"react\";\n\nimport { control as clientControl } from \"@synnaxlabs/client\";\nimport { Icon } from \"@synnaxlabs/media\";\nimport { TimeStamp } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { type Status } from \"@/status\";\nimport { control } from \"@/telem/control/aether\";\nimport { Text } from \"@/text\";\n\nexport interface ChipProps\n extends Pick<z.input<typeof control.chipStateZ>, \"source\" | \"sink\">,\n Omit<Button.IconProps, \"onClick\" | \"children\"> {}\n\ninterface ChipStyle {\n message: string;\n chipColor: string;\n buttonStyle?: CSSProperties;\n disabled?: boolean;\n}\n\nconst tooltipMessage = (status: Status.Spec): ChipStyle => {\n switch (status.variant) {\n case \"disabled\":\n if (status.data?.valid === true)\n return {\n message: \"Uncontrolled. Click to take control.\",\n chipColor: \"var(--pluto-gray-l10)\",\n };\n return {\n message: \"No channel connected\",\n chipColor: \"var(--pluto-gray-l5)\",\n disabled: true,\n };\n\n case \"error\":\n return {\n message: \"Not controlled by you. Click to take absolute control.\",\n chipColor: \"var(--pluto-error-z)\",\n };\n case \"success\":\n if (status.data?.authority === clientControl.Authority.Absolute.valueOf())\n return {\n message: \"You have absolute control. Click to release.\",\n chipColor: \"var(--pluto-secondary-z)\",\n buttonStyle: {\n background: \"var(--pluto-secondary-z-30)\",\n },\n };\n return {\n message: \"You're in control. Release P&ID to release control.\",\n chipColor: \"var(--pluto-primary-z)\",\n };\n default:\n return {\n message: \"Unexpected status.\",\n chipColor: \"var(--pluto-error-z)\",\n };\n }\n};\n\nexport const Chip = Aether.wrap<ChipProps>(\n \"Chip\",\n ({ aetherKey, source, sink, className, ...props }): ReactElement => {\n const memoProps = useMemoDeepEqualProps({ source, sink });\n const [, { status }, setState] = Aether.use({\n aetherKey,\n type: control.Chip.TYPE,\n schema: control.chipStateZ,\n initialState: {\n triggered: false,\n ...memoProps,\n status: {\n key: \"no_chip\",\n variant: \"disabled\",\n message: \"No chip connected.\",\n time: TimeStamp.now(),\n },\n },\n });\n\n useEffect(() => {\n setState((state) => ({ ...state, ...memoProps }));\n }, [memoProps, setState]);\n\n const handleToggle = useCallback(\n () =>\n setState((state) => ({\n ...state,\n triggered: !state.triggered,\n })),\n [setState],\n );\n\n const { message, chipColor, buttonStyle, disabled } = tooltipMessage(status);\n\n return (\n <Button.Icon\n variant=\"text\"\n className={CSS(CSS.B(\"control-chip\"), className)}\n disabled={disabled}\n onClick={handleToggle}\n tooltip={<Text.Text level=\"small\">{message}</Text.Text>}\n style={buttonStyle}\n {...props}\n >\n <Icon.Circle color={chipColor} />\n </Button.Icon>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useEffect } from \"react\";\n\nimport { UnexpectedError } from \"@synnaxlabs/client\";\nimport { unique } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { control } from \"@/telem/control/aether\";\nimport { useContext } from \"@/telem/control/Controller\";\nimport { Legend as Core } from \"@/vis/legend\";\n\nexport interface LegendProps extends Core.SimpleProps {}\n\nexport const Legend = Aether.wrap<LegendProps>(\n control.Legend.TYPE,\n ({ aetherKey, ...props }): ReactElement => {\n const { needsControlOf } = useContext();\n const [, { states }, setState] = Aether.use({\n aetherKey,\n type: control.Legend.TYPE,\n schema: control.legendStateZ,\n initialState: {\n states: [],\n needsControlOf,\n },\n });\n\n useEffect(() => {\n setState((state) => ({ ...state, needsControlOf }));\n }, [needsControlOf]);\n\n // Filter out the unique subjects\n const subjects = unique(states.map((s) => s.subject.key));\n const data = subjects.map((s) => {\n const d = states.find((s2) => s2.subject.key === s);\n if (d == null) {\n throw new UnexpectedError(\"Legend subject not found\");\n }\n return { key: d.subject.key, label: d.subject.name, color: d.subjectColor };\n });\n\n return <Core.Simple data={data} {...props} />;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, useEffect } from \"react\";\n\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { button } from \"@/vis/button/aether\";\n\nexport interface UseProps extends Omit<z.input<typeof button.buttonStateZ>, \"trigger\"> {\n aetherKey: string;\n}\n\nexport interface UseReturn {\n click: () => void;\n}\n\nexport const use = ({ aetherKey, sink }: UseProps): UseReturn => {\n const memoProps = useMemoDeepEqualProps({ sink });\n const [, , setState] = Aether.use({\n aetherKey,\n type: button.Button.TYPE,\n schema: button.buttonStateZ,\n initialState: {\n trigger: 0,\n sink,\n },\n });\n\n useEffect(() => {\n setState((p) => ({ ...p, ...memoProps }));\n }, [memoProps]);\n\n const click = useCallback(() => {\n setState((p) => ({ ...p, trigger: p.trigger + 1 }));\n }, [setState]);\n\n return { click };\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, forwardRef } from \"react\";\n\nimport { type location } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { Text } from \"@/text\";\n\nexport interface LabelExtensionProps {\n label?: string;\n level?: Text.Level;\n orientation?: location.Outer;\n}\n\nexport interface LabeledProps\n extends Omit<Align.SpaceProps, \"value\" | \"onChange\" | \"direction\">,\n LabelExtensionProps {\n onChange: ({ label }: { label: LabelExtensionProps }) => void;\n}\n\nexport const Labeled = forwardRef<HTMLDivElement, LabeledProps>(\n (\n {\n label: value = \"\",\n onChange,\n level = \"p\",\n children,\n orientation = \"top\",\n style,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <Align.Space\n style={{\n // You may be wondering, why do we do this here? Well it's because react flow\n // uses a ResizeObserver to determine when to re-render edges. When we switch\n // from 'left' to 'right' or 'top' to 'bottom', the width and height of the\n // node remains the same, so the ResizeObserver doesn't fire. We need to redraw\n // the edges, so we add a margin to trigger it.\n marginRight: orientation === \"right\" ? 1 : 0,\n marginTop: orientation === \"top\" ? 1 : 0,\n ...style,\n }}\n size={2 / 3}\n direction={orientation}\n ref={ref}\n className={CSS(CSS.B(\"symbol\"), className)}\n align=\"center\"\n justify=\"center\"\n {...props}\n >\n {value.length > 0 && (\n <Text.Editable\n className={CSS.BE(\"symbol\", \"label\")}\n value={value}\n onChange={useCallback(\n (label) =>\n onChange({\n label: { label, level, orientation },\n }),\n [onChange, level],\n )}\n level={level}\n />\n )}\n {children}\n </Align.Space>\n );\n },\n);\nLabeled.displayName = \"Labeled\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n useEffect,\n type ComponentPropsWithoutRef,\n type ReactElement,\n useRef,\n type PropsWithChildren,\n type MouseEventHandler,\n} from \"react\";\n\nimport { dimensions, type location, direction, xy } from \"@synnaxlabs/x\";\nimport {\n type HandleProps as RFHandleProps,\n Handle as RFHandle,\n Position as RFPosition,\n useUpdateNodeInternals,\n} from \"reactflow\";\n\nimport { Button as CoreButton } from \"@/button\";\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Input } from \"@/input\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\n\nimport \"@/vis/schematic/primitives/Primitives.css\";\n\ninterface PathProps extends ComponentPropsWithoutRef<\"path\"> {}\n\nconst Path = (props: PathProps): ReactElement => (\n <path vectorEffect=\"non-scaling-stroke\" {...props} />\n);\n\ninterface RectProps extends ComponentPropsWithoutRef<\"rect\"> {}\n\nconst Rect = (props: RectProps): ReactElement => (\n <rect vectorEffect=\"non-scaling-stroke\" {...props} />\n);\n\ninterface CircleProps extends ComponentPropsWithoutRef<\"circle\"> {}\n\nconst Circle = (props: CircleProps): ReactElement => (\n <circle vectorEffect=\"non-scaling-stroke\" {...props} />\n);\n\ninterface LineProps extends ComponentPropsWithoutRef<\"line\"> {}\n\nconst Line = (props: LineProps): ReactElement => (\n <line vectorEffect=\"non-scaling-stroke\" {...props} />\n);\n\nexport interface OrientableProps {\n orientation?: location.Outer;\n}\n\nexport interface SVGBasedPrimitiveProps extends OrientableProps {\n color?: Color.Crude;\n scale?: number;\n}\n\nexport interface DivProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"color\" | \"onResize\">,\n OrientableProps {}\n\ninterface ToggleProps\n extends Omit<ComponentPropsWithoutRef<\"button\">, \"color\" | \"value\"> {\n triggered?: boolean;\n enabled?: boolean;\n color?: Color.Crude;\n}\n\ninterface HandleProps extends Omit<RFHandleProps, \"type\" | \"position\"> {\n orientation: location.Outer;\n location: location.Outer;\n left: number;\n top: number;\n id: string;\n}\n\nconst ORIENTATION_RF_POSITIONS: Record<\n location.Outer,\n Record<location.Outer, RFPosition>\n> = {\n left: {\n left: RFPosition.Left,\n right: RFPosition.Right,\n top: RFPosition.Top,\n bottom: RFPosition.Bottom,\n },\n right: {\n left: RFPosition.Right,\n right: RFPosition.Left,\n top: RFPosition.Bottom,\n bottom: RFPosition.Top,\n },\n top: {\n left: RFPosition.Bottom,\n right: RFPosition.Top,\n top: RFPosition.Left,\n bottom: RFPosition.Right,\n },\n bottom: {\n left: RFPosition.Top,\n right: RFPosition.Bottom,\n top: RFPosition.Right,\n bottom: RFPosition.Left,\n },\n};\n\nconst smartPosition = (\n position: location.Outer,\n orientation: location.Outer,\n): RFPosition => ORIENTATION_RF_POSITIONS[orientation][position];\n\nconst adjustHandle = (\n top: number,\n left: number,\n orientation: location.Outer,\n): { left: number; top: number } => {\n if (orientation === \"left\") return { top, left };\n if (orientation === \"right\") return { top: 100 - top, left: 100 - left };\n if (orientation === \"top\") return { top: 100 - left, left: top };\n return { top: left, left: 100 - top };\n};\n\nexport interface SmartHandlesProps extends PropsWithChildren<{}>, OrientableProps {}\n\nconst HandleBoundary = ({ children, orientation }: SmartHandlesProps): ReactElement => {\n let updateInternals: ReturnType<typeof useUpdateNodeInternals> | undefined;\n try {\n updateInternals = useUpdateNodeInternals();\n } catch (e) {\n return <></>;\n }\n const ref = useRef<HTMLDivElement & HTMLButtonElement>(null);\n const first = useRef<boolean>(true);\n useEffect(() => {\n if (ref.current == null) return;\n if (first.current) {\n first.current = false;\n return;\n }\n const node = ref.current.closest(\".react-flow__node\");\n const id = node?.getAttribute(\"data-id\");\n if (id == null) return;\n updateInternals?.(id);\n }, [orientation]);\n return (\n <>\n <span ref={ref} />\n {children}\n </>\n );\n};\n\nconst Handle = ({\n location,\n orientation,\n left,\n top,\n ...props\n}: HandleProps): ReactElement => {\n const adjusted = adjustHandle(top, left, orientation);\n return (\n <RFHandle\n position={smartPosition(location, orientation)}\n {...props}\n type=\"source\"\n onClick={(e) => e.stopPropagation()}\n className={(CSS.B(\"handle\"), CSS.BE(\"handle\", props.id))}\n style={{\n left: `${adjusted.left}%`,\n top: `${adjusted.top}%`,\n }}\n />\n );\n};\n\ninterface ToggleValveButtonProps extends ToggleProps {\n orientation?: location.Outer;\n}\n\nconst Toggle = ({\n className,\n enabled = false,\n triggered = false,\n color,\n orientation = \"left\",\n ...props\n}: ToggleValveButtonProps): ReactElement => (\n <button\n className={CSS(\n CSS.B(\"symbol-primitive\"),\n CSS.B(\"symbol-primitive-toggle\"),\n orientation != null && CSS.loc(orientation),\n enabled && CSS.M(\"enabled\"),\n triggered && CSS.M(\"triggered\"),\n className,\n )}\n {...props}\n />\n);\n\nconst Div = ({ className, orientation = \"left\", ...props }: DivProps): ReactElement => (\n <div className={CSS(CSS.B(\"symbol-primitive\"), className)} {...props} />\n);\n\nexport interface InternalSVGProps\n extends SVGBasedPrimitiveProps,\n Omit<ComponentPropsWithoutRef<\"svg\">, \"direction\" | \"color\" | \"orientation\"> {\n dimensions: dimensions.Dimensions;\n color?: Color.Crude;\n scale?: number;\n}\n\nconst BASE_SCALE = 0.8;\n\nconst InternalSVG = ({\n dimensions: dims,\n orientation = \"left\",\n children,\n className,\n color,\n style = {},\n scale = 1,\n ...props\n}: InternalSVGProps): ReactElement => {\n const dir = direction.construct(orientation);\n dims = dir === \"y\" ? dimensions.swap(dims) : dims;\n const colorStr = Color.cssString(color);\n // @ts-expect-error - css variables\n if (color != null) style[CSS.var(\"symbol-color\")] = new Color.Color(color).rgbString;\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={dimensions.svgViewBox(dims)}\n className={CSS(CSS.loc(orientation), className)}\n fill={colorStr}\n stroke={colorStr}\n {...props}\n style={{\n aspectRatio: `${dims.width} / ${dims.height}`,\n width: dimensions.scale(dims, scale * BASE_SCALE).width,\n ...style,\n }}\n >\n <g>{children}</g>\n </svg>\n );\n};\n\nexport interface FourWayValveProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const FourWayValve = ({\n className,\n orientation,\n scale,\n color,\n ...props\n}: FourWayValveProps): ReactElement => (\n <Toggle\n {...props}\n orientation={orientation}\n className={CSS(CSS.B(\"four-way-valve\"), className)}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation=\"left\" left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation=\"left\" left={100} top={50} id=\"2\" />\n <Handle location=\"top\" orientation=\"left\" left={50} top={0} id=\"3\" />\n <Handle location=\"bottom\" orientation=\"left\" left={50} top={100} id=\"4\" />\n </HandleBoundary>\n <InternalSVG dimensions={{ width: 87, height: 87 }} color={color} scale={scale}>\n <Path d=\"M43.5 43.5L6.35453 24.7035C4.35901 23.6937 2 25.1438 2 27.3803V59.6197C2 61.8562 4.35901 63.3063 6.35453 62.2965L43.5 43.5ZM43.5 43.5L80.6455 24.7035C82.641 23.6937 85 25.1438 85 27.3803V59.6197C85 61.8562 82.641 63.3063 80.6455 62.2965L43.5 43.5Z\" />\n <Path d=\"M43.5 43.5L24.7035 80.6455C23.6937 82.641 25.1438 85 27.3803 85H59.6197C61.8562 85 63.3063 82.641 62.2965 80.6455L43.5 43.5ZM43.5 43.5L24.7035 6.35453C23.6937 4.35901 25.1438 2 27.3803 2H59.6197C61.8562 2 63.3063 4.35901 62.2965 6.35453L43.5 43.5Z\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface ThreeWayValveProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const ThreeWayValve = ({\n color,\n orientation = \"left\",\n scale,\n ...props\n}: ThreeWayValveProps): ReactElement => (\n <Toggle\n {...props}\n className={CSS(CSS.B(\"three-way-valve\"))}\n orientation={orientation}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"bottom\" orientation={orientation} left={50} top={100} id=\"1\" />\n <Handle location=\"left\" orientation={orientation} left={0} top={33} id=\"2\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={33} id=\"3\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 64 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M43.5 21L6.35453 2.20349C4.35901 1.19372 2 2.64384 2 4.88029V37.1197C2 39.3562 4.35901 40.8063 6.35453 39.7965L43.5 21ZM43.5 21L80.6455 2.20349C82.641 1.19372 85 2.64384 85 4.8803V37.1197C85 39.3562 82.641 40.8063 80.6455 39.7965L43.5 21Z\" />\n <Path d=\"M44.3923 22.3611C44.0222 21.6298 42.9778 21.6298 42.6077 22.3611L24.7035 57.7433C23.6937 59.7388 25.1438 62.0978 27.3803 62.0978L59.6197 62.0978C61.8562 62.0978 63.3063 59.7388 62.2965 57.7433L44.3923 22.3611Z\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface ValveProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const Valve = ({\n orientation = \"left\",\n color,\n scale,\n ...props\n}: ValveProps): ReactElement => (\n <Toggle {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 42 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M43.5 21L6.35453 2.20349C4.35901 1.19372 2 2.64384 2 4.88029V37.1197C2 39.3562 4.35901 40.8063 6.35453 39.7965L43.5 21ZM43.5 21L80.6455 2.20349C82.641 1.19372 85 2.64384 85 4.8803V37.1197C85 39.3562 82.641 40.8063 80.6455 39.7965L43.5 21Z\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface SolenoidValveProps extends ToggleProps, SVGBasedPrimitiveProps {\n normallyOpen?: boolean;\n}\n\nexport const SolenoidValve = ({\n className,\n color,\n orientation = \"left\",\n normallyOpen = false,\n scale,\n ...props\n}: SolenoidValveProps): ReactElement => (\n <Toggle\n className={CSS(\n CSS.B(\"solenoid-valve\"),\n normallyOpen && CSS.M(\"normally-open\"),\n className,\n )}\n {...props}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={69} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={69} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 69 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path\n className={CSS.B(\"body\")}\n d=\"M43.5 48L6.35453 29.2035C4.35901 28.1937 2 29.6438 2 31.8803V64.1197C2 66.3562 4.35901 67.8063 6.35453 66.7965L43.5 48ZM43.5 48L80.6455 29.2035C82.641 28.1937 85 29.6438 85 31.8803V64.1197C85 66.3562 82.641 67.8063 80.6455 66.7965L43.5 48Z\"\n />\n <Path d=\"M43.5 47L43.5 24.6177\" />\n <Rect x=\"29\" y=\"2\" width=\"29\" height=\"22.5333\" rx=\"1\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface ReliefValveProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const ReliefValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: ReliefValveProps): ReactElement => (\n <Div\n orientation={orientation}\n className={CSS(CSS.B(\"relief-valve\"), className)}\n {...props}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={66} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={66} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 58 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M43.5 37L6.35453 18.2035C4.35901 17.1937 2 18.6438 2 20.8803V53.1197C2 55.3562 4.35901 56.8063 6.35453 55.7965L43.5 37ZM43.5 37L80.6455 18.2035C82.641 17.1937 85 18.6438 85 20.8803V53.1197C85 55.3562 82.641 56.8063 80.6455 55.7965L43.5 37Z\" />\n <Path d=\"M43.5 2L43.5 38\" strokeLinecap=\"round\" />\n <Path d=\"M31.8011 14.0802L55.1773 4.29611\" strokeLinecap=\"round\" />\n <Path d=\"M31.8011 20.0802L55.1773 10.2961\" strokeLinecap=\"round\" />\n <Path d=\"M31.8011 26.0802L55.1773 16.2961\" strokeLinecap=\"round\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface CheckValveProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const CheckValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: CheckValveProps): ReactElement => (\n <Div\n orientation={orientation}\n className={CSS(CSS.B(\"check-valve\"), className)}\n {...props}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 45, height: 43 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M43 2L43 40\" strokeLinecap=\"round\" />\n <Path d=\"M41.6607 21.8946C42.3917 21.5238 42.3906 20.4794 41.6589 20.1101L6.25889 2.2412C4.26237 1.23341 1.90481 2.68589 1.90704 4.92235L1.93925 37.1617C1.94148 39.3982 4.30194 40.846 6.29644 39.8342L41.6607 21.8946Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface AngledValveProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const AngledValve = ({\n color,\n className,\n orientation = \"left\",\n scale,\n ...props\n}: AngledValveProps): ReactElement => (\n <Toggle\n {...props}\n orientation={orientation}\n className={CSS(CSS.B(\"angled-valve\"), className)}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"bottom\" orientation={orientation} left={33} top={100} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={35} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 64, height: 64 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M22.3611 20.1077C21.6298 20.4778 21.6298 21.5222 22.3611 21.8923L57.7433 39.7965C59.7388 40.8063 62.0978 39.3562 62.0978 37.1197L62.0978 4.88029C62.0978 2.64384 59.7388 1.19372 57.7433 2.2035L22.3611 20.1077Z\" />\n <Path d=\"M21.8923 22.3611C21.5222 21.6298 20.4778 21.6298 20.1077 22.3611L2.20349 57.7433C1.19372 59.7388 2.64384 62.0978 4.8803 62.0978L37.1197 62.0978C39.3562 62.0978 40.8063 59.7388 39.7965 57.7433L21.8923 22.3611Z\" />\n <Path d=\"M24.3461 18.5709L21.7484 19.88C20.9998 20.2572 20.3887 20.8601 20.0012 21.6035L19.3383 22.8756\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport const Tag = (): ReactElement => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 66 25\">\n <Path d=\"M57.0945 1.83334H4.04767C2.39087 1.83334 1.45252 3.73241 2.45908 5.0484L7.42509 11.5411C7.96869 12.2518 7.97408 13.2371 7.43828 13.9538L2.94078 19.9691C1.95471 21.2879 2.89585 23.1667 4.54256 23.1667H57.2344C57.9298 23.1667 58.5752 22.8055 58.939 22.2128L64.2505 13.5584C64.6483 12.9102 64.644 12.0925 64.2395 11.4484L58.7881 2.76955C58.4222 2.18696 57.7825 1.83334 57.0945 1.83334Z\" />\n </svg>\n);\n\nexport interface ReduceFittingProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const ReduceFitting = ({\n className,\n orientation,\n color,\n scale,\n ...props\n}: ReduceFittingProps): ReactElement => (\n <Div\n orientation={orientation}\n className={CSS(CSS.B(\"reduce-fitting\"), className)}\n {...props}\n >\n <InternalSVG\n dimensions={{ width: 42, height: 43 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M38.862 31.1414L4.86205 41.3414C2.93721 41.9189 1 40.4775 1 38.4679V21.8707V4.53209C1 2.5225 2.93721 1.08116 4.86204 1.65861L38.862 11.8586C40.131 12.2393 41 13.4073 41 14.7321V21.5V28.2679C41 29.5927 40.131 30.7607 38.862 31.1414Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface PumpProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const Pump = ({\n color,\n className,\n orientation = \"left\",\n scale,\n ...props\n}: PumpProps): ReactElement => (\n <Toggle\n {...props}\n className={CSS(CSS.B(\"pump\"), className)}\n orientation={orientation}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={39} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={95} top={3} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 68, height: 61 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Circle cx=\"35\" cy=\"25\" r=\"23\" />\n <Path d=\"M50 41.5L56.7186 50.8314C57.6711 52.1544 56.7257 54 55.0955 54H14.9045C13.2743 54 12.3289 52.1544 13.2814 50.8314L20 41.5\" />\n <Line x1=\"35\" y1=\"2\" x2=\"65.0167\" y2=\"2\" />\n <Line x1=\"1\" y1=\"24\" x2=\"35\" y2=\"24\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface BurstDiscProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const BurstDisc = ({\n className,\n color,\n orientation = \"left\",\n scale,\n ...props\n}: BurstDiscProps): ReactElement => {\n const colorStr = Color.cssString(color);\n return (\n <Div {...props} className={CSS(CSS.B(\"symbol\"), className)}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={2} top={50} id=\"1\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 40, height: 48 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M24 24C24 35.1852 15.2546 44.4725 3.87626 45.8297C2.90571 45.9455 2 45.1407 2 44V4C2 2.85926 2.90571 2.0545 3.87626 2.17027C15.2546 3.52755 24 12.8148 24 24Z\" />\n <Path\n d=\"M37.9706 23.2076C38.4906 23.6079 38.4906 24.3921 37.9706 24.7924L33.86 27.9568C33.2024 28.463 32.25 27.9942 32.25 27.1644V20.8356C32.25 20.0058 33.2024 19.537 33.86 20.0432L37.9706 23.2076Z\"\n fill={colorStr}\n />\n <Path d=\"M33 24H3\" strokeLinecap=\"round\" />\n </InternalSVG>\n </Div>\n );\n};\n\nexport interface CapProps extends SVGBasedPrimitiveProps, DivProps {}\n\nexport const Cap = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: CapProps): ReactElement => (\n <Div className={CSS(CSS.B(\"cap\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n </HandleBoundary>\n <InternalSVG\n color={color}\n dimensions={{ width: 26, height: 48 }}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M24 24C24 35.1852 15.2546 44.4725 3.87626 45.8297C2.90571 45.9455 2 45.1407 2 44V4C2 2.85926 2.90571 2.0545 3.87626 2.17027C15.2546 3.52755 24 12.8148 24 24Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface ManualValveProps extends SVGBasedPrimitiveProps, DivProps {}\n\nexport const ManualValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: ManualValveProps): ReactElement => (\n <Div className={CSS(CSS.B(\"manual-valve\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={58} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={58} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 48 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Line x1=\"43.5\" y1=\"27\" x2=\"43.5\" y2=\"1\" />\n <Path d=\"M19.64 2L66.68 2\" strokeLinecap=\"round\" />\n <Path d=\"M43.5 27L6.35453 8.20349C4.35901 7.19372 2 8.64384 2 10.8803V43.1197C2 45.3562 4.35901 46.8063 6.35453 45.7965L43.5 27ZM43.5 27L80.6455 8.20349C82.641 7.19372 85 8.64384 85 10.8803V43.1197C85 45.3562 82.641 46.8063 80.6455 45.7965L43.5 27Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface FilterProps extends SVGBasedPrimitiveProps, DivProps {}\n\nexport const Filter = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: FilterProps): ReactElement => (\n <Div className={CSS(CSS.B(\"filter\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={2} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={98} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 52, height: 34 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path d=\"M6 17L24.8 2.9C25.5111 2.36667 26.4889 2.36667 27.2 2.9L46 17M6 17L24.8 31.1C25.5111 31.6333 26.4889 31.6333 27.2 31.1L46 17M6 17H1M46 17H51\" />\n </InternalSVG>\n </Div>\n);\n\ntype DetailedBorderRadius = Record<location.CornerXYString, xy.XY>;\ntype BorderRadius =\n | number\n | Record<direction.Direction, number>\n | Record<location.CornerXYString, number>\n | DetailedBorderRadius;\n\nconst parseBorderRadius = (radius: BorderRadius): DetailedBorderRadius => {\n if (typeof radius === \"number\")\n return {\n topLeft: xy.construct(radius),\n topRight: xy.construct(radius),\n bottomLeft: xy.construct(radius),\n bottomRight: xy.construct(radius),\n };\n if (\"x\" in radius)\n return {\n topLeft: radius,\n topRight: radius,\n bottomLeft: radius,\n bottomRight: radius,\n };\n if (typeof radius.bottomLeft === \"number\")\n return {\n topLeft: xy.construct(radius.topLeft),\n topRight: xy.construct(radius.topRight),\n bottomLeft: xy.construct(radius.bottomLeft),\n bottomRight: xy.construct(radius.bottomRight),\n };\n\n return radius as DetailedBorderRadius;\n};\n\nconst cssBorderRadius = (radius: DetailedBorderRadius): string => {\n const { topLeft, topRight, bottomLeft, bottomRight } = radius;\n return `${topLeft.x}% ${topRight.x}% ${bottomRight.x}% ${bottomLeft.x}% / ${topLeft.y}% ${topRight.y}% ${bottomRight.y}% ${bottomLeft.y}%`;\n};\n\nconst DEFAULT_DIMENSIONS = { width: 40, height: 80 };\nconst DEFAULT_BORDER_RADIUS = { x: 50, y: 10 };\n\nexport interface TankProps extends DivProps {\n dimensions?: dimensions.Dimensions;\n borderRadius?: BorderRadius;\n color?: Color.Crude;\n onResize?: (dimensions: dimensions.Dimensions) => void;\n}\n\nexport const Tank = ({\n className,\n dimensions = DEFAULT_DIMENSIONS,\n borderRadius = DEFAULT_BORDER_RADIUS,\n color,\n onResize,\n ...props\n}: TankProps): ReactElement => {\n const detailedRadius = parseBorderRadius(borderRadius);\n const t = Theming.use();\n return (\n <Div\n className={CSS(className, CSS.B(\"tank\"))}\n style={{\n ...dimensions,\n borderRadius: cssBorderRadius(detailedRadius),\n borderColor: Color.cssString(color ?? t.colors.gray.l9),\n }}\n {...props}\n >\n <HandleBoundary>\n <Handle location=\"top\" orientation=\"left\" left={50} top={0} id=\"1\" />\n <Handle\n location=\"top\"\n orientation=\"left\"\n left={-0.5}\n top={detailedRadius.topLeft.y - 1}\n id=\"2\"\n />\n <Handle\n location=\"top\"\n orientation=\"left\"\n left={101}\n top={detailedRadius.topRight.y - 1}\n id=\"3\"\n />\n <Handle location=\"bottom\" orientation=\"left\" left={50} top={100} id=\"4\" />\n <Handle\n location=\"bottom\"\n orientation=\"left\"\n left={-0.5}\n top={100 - detailedRadius.bottomLeft.y + 1}\n id=\"5\"\n />\n <Handle\n location=\"bottom\"\n orientation=\"left\"\n left={101}\n top={100 - detailedRadius.bottomRight.y + 1}\n id=\"6\"\n />\n <Handle location=\"left\" orientation=\"left\" left={-0.5} top={50} id=\"7\" />\n <Handle location=\"right\" orientation=\"left\" left={101} top={50} id=\"8\" />\n </HandleBoundary>\n </Div>\n );\n};\n\nexport interface RegulatorProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const Regulator = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: RegulatorProps): ReactElement => (\n <Div className={CSS(className, CSS.B(\"regulator\"))} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={66} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={66} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 84, height: 58 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path d=\"M42 36.5L5.41845 16.8709C3.41989 15.7985 1 17.2463 1 19.5144V53.4856C1 55.7537 3.4199 57.2015 5.41846 56.1291L42 36.5ZM42 36.5L78.5815 16.8709C80.5801 15.7985 83 17.2463 83 19.5144V53.4856C83 55.7537 80.5801 57.2015 78.5815 56.1291L42 36.5Z\" />\n <Path d=\"M40 1.5H27.1522C24.8526 1.5 23.4081 3.9809 24.5432 5.98082L41.1303 35.2058C41.6373 36.099 43 35.7392 43 34.7122V4.5C43 2.84315 41.6569 1.5 40 1.5Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface OrificeProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const Orifice = ({\n className,\n orientation = \"left\",\n scale,\n color,\n ...props\n}: OrificeProps): ReactElement => (\n <Div className={CSS(CSS.B(\"orifice\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 70, height: 34 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path d=\"M2 2.5C27.451 21.3469 60.0915 12.0132 68 2.5\" strokeLinecap=\"round\" />\n <Path d=\"M2 32.5C27.451 13.6531 60.0915 22.9868 68 32.5\" strokeLinecap=\"round\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface NeedleValveProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const NeedleValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: NeedleValveProps): ReactElement => (\n <Div className={CSS(CSS.B(\"needle-valve\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 42 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path\n d=\"M43.0152 21.5391L38.237 2.62245C38.1573 2.30658 38.396 2 38.7218 2L48.2782 2C48.604 2 48.8427 2.30658 48.763 2.62245L43.9848 21.5391C43.8576 22.0425 43.1424 22.0425 43.0152 21.5391Z\"\n fill={Color.cssString(color)}\n />\n <Path d=\"M43.5 21.5L6.35453 2.70349C4.35901 1.69372 2 3.14384 2 5.38029V37.6197C2 39.8562 4.35901 41.3063 6.35453 40.2965L43.5 21.5ZM43.5 21.5L80.6455 2.70349C82.641 1.69372 85 3.14384 85 5.3803V37.6197C85 39.8562 82.641 41.3063 80.6455 40.2965L43.5 21.5Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface AngledReliefValveProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const AngledReliefValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: AngledReliefValveProps): ReactElement => (\n <Div\n orientation={orientation}\n className={CSS(CSS.B(\"angled-relief-valve\"), className)}\n {...props}\n >\n <HandleBoundary>\n <Handle location=\"bottom\" orientation={orientation} left={33} top={100} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={45} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 64, height: 79 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path d=\"M20.75 2L20.75 38\" strokeLinecap=\"round\" />\n <Path d=\"M9.05106 14.0802L32.4273 4.29611\" strokeLinecap=\"round\" />\n <Path d=\"M9.05106 20.0802L32.4273 10.2961\" strokeLinecap=\"round\" />\n <Path d=\"M9.05106 26.0802L32.4273 16.2961\" strokeLinecap=\"round\" />\n <Path d=\"M22.3611 35.1077C21.6298 35.4778 21.6298 36.5222 22.3611 36.8923L57.7433 54.7965C59.7388 55.8063 62.0978 54.3562 62.0978 52.1197L62.0978 19.8803C62.0978 17.6438 59.7388 16.1937 57.7433 17.2035L22.3611 35.1077Z\" />\n <Path d=\"M21.8923 37.3611C21.5222 36.6298 20.4778 36.6298 20.1077 37.3611L2.20349 72.7433C1.19372 74.7388 2.64384 77.0978 4.8803 77.0978H37.1197C39.3562 77.0978 40.8063 74.7388 39.7965 72.7433L21.8923 37.3611Z\" />\n <Path d=\"M24.3461 33.5709L21.7484 34.88C20.9998 35.2572 20.3887 35.8601 20.0012 36.6035L19.3383 37.8756\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface ValueProps extends DivProps {\n dimensions?: dimensions.Dimensions;\n color?: Color.Crude;\n units?: string;\n}\n\nexport const Value = ({\n className,\n color,\n dimensions,\n orientation,\n units = \"psi\",\n children,\n ...props\n}: ValueProps): ReactElement => {\n const borderColor = Color.cssString(color);\n const theme = Theming.use();\n let textColor: string | undefined = \"var(--pluto-gray-l0)\";\n if (color != null)\n textColor = Color.cssString(\n new Color.Color(color).pickByContrast(theme.colors.gray.l0, theme.colors.gray.l9),\n );\n return (\n <Div\n className={CSS(CSS.B(\"value\"), className)}\n {...props}\n style={{\n borderColor,\n height: dimensions?.height,\n width: \"100%\",\n }}\n >\n <div\n className={CSS.BE(\"value\", \"content\")}\n style={{ flexGrow: 1, minWidth: dimensions?.width, inlineSize: 80 }}\n >\n {children}\n </div>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation=\"left\" left={-2} top={50} id=\"1\" />\n <Handle location=\"right\" orientation=\"left\" left={102} top={50} id=\"2\" />\n <Handle location=\"top\" orientation=\"left\" left={50} top={-2} id=\"3\" />\n <Handle location=\"bottom\" orientation=\"left\" left={50} top={102} id=\"4\" />\n </HandleBoundary>\n <div className={CSS.BE(\"value\", \"units\")} style={{ background: borderColor }}>\n <Text.Text level=\"small\" color={textColor}>\n {units}\n </Text.Text>\n </div>\n </Div>\n );\n};\n\nexport interface SwitchProps extends Omit<ToggleProps, \"onClick\">, OrientableProps {\n onClick?: MouseEventHandler<HTMLInputElement>;\n}\n\nexport const Switch = ({\n enabled = false,\n onClick,\n orientation = \"left\",\n}: SwitchProps): ReactElement => {\n return (\n <Div orientation={orientation}>\n <Input.Switch value={enabled} onClick={onClick} onChange={() => {}} />\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={50} id=\"2\" />\n </HandleBoundary>\n </Div>\n );\n};\n\nexport interface ButtonProps extends Omit<DivProps, \"onClick\"> {\n label?: string;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n}\n\nexport const Button = ({\n onClick,\n orientation = \"left\",\n label = \"\",\n}: ButtonProps): ReactElement => {\n return (\n <Div orientation={orientation}>\n <CoreButton.Button onClick={onClick}>{label}</CoreButton.Button>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={50} id=\"2\" />\n <Handle location=\"top\" orientation={orientation} left={50} top={0} id=\"3\" />\n <Handle\n location=\"bottom\"\n orientation={orientation}\n left={50}\n top={100}\n id=\"4\"\n />\n </HandleBoundary>\n </Div>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, useEffect } from \"react\";\n\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { toggle } from \"@/vis/toggle/aether\";\n\nexport interface UseProps\n extends Pick<z.input<typeof toggle.toggleStateZ>, \"source\" | \"sink\"> {\n aetherKey: string;\n}\n\nexport interface UseReturn\n extends Pick<z.output<typeof toggle.toggleStateZ>, \"triggered\" | \"enabled\"> {\n toggle: () => void;\n}\n\nexport const use = ({ aetherKey, source, sink }: UseProps): UseReturn => {\n const memoProps = useMemoDeepEqualProps({ source, sink });\n const [, { triggered, enabled }, setState] = Aether.use({\n aetherKey,\n type: toggle.Toggle.TYPE,\n schema: toggle.toggleStateZ,\n initialState: {\n triggered: false,\n enabled: false,\n ...memoProps,\n },\n });\n\n useEffect(() => {\n setState((state) => ({ ...state, ...memoProps }));\n }, [memoProps, setState]);\n\n const handleToggle = useCallback(\n () =>\n setState((state) => ({\n ...state,\n triggered: !state.triggered,\n })),\n [setState],\n );\n\n return {\n toggle: handleToggle,\n triggered,\n enabled,\n };\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useState, type ReactElement, useCallback } from \"react\";\n\nimport { box, xy, location, type UnknownRecord, direction } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { type Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { useResize } from \"@/hooks\";\nimport { Control } from \"@/telem/control\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\nimport { Tooltip } from \"@/tooltip\";\nimport { Button as CoreButton } from \"@/vis/button\";\nimport { useInitialViewport } from \"@/vis/diagram/aether/Diagram\";\nimport { Labeled, type LabelExtensionProps } from \"@/vis/schematic/Labeled\";\nimport { Primitives } from \"@/vis/schematic/primitives\";\nimport { Toggle } from \"@/vis/toggle\";\nimport { Value as CoreValue } from \"@/vis/value\";\n\nimport \"@/vis/schematic/Symbols.css\";\n\nexport interface ControlStateProps extends Omit<Align.SpaceProps, \"direction\"> {\n showChip?: boolean;\n showIndicator?: boolean;\n chip?: Control.ChipProps;\n indicator?: Control.IndicatorProps;\n orientation?: location.Outer;\n}\n\nconst swapXLocation = (l: location.Outer): location.Outer =>\n direction.construct(l) === \"x\" ? (location.swap(l) as location.Outer) : l;\nconst swapYLocation = (l: location.Outer): location.Outer =>\n direction.construct(l) === \"y\" ? (location.swap(l) as location.Outer) : l;\n\nexport const ControlState = ({\n showChip = true,\n showIndicator = true,\n indicator,\n orientation = \"left\",\n chip,\n children,\n ...props\n}: ControlStateProps): ReactElement => (\n <Align.Space\n direction={location.rotate90(orientation)}\n align=\"center\"\n justify=\"center\"\n empty\n {...props}\n >\n <Align.Space\n direction={direction.construct(orientation)}\n align=\"center\"\n className={CSS(CSS.B(\"control-state\"))}\n size=\"small\"\n >\n {showChip && <Control.Chip size=\"small\" {...chip} />}\n {showIndicator && <Control.Indicator {...indicator} />}\n </Align.Space>\n {children}\n </Align.Space>\n);\n\nexport type SymbolProps<P extends object = UnknownRecord> = P & {\n symbolKey: string;\n position: xy.XY;\n selected: boolean;\n onChange: (value: P) => void;\n};\n\nexport interface ThreeWayValveProps\n extends Primitives.ThreeWayValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const ThreeWayValve = Aether.wrap<SymbolProps<ThreeWayValveProps>>(\n \"ThreeWayValve\",\n ({\n aetherKey,\n label,\n onChange,\n control,\n source,\n sink,\n orientation = \"left\",\n color,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({\n aetherKey,\n source,\n sink,\n });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={swapXLocation(orientation)}>\n <Primitives.ThreeWayValve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const ThreeWayValvePreview = (props: ThreeWayValveProps): ReactElement => (\n <Primitives.ThreeWayValve {...props} />\n);\n\nexport interface ValveProps\n extends Primitives.ValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const Valve = Aether.wrap<SymbolProps<ValveProps>>(\n \"Valve\",\n ({\n control,\n aetherKey,\n label,\n onChange,\n source,\n sink,\n orientation,\n color,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={orientation}>\n <Primitives.Valve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const ValvePreview = (props: ValveProps): ReactElement => (\n <Primitives.Valve {...props} />\n);\n\nexport interface SolenoidValveProps\n extends Primitives.SolenoidValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const SolenoidValve = Aether.wrap<SymbolProps<SolenoidValveProps>>(\n \"SolenoidValve\",\n ({\n aetherKey,\n label,\n onChange,\n orientation = \"left\",\n normallyOpen,\n color,\n source,\n sink,\n control,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={swapYLocation(orientation)}>\n <Primitives.SolenoidValve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n normallyOpen={normallyOpen}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const SolenoidValvePreview = (props: SolenoidValveProps): ReactElement => (\n <Primitives.SolenoidValve {...props} />\n);\n\nexport interface FourWayValveProps\n extends Primitives.FourWayValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const FourWayValve = Aether.wrap<SymbolProps<FourWayValveProps>>(\n \"FourWayValve\",\n ({\n aetherKey,\n control,\n label,\n onChange,\n orientation,\n color,\n source,\n sink,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={orientation}>\n <Primitives.FourWayValve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const FourWayValvePreview = (props: FourWayValveProps): ReactElement => (\n <Primitives.FourWayValve {...props} />\n);\n\nexport interface AngledValveProps\n extends Primitives.AngledValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const AngledValve = Aether.wrap<SymbolProps<AngledValveProps>>(\n \"AngleValve\",\n ({\n aetherKey,\n label,\n control,\n onChange,\n orientation = \"left\",\n color,\n source,\n sink,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={swapXLocation(orientation)}>\n <Primitives.AngledValve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const AngledValvePreview = (props: AngledValveProps): ReactElement => (\n <Primitives.AngledValve {...props} />\n);\n\nexport interface PumpProps\n extends Primitives.PumpProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const Pump = Aether.wrap<SymbolProps<PumpProps>>(\n \"Pump\",\n ({\n aetherKey,\n label,\n control,\n onChange,\n orientation,\n color,\n source,\n sink,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={orientation}>\n <Primitives.Pump\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const PumpPreview = (props: PumpProps): ReactElement => (\n <Primitives.Pump {...props} />\n);\n\nexport interface TankProps extends Primitives.TankProps {\n label?: LabelExtensionProps;\n}\n\nexport const Tank = Aether.wrap<SymbolProps<TankProps>>(\n \"Tank\",\n ({ label, onChange, orientation, color, dimensions, borderRadius }): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Tank\n onResize={(dims) => onChange({ dimensions: dims })}\n orientation={orientation}\n color={color}\n dimensions={dimensions}\n borderRadius={borderRadius}\n />\n </Labeled>\n );\n },\n);\n\nexport const TankPreview = (props: TankProps): ReactElement => (\n <Primitives.Tank {...props} dimensions={{ width: 25, height: 50 }} />\n);\n\nexport interface ReliefValveProps extends Primitives.ReliefValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const ReliefValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<ReliefValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.ReliefValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const ReliefValvePreview = (props: ReliefValveProps): ReactElement => (\n <Primitives.ReliefValve {...props} />\n);\n\nexport interface RegulatorProps extends Primitives.RegulatorProps {\n label?: LabelExtensionProps;\n}\n\nexport const Regulator = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<RegulatorProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Regulator orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const RegulatorPreview = (props: RegulatorProps): ReactElement => (\n <Primitives.Regulator {...props} />\n);\n\nexport interface BurstDiscProps extends Primitives.BurstDiscProps {\n label?: LabelExtensionProps;\n}\n\nexport const BurstDisc = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<BurstDiscProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.BurstDisc orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const BurstDiscPreview = (props: BurstDiscProps): ReactElement => (\n <Primitives.BurstDisc {...props} />\n);\n\nexport interface CapProps extends Primitives.CapProps {\n label?: LabelExtensionProps;\n}\n\nexport const Cap = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<CapProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Cap orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const CapPreview = (props: CapProps): ReactElement => (\n <Primitives.Cap {...props} />\n);\n\nexport interface ManualValveProps extends Primitives.ManualValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const ManualValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<ManualValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.ManualValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const ManualValvePreview = (props: ManualValveProps): ReactElement => (\n <Primitives.ManualValve {...props} />\n);\n\nexport interface FilterProps extends Primitives.FilterProps {\n label?: LabelExtensionProps;\n}\n\nexport const Filter = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<FilterProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Filter orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const FilterPreview = (props: FilterProps): ReactElement => (\n <Primitives.Filter {...props} />\n);\n\nexport interface NeedleValveProps extends Primitives.NeedleValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const NeedleValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<NeedleValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.NeedleValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const NeedleValvePreview = (props: NeedleValveProps): ReactElement => (\n <Primitives.NeedleValve {...props} />\n);\n\nexport interface CheckValveProps extends Primitives.CheckValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const CheckValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<CheckValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.CheckValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const CheckValvePreview = (props: CheckValveProps): ReactElement => (\n <Primitives.CheckValve {...props} />\n);\n\nexport interface OrificeProps extends Primitives.OrificeProps {\n label?: LabelExtensionProps;\n}\n\nexport const Orifice = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<OrificeProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Orifice orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const OrificePreview = (props: OrificeProps): ReactElement => (\n <Primitives.Orifice {...props} />\n);\n\nexport interface AngledReliefValveProps extends Primitives.AngledReliefValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const AngledReliefValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<AngledReliefValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.AngledReliefValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const AngledReliefValvePreview = (\n props: Primitives.AngledReliefValveProps,\n): ReactElement => <Primitives.AngledReliefValve {...props} />;\n\nexport interface ValueProps\n extends Omit<CoreValue.UseProps, \"box\" | \"aetherKey\">,\n Primitives.ValueProps {\n position?: xy.XY;\n label?: LabelExtensionProps;\n color?: Color.Crude;\n textColor?: Color.Crude;\n tooltip?: string[];\n}\n\ninterface ValueDimensionsState {\n outerBox: box.Box;\n labelBox: box.Box;\n}\n\nexport const Value = Aether.wrap<SymbolProps<ValueProps>>(\n \"Value\",\n ({\n aetherKey,\n label,\n level = \"p\",\n position,\n className,\n textColor,\n color,\n telem,\n units,\n onChange,\n tooltip,\n }): ReactElement => {\n const font = Theming.useTypography(level);\n const [dimensions, setDimensions] = useState<ValueDimensionsState>({\n outerBox: box.ZERO,\n labelBox: box.ZERO,\n });\n\n const valueBoxHeight = (font.lineHeight + 0.5) * font.baseSize + 2;\n const resizeRef = useResize(\n useCallback((b) => {\n // Find the element with the class pluto-symbol__label that is underneath\n // the 'react-flow__node' with the data-id of aetherKey\n const label = document.querySelector(\n `.react-flow__node[data-id=\"${aetherKey}\"] .pluto-symbol__label`,\n );\n let labelBox = { ...box.ZERO };\n if (label != null) {\n labelBox = box.construct(label);\n labelBox = box.resize(labelBox, {\n width: box.width(labelBox),\n height: box.height(labelBox),\n });\n }\n setDimensions({ outerBox: b, labelBox });\n }, []),\n {},\n );\n\n const { zoom } = useInitialViewport();\n\n const adjustedBox = adjustBox({\n labelOrientation: label?.orientation ?? \"top\",\n hasLabel: label?.label != null && label?.label.length > 0,\n valueBoxHeight,\n position,\n zoom,\n ...dimensions,\n });\n\n const { width: oWidth } = CoreValue.use({\n aetherKey,\n color: textColor,\n level,\n box: adjustedBox,\n telem,\n minWidth: 60,\n });\n\n return (\n <Tooltip.Dialog\n location={{ y: \"top\" }}\n hide={tooltip == null || tooltip.length === 0}\n >\n <Align.Space direction=\"y\">\n {tooltip?.map((t, i) => (\n <Text.Text key={i} level=\"small\">\n {t}\n </Text.Text>\n ))}\n </Align.Space>\n <Labeled\n className={CSS(className, CSS.B(\"value-labeled\"))}\n ref={resizeRef}\n onChange={onChange}\n {...label}\n >\n <Primitives.Value\n color={color}\n dimensions={{\n height: valueBoxHeight,\n width: oWidth,\n }}\n units={units}\n />\n </Labeled>\n </Tooltip.Dialog>\n );\n },\n);\n\ninterface AdjustBoxProps {\n labelOrientation: location.Outer;\n zoom: number;\n outerBox: box.Box;\n labelBox: box.Box;\n valueBoxHeight: number;\n position: xy.XY;\n hasLabel: boolean;\n}\n\nconst LABEL_SCALE = 0.9;\n\nconst adjustBox = ({\n labelOrientation,\n outerBox,\n labelBox,\n valueBoxHeight,\n position,\n hasLabel,\n zoom,\n}: AdjustBoxProps): box.Box => {\n const labelDims = xy.scale(box.dims(labelBox), 1 / (LABEL_SCALE * zoom));\n const dir = direction.construct(labelOrientation);\n if (dir === \"x\")\n position = xy.translate(\n position,\n \"y\",\n Math.max((labelDims.y - valueBoxHeight) / 2 - 1, 0),\n );\n if (hasLabel && labelOrientation === \"left\")\n position = xy.translate(position, \"x\", labelDims.x + 4);\n else if (hasLabel && labelOrientation === \"top\")\n position = xy.translate(position, \"y\", labelDims.y + 4);\n return box.construct(position.x, position.y, box.width(outerBox), valueBoxHeight);\n};\n\nexport const ValuePreview = ({ color }: ValueProps): ReactElement => {\n return (\n <Primitives.Value\n color={color}\n dimensions={{\n width: 60,\n height: 25,\n }}\n units={\"psi\"}\n >\n <Text.Text level=\"p\">50.00</Text.Text>\n </Primitives.Value>\n );\n};\n\nexport interface SwitchProps\n extends Primitives.SwitchProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const Switch = Aether.wrap<SymbolProps<SwitchProps>>(\n \"Switch\",\n ({\n aetherKey,\n label,\n control,\n onChange,\n orientation,\n color,\n source,\n sink,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={orientation}>\n <Primitives.Switch\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const SwitchPreview = (props: SwitchProps): ReactElement => (\n <Primitives.Switch {...props} />\n);\n\nexport interface ButtonProps\n extends Omit<Primitives.ButtonProps, \"label\" | \"onClick\">,\n Omit<CoreButton.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const Button = Aether.wrap<SymbolProps<ButtonProps>>(\n \"Button\",\n ({ aetherKey, label, orientation, sink, control }) => {\n const { click } = CoreButton.use({ aetherKey, sink });\n return (\n <ControlState {...control} className={CSS.B(\"symbol\")} orientation={orientation}>\n <Primitives.Button label={label?.label} onClick={click} />\n </ControlState>\n );\n },\n);\n\nexport const ButtonPreview = ({ label: _, ...props }: ButtonProps): ReactElement => (\n <Primitives.Button label=\"Button\" {...props} />\n);\n","import { t as l, g as a } from \"./path-cq-nd1RA.js\";\nconst o = (e) => l(e, (t, r, n) => {\n const c = r === n.length - 1, u = !isNaN(parseInt(t)), i = !isNaN(parseInt(n[r + 1]));\n return u && (t = \"element\"), c || i ? t : [t, \"shape\"];\n}), s = (e, t) => {\n if (e == null)\n return null;\n const r = e[t];\n return r == null && typeof e == \"object\" && \"sourceType\" in e ? e.sourceType()[t] : r;\n}, p = (e, t, r) => a(\n s(e, \"shape\"),\n o(t),\n r,\n { getter: s }\n), m = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n getFieldSchema: p,\n getFieldSchemaPath: o\n}, Symbol.toStringTag, { value: \"Module\" }));\nexport {\n m as zodutil\n};\n//# sourceMappingURL=zodutil.js.map\n","// Copyright 2024 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\n/* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */\nimport {\n type ReactElement,\n type PropsWithChildren,\n createContext,\n useContext as reactUseContext,\n useState,\n useLayoutEffect,\n useRef,\n useMemo,\n useCallback,\n useEffect,\n FC,\n} from \"react\";\n\nimport { shallowCopy, type Destructor, toArray, Key, Keyed } from \"@synnaxlabs/x\";\nimport { caseconv } from \"@synnaxlabs/x/caseconv\";\nimport { deep } from \"@synnaxlabs/x/deep\";\nimport { z } from \"zod\";\n\nimport { useSyncedRef } from \"@/hooks/ref\";\nimport { Input } from \"@/input\";\nimport { type status } from \"@/status/aether\";\nimport { componentRenderProp, type RenderProp } from \"@/util/renderProp\";\nimport { CSS } from \"@/css\";\nimport { zodutil } from \"@synnaxlabs/x/zodutil\";\nimport { Select } from \"@/select\";\n\n/** Props for the @see useField hook */\nexport interface UseFieldProps<I, O = I> {\n path: string;\n optional?: false;\n onChange?: (value: O, extra: ContextValue & { path: string }) => void;\n defaultValue?: O;\n}\n\nexport interface UseNullableFieldProps<I, O = I>\n extends Omit<UseFieldProps<I, O>, \"optional\"> {\n optional: true;\n}\n\n/** Return type for the @see useField hook */\nexport interface UseFieldReturn<I extends Input.Value, O extends Input.Value = I>\n extends FieldState<I> {\n onChange: (value: O) => void;\n status: status.CrudeSpec;\n}\n\ninterface UseField {\n <I extends Input.Value, O extends Input.Value = I>(\n props: UseFieldProps<I, O>,\n ): UseFieldReturn<I, O>;\n <I extends Input.Value, O extends Input.Value = I>(\n props: UseNullableFieldProps<I, O>,\n ): UseFieldReturn<I, O> | null;\n}\n\n/**\n * Hook for managing a particular field in a form.\n *\n * @param props - The props for the hook\n * @param props.path - The path to the field in the form.\n */\nexport const useField = (<I extends Input.Value, O extends Input.Value = I>({\n path,\n optional: propsOptional,\n onChange,\n defaultValue,\n}: UseFieldProps<I, O>): UseFieldReturn<I, O> | null => {\n const ctx = useContext();\n const { get, bind, set } = ctx;\n const optional = defaultValue != null || (propsOptional ?? false);\n\n const [state, setState] = useState<FieldState<I> | null>(get<I>({ path, optional }));\n\n useLayoutEffect(() => {\n setState(get<I>({ path, optional }));\n return bind({ path, onChange: setState, listenToChildren: false });\n }, [path, bind, setState]);\n\n const handleChange = useCallback(\n (value: O) => {\n onChange?.(value, { ...ctx, path });\n set({ path, value });\n },\n [path, set, onChange],\n );\n\n if (state == null) {\n if (defaultValue != null) set({ path, value: defaultValue });\n if (!optional) throw new Error(`Field state is null: ${path}`);\n return null;\n }\n\n return { onChange: handleChange, ...state };\n}) as UseField;\n\nexport type UseFieldValue = (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional?: false,\n ctx?: ContextValue,\n) => O) &\n (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional: true,\n ctx?: ContextValue,\n ) => O | null);\n\nexport type UseFieldState = (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional?: false,\n ctx?: ContextValue,\n) => FieldState<O>) &\n (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional: true,\n ctx?: ContextValue,\n ) => FieldState<O> | null);\n\nexport const useFieldState = <I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional: boolean = false,\n ctx?: ContextValue,\n): FieldState<O> | null => {\n const { get, bind } = useContext(ctx);\n const [, setChangeTrigger] = useState(0);\n useLayoutEffect(() => {\n setChangeTrigger((prev) => prev + 1);\n return bind<O>({ path, onChange: () => setChangeTrigger((p) => p + 1) });\n }, [path, bind]);\n return get<O>({ path, optional }) ?? null;\n};\n\nexport const useFieldValue = (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional: boolean = false,\n ctx?: ContextValue,\n): O | null => {\n const { get, bind } = useContext(ctx);\n const [, setChangeTrigger] = useState(0);\n useLayoutEffect(() => {\n setChangeTrigger((prev) => prev + 1);\n return bind<O>({ path, onChange: () => setChangeTrigger((p) => p + 1) });\n }, [path, bind]);\n return get<O>({ path, optional })?.value ?? null;\n}) as UseFieldValue;\n\nexport const useFieldValid = (path: string): boolean =>\n useFieldState(path, true)?.status?.variant === \"success\";\n\nexport interface UseFieldListenerProps<\n I extends Input.Value,\n Z extends z.ZodTypeAny = z.ZodTypeAny,\n> {\n ctx?: ContextValue<Z>;\n path: string;\n onChange: (state: FieldState<I>, extra: ContextValue) => void;\n}\n\nexport const useFieldListener = <\n I extends Input.Value,\n Z extends z.ZodTypeAny = z.ZodTypeAny,\n>({\n path,\n ctx: override,\n onChange,\n}: UseFieldListenerProps<I, Z>): void => {\n const ctx = useContext(override);\n useLayoutEffect(\n () =>\n ctx.bind<I>({\n path,\n onChange: (fs) => onChange(fs, ctx),\n listenToChildren: false,\n }),\n [path, ctx],\n );\n};\n\nexport interface UseChildFieldValuesProps {\n path: string;\n optional?: false;\n}\n\nexport interface UseNullableChildFieldValuesProps {\n path: string;\n optional: true;\n}\n\nexport interface UseChildFieldValues {\n <V extends unknown = unknown>(props: UseChildFieldValuesProps): V;\n <V extends unknown = unknown>(props: UseNullableChildFieldValuesProps): V | null;\n}\n\nexport const useChildFieldValues = (<V extends unknown = unknown>({\n path,\n optional = false,\n}: UseChildFieldValuesProps): V | null => {\n const { bind, get } = useContext();\n const [state, setState] = useState<FieldState<V> | null>(get<V>({ path, optional }));\n useLayoutEffect(() => {\n setState(get<V>({ path, optional }));\n return bind<V>({\n path,\n onChange: (fs) => setState({ ...fs, value: shallowCopy(fs.value) }),\n listenToChildren: true,\n });\n }, [path, bind, get]);\n if (state == null && !optional) throw new Error(\"Field state is null\");\n return state?.value ?? null;\n}) as UseChildFieldValues;\n\nexport interface UseFieldArrayProps {\n path: string;\n updateOnChildren?: boolean;\n}\n\nexport interface UseFieldArrayReturn<V extends unknown> {\n value: V[];\n push: (value: V | V[]) => void;\n remove: (index: number | number[]) => void;\n keepOnly: (indices: number | number[]) => void;\n}\n\nexport const useFieldArray = <V extends unknown = unknown>({\n path,\n updateOnChildren = false,\n}: UseFieldArrayProps): UseFieldArrayReturn<V> => {\n const { bind, get, set } = useContext();\n const [state, setState] = useState<V[]>(get<V[]>({ path, optional: false }).value);\n\n useLayoutEffect(() => {\n setState(get<V[]>({ path, optional: false }).value);\n return bind<V[]>({\n path,\n onChange: (fs) => setState(shallowCopy<V[]>(fs.value)),\n listenToChildren: updateOnChildren,\n });\n }, [path, bind, get, setState]);\n\n const push = useCallback(\n (value: V | V[]) => {\n const copy = shallowCopy(get<V[]>({ path }).value);\n copy.push(...toArray(value));\n set({ path, value: copy });\n },\n [path, get, set],\n );\n\n const remove = useCallback(\n (index: number | number[]) => {\n const val = get<V[]>({ path, optional: false }).value;\n const indices = new Set(toArray(index));\n set({path, value: val.filter((_, i) => !indices.has(i)) });\n },\n [path, state, get],\n );\n\n const keepOnly = useCallback(\n (index: number | number[]) => {\n const val = get<V[]>({ path, optional: false }).value;\n const indices = new Set(toArray(index));\n set({ path, value: val.filter((_, i) => indices.has(i)) });\n },\n [path, state, get],\n );\n\n return { value: state, push, remove, keepOnly };\n};\n\nexport interface FieldProps<\n I extends Input.Value = string | number,\n O extends Input.Value = I,\n> extends UseFieldProps<I, O>,\n Omit<Input.ItemProps, \"children\" | \"onChange\" | \"defaultValue\"> {\n children?: RenderProp<Input.Control<I, O>>;\n padHelpText?: boolean;\n visible?: boolean | ((state: FieldState<I>, ctx: ContextValue) => boolean);\n hideIfNull?: boolean;\n}\n\nconst defaultInput = componentRenderProp(Input.Text);\n\nexport type FieldT<I extends Input.Value, O extends Input.Value = I> = (\n props: FieldProps<I, O>,\n) => ReactElement | null;\n\nexport const Field = <\n I extends Input.Value = string | number,\n O extends Input.Value = I,\n>({\n path,\n children = defaultInput as unknown as RenderProp<Input.Control<I, O>>,\n label,\n padHelpText = true,\n visible = true,\n hideIfNull = false,\n optional,\n defaultValue,\n onChange,\n className,\n ...props\n}: FieldProps<I, O>): ReactElement | null => {\n const field = useField<I, O>({\n path,\n optional: (optional as true) ?? (hideIfNull as true),\n onChange,\n defaultValue,\n });\n const ctx = useContext();\n if (field == null) return null;\n if (path == null) throw new Error(\"No path provided to Form Field\");\n if (label == null) label = caseconv.capitalize(deep.element(path, -1));\n visible = typeof visible === \"function\" ? visible(field, ctx) : visible;\n if (!visible) return null;\n const helpText = field.touched ? field.status.message : \"\";\n const { onChange: fieldOnChange, value } = field;\n return (\n <Input.Item\n padHelpText={padHelpText}\n helpText={helpText}\n helpTextVariant={field.status.variant}\n label={label}\n required={field.required}\n className={CSS(className, CSS.BE(\"field\", path.split(\".\").join(\"-\")))}\n {...props}\n >\n {children({ onChange: fieldOnChange, value })}\n </Input.Item>\n );\n};\n\nexport interface FieldBuilderProps<\n I extends Input.Value,\n O extends Input.Value,\n P extends {},\n> {\n fieldKey?: string;\n fieldProps?: Partial<FieldProps<I, O>>;\n inputProps?: Partial<P>;\n}\n\nexport interface BuiltFieldProps<\n I extends Input.Value,\n O extends Input.Value,\n P extends {},\n> extends FieldProps<I, O> {\n inputProps?: Partial<P>;\n fieldKey?: string;\n}\n\nexport const fieldBuilder =\n <I extends Input.Value, O extends Input.Value, P extends {}>(\n Component: FC<P & Input.Control<I, O>>,\n ) =>\n ({\n fieldKey: baseFieldKey,\n fieldProps,\n inputProps: baseInputProps,\n }: FieldBuilderProps<I, O, P>): FC<BuiltFieldProps<I, O, P>> =>\n ({\n inputProps,\n path,\n fieldKey = baseFieldKey,\n ...props\n }: BuiltFieldProps<I, O, P>) => (\n <Field<I, O>\n {...fieldProps}\n {...props}\n path={fieldKey ? `${path}.${fieldKey}` : path}\n >\n {(cp) => <Component {...cp} {...baseInputProps} {...(inputProps as P)} />}\n </Field>\n );\n\nexport const buildNumericField = fieldBuilder(Input.Numeric);\nexport const NumericField = buildNumericField({});\nexport const buildTextField = fieldBuilder(Input.Text);\nexport const TextField = buildTextField({});\nexport const buildSwitchField = fieldBuilder(Input.Switch);\nexport const SwitchField = buildSwitchField({});\nexport const buildSelectSingleField = fieldBuilder(Select.Single) as <\n K extends Key,\n E extends Keyed<K>,\n>({\n fieldProps,\n inputProps,\n}: FieldBuilderProps<K, K, Select.SingleProps<K, E>>) => FC<\n BuiltFieldProps<K, K, Select.SingleProps<K, E>>\n>;\n\nexport const buildSelectMultiField = fieldBuilder(Select.Multiple) as <\n K extends Key,\n E extends Keyed<K>,\n>({\n fieldProps,\n inputProps,\n}: FieldBuilderProps<K, K, Select.MultipleProps<K, E>>) => FC<\n BuiltFieldProps<K, K, Select.MultipleProps<K, E>>\n>;\n\nexport const buildButtonSelectField = fieldBuilder(Select.DropdownButton) as <\n K extends Key,\n E extends Keyed<K>,\n>({\n fieldProps,\n inputProps,\n}: FieldBuilderProps<K, K, Select.DropdownButtonProps<K, E>>) => FC<\n BuiltFieldProps<K, K, Select.DropdownButtonProps<K, E>>\n>;\n\nexport type Listener<V = unknown> = (state: FieldState<V>) => void;\n\nexport interface FieldState<V = unknown> {\n value: V;\n status: status.CrudeSpec;\n touched: boolean;\n required: boolean;\n}\n\ninterface RequiredGetProps {\n path: string;\n optional?: boolean;\n}\n\ninterface OptionalGetProps {\n path: string;\n optional: true;\n}\n\ntype GetProps = RequiredGetProps | OptionalGetProps;\n\ninterface GetFunc {\n <V extends Input.Value>(props: RequiredGetProps): FieldState<V>;\n <V extends Input.Value>(props: OptionalGetProps): FieldState<V> | null;\n}\n\ninterface SetProps {\n path: string;\n value: unknown;\n}\n\ntype SetFunc = (props: SetProps) => void;\n\ninterface BindProps<V = unknown> {\n path: string;\n onChange: Listener<V>;\n listenToChildren?: boolean;\n}\n\ntype BindFunc = <V = unknown>(props: BindProps<V>) => Destructor;\n\nexport interface ContextValue<Z extends z.ZodTypeAny = z.ZodTypeAny> {\n bind: BindFunc;\n set: SetFunc;\n get: GetFunc;\n value: () => z.output<Z>;\n validate: (path?: string) => boolean;\n validateAsync: (path?: string) => Promise<boolean>;\n has: (path: string) => boolean;\n}\n\nexport const Context = createContext<ContextValue>({\n bind: () => () => {},\n set: () => {},\n get: <V extends any = unknown>(): FieldState<V> => ({\n value: undefined as unknown as V,\n status: { key: \"\", variant: \"success\", message: \"\" },\n touched: false,\n required: false,\n }),\n validate: () => false,\n validateAsync: () => Promise.resolve(false),\n value: () => ({}),\n has: () => false,\n});\n\nexport const useContext = <Z extends z.ZodTypeAny = z.ZodTypeAny>(\n override?: ContextValue<Z>,\n): ContextValue<Z> => {\n const internal = reactUseContext(Context);\n return override ?? (internal as unknown as ContextValue<Z>);\n};\n\nconst NO_ERROR_STATUS = (path: string): status.CrudeSpec => ({\n key: path,\n variant: \"success\",\n message: \"\",\n});\n\ninterface UseRef<Z extends z.ZodTypeAny> {\n state: z.output<Z>;\n status: Map<string, status.CrudeSpec>;\n touched: Set<string>;\n listeners: Map<string, Set<Listener>>;\n parentListeners: Map<string, Set<Listener>>;\n}\n\nexport interface UseProps<Z extends z.ZodTypeAny> {\n values: z.output<Z>;\n sync?: boolean;\n onChange?: (values: z.output<Z>) => void;\n schema?: Z;\n}\n\nexport type UseReturn<Z extends z.ZodTypeAny> = ContextValue<Z>;\n\nconst isWarning = (issue: z.ZodIssue): boolean => getVariant(issue) === \"warning\";\n\nconst getVariant = (issue: z.ZodIssue): status.Variant =>\n issue.code === z.ZodIssueCode.custom &&\n issue.params != null &&\n \"variant\" in issue.params\n ? issue.params.variant\n : \"error\";\n\nexport const use = <Z extends z.ZodTypeAny>({\n values,\n sync = false,\n schema,\n onChange,\n}: UseProps<Z>): UseReturn<Z> => {\n const ref = useRef<UseRef<Z>>({\n state: values,\n status: new Map(),\n touched: new Set(),\n listeners: new Map(),\n parentListeners: new Map(),\n });\n const schemaRef = useSyncedRef(schema);\n const onChangeRef = useSyncedRef(onChange);\n\n const bind: BindFunc = useCallback(\n <V extends any = unknown>({\n path,\n onChange: callback,\n listenToChildren = false,\n }: BindProps<V>): Destructor => {\n const { parentListeners, listeners } = ref.current;\n const lis = listenToChildren ? parentListeners : listeners;\n if (!lis.has(path)) lis.set(path, new Set());\n lis.get(path)?.add(callback as Listener);\n return () => lis.get(path)?.delete(callback as Listener);\n },\n [],\n );\n\n const get: GetFunc = useCallback(\n <V extends any = unknown>({ path, optional }: GetProps): FieldState<V> | null => {\n const { state, status, touched } = ref.current;\n const value = deep.get(state, path, optional);\n if (value == null) return null;\n const fs = {\n value: value as V,\n status: status.get(path) ?? NO_ERROR_STATUS(path),\n touched: touched.has(path),\n required: false,\n };\n if (schemaRef.current == null) return fs;\n const schema = schemaRef.current;\n const zField = zodutil.getFieldSchema(schema, path, true);\n if (zField == null) return fs;\n fs.required = !zField.isOptional();\n return fs;\n },\n [],\n ) as GetFunc;\n\n const processValidationResult = useCallback(\n (\n result: z.SafeParseReturnType<z.input<Z>, z.output<Z>>,\n path: string = \"\",\n ): boolean => {\n const { status, listeners, touched } = ref.current;\n if (result.success) {\n const keys = Array.from(status.keys());\n status.clear();\n keys.forEach((p) => {\n const fs = get({ path: p });\n if (fs == null) return;\n listeners.get(p)?.forEach((l) => l(fs));\n });\n return true;\n }\n let success = true;\n const issueKeys = new Set(result.error.issues.map((i) => i.path.join(\".\")));\n result.error.issues.forEach((issue) => {\n console.log(\"issue\", issue);\n const issuePath = issue.path.join(\".\");\n if (!deep.pathsMatch(issuePath, path)) return;\n const variant = getVariant(issue);\n if (variant !== \"warning\") success = false;\n status.set(issuePath, {\n key: issuePath,\n variant: getVariant(issue),\n message: issue.message,\n });\n touched.add(issuePath);\n let fs = get({ path: issuePath, optional: true });\n // If we can't find the field value, this means the user never set it, so instead\n // we just to a best effort construction of the field state. This means that if\n // the user has a field rendered for this path, the error will be displayed.\n if (fs == null)\n fs = {\n value: undefined,\n status: status.get(issuePath) ?? NO_ERROR_STATUS(issuePath),\n touched: false,\n required: false,\n };\n listeners.get(issuePath)?.forEach((l) => l(fs));\n });\n status.forEach((_, subPath) => {\n if (!issueKeys.has(subPath)) {\n status.delete(subPath);\n const fs = get({ path: subPath });\n listeners.get(subPath)?.forEach((l) => l(fs));\n }\n });\n return success;\n },\n [],\n );\n\n const validate = useCallback(\n (path?: string): boolean => {\n if (schemaRef.current == null) return true;\n const { state } = ref.current;\n const result = schemaRef.current.safeParse(state);\n return processValidationResult(result, path);\n },\n [processValidationResult],\n );\n\n const validateAsync = useCallback(\n async (path?: string): Promise<boolean> => {\n if (schemaRef.current == null) return true;\n const { state } = ref.current;\n const result = await schemaRef.current.safeParseAsync(state);\n return processValidationResult(result, path);\n },\n [processValidationResult],\n );\n\n const set: SetFunc = useCallback(({ path, value }): void => {\n const { state, touched, listeners, parentListeners } = ref.current;\n touched.add(path);\n if (path.length === 0) ref.current.state = value as z.output<Z>;\n else deep.set(state, path, value);\n try {\n validate();\n } catch {\n validateAsync();\n }\n listeners.get(path)?.forEach((l) => l(get({ path })));\n parentListeners.forEach((lis, lisPath) => {\n if (deep.pathsMatch(path, lisPath)) {\n const v = get({ path: lisPath });\n lis.forEach((l) => l(v));\n }\n });\n onChangeRef.current?.(ref.current.state);\n }, []);\n\n const has = useCallback((path: string): boolean => {\n const { state } = ref.current;\n return deep.has(state, path);\n }, []);\n\n useEffect(() => {\n if (!sync) return;\n const { listeners } = ref.current;\n ref.current.state = values;\n listeners.forEach((lis, p) => {\n const v = get({ path: p });\n if (v == null) return;\n lis.forEach((l) => l(v));\n });\n }, [sync, values]);\n\n return useMemo(\n (): ContextValue<Z> => ({\n bind,\n set,\n get,\n validate,\n validateAsync,\n value: () => ref.current.state,\n has,\n }),\n [bind, set, get, validate],\n );\n};\n\nexport const Form = (props: PropsWithChildren<ContextValue>): ReactElement => {\n return <Context.Provider value={props}>{props.children}</Context.Provider>;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { type location } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Button as CoreButton } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { type Input } from \"@/input\";\n\nimport \"@/vis/schematic/OrientationControl.css\";\n\nexport interface OrientationValue {\n inner: location.Outer;\n outer: location.Outer;\n}\n\nexport interface SelectOrientationProps extends Input.Control<OrientationValue> {}\n\nexport const SelectOrientation = ({\n value,\n onChange,\n}: SelectOrientationProps): ReactElement => {\n const { inner, outer } = value;\n const handleChange = (next: Partial<OrientationValue>) => () =>\n onChange({ ...value, ...next });\n\n return (\n <Align.Space\n className={CSS.B(\"orientation-control\")}\n align=\"center\"\n justify=\"center\"\n size={0.5}\n >\n <Button selected={outer === \"top\"} onClick={handleChange({ outer: \"top\" })} />\n <Align.Space direction=\"x\" align=\"center\" justify=\"center\" size={0.5}>\n <Button selected={outer === \"left\"} onClick={handleChange({ outer: \"left\" })} />\n <Align.Space\n className={CSS.B(\"value\")}\n direction=\"y\"\n align=\"center\"\n justify=\"center\"\n empty\n >\n <Button\n className={CSS(CSS.dir(\"y\"))}\n selected={inner === \"top\"}\n onClick={handleChange({ inner: \"top\" })}\n />\n <Align.Space direction=\"x\" align=\"center\" justify=\"center\">\n <Button\n selected={inner === \"left\"}\n onClick={handleChange({ inner: \"left\" })}\n />\n <Button\n selected={inner === \"right\"}\n onClick={handleChange({ inner: \"right\" })}\n />\n </Align.Space>\n <Button\n className={CSS(CSS.dir(\"y\"))}\n selected={inner === \"bottom\"}\n onClick={handleChange({ inner: \"bottom\" })}\n />\n </Align.Space>\n <Button\n selected={outer === \"right\"}\n onClick={handleChange({ outer: \"right\" })}\n />\n </Align.Space>\n <Button\n selected={outer === \"bottom\"}\n onClick={handleChange({ outer: \"bottom\" })}\n />\n </Align.Space>\n );\n};\n\nexport interface ButtonProps extends Omit<CoreButton.IconProps, \"children\"> {\n selected: boolean;\n}\n\nexport const Button = ({\n selected,\n className,\n ...props\n}: ButtonProps): ReactElement => (\n <CoreButton.Icon\n variant=\"text\"\n className={CSS(className, CSS.selected(selected))}\n {...props}\n >\n <div className=\"symbol\"></div>\n </CoreButton.Icon>\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, type ReactElement, type FC, useEffect } from \"react\";\n\nimport { type channel } from \"@synnaxlabs/client\";\nimport { type location, type xy, type bounds } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Channel } from \"@/channel\";\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Form } from \"@/form\";\nimport { Input } from \"@/input\";\nimport { Tabs } from \"@/tabs\";\nimport { type TabRenderProp } from \"@/tabs/Tabs\";\nimport { telem } from \"@/telem/aether\";\nimport { control } from \"@/telem/control/aether\";\nimport { Text } from \"@/text\";\nimport { type Button as CoreButton } from \"@/vis/button\";\nimport { type LabelExtensionProps } from \"@/vis/schematic/Labeled\";\nimport { SelectOrientation } from \"@/vis/schematic/SelectOrientation\";\nimport { type ControlStateProps } from \"@/vis/schematic/Symbols\";\nimport { type Toggle } from \"@/vis/toggle\";\n\nimport \"@/vis/schematic/Forms.css\";\n\nexport interface SymbolFormProps {}\n\nconst COMMON_TOGGLE_FORM_TABS: Tabs.Tab[] = [\n {\n tabKey: \"style\",\n name: \"Style\",\n },\n {\n tabKey: \"control\",\n name: \"Control\",\n },\n];\n\ninterface FormWrapperProps extends Align.SpaceProps {}\n\nconst FormWrapper: FC<FormWrapperProps> = ({\n className,\n direction,\n ...props\n}): ReactElement => (\n <Align.Space\n direction={direction}\n align=\"stretch\"\n className={CSS(CSS.B(\"symbol-form\"), className)}\n size={direction === \"x\" ? \"large\" : \"medium\"}\n {...props}\n />\n);\n\ninterface SymbolOrientation {\n label?: LabelExtensionProps;\n orientation?: location.Outer;\n}\n\nconst OrientationControl: Form.FieldT<SymbolOrientation> = (props): ReactElement => (\n <Form.Field<SymbolOrientation> label=\"Orientation\" padHelpText={false} {...props}>\n {({ value, onChange }) => (\n <SelectOrientation\n value={{\n inner: value.orientation ?? \"top\",\n outer: value.label?.orientation ?? \"top\",\n }}\n onChange={(v) =>\n onChange({\n ...value,\n orientation: v.inner,\n label: {\n ...value.label,\n orientation: v.outer,\n },\n })\n }\n />\n )}\n </Form.Field>\n);\n\nconst LabelControls: Form.FieldT<LabelExtensionProps> = ({ path }): ReactElement => (\n <Align.Space direction=\"x\" align=\"stretch\">\n <Form.Field<string> path={path + \".label\"} label=\"Label\" padHelpText={false} grow>\n {(p) => <Input.Text selectOnFocus {...p} />}\n </Form.Field>\n <Form.Field<Text.Level>\n path={path + \".level\"}\n label=\"Label Size\"\n padHelpText={false}\n >\n {(p) => <Text.SelectLevel {...p} />}\n </Form.Field>\n </Align.Space>\n);\n\nconst ColorControl: Form.FieldT<Color.Crude> = (props): ReactElement => (\n <Form.Field hideIfNull label=\"Color\" align=\"start\" padHelpText={false} {...props}>\n {({ value, onChange, ...props }) => (\n <Color.Swatch\n value={value ?? Color.ZERO.setAlpha(1).rgba255}\n onChange={(v) => onChange(v.rgba255)}\n {...props}\n />\n )}\n </Form.Field>\n);\n\nexport const ToggleControlForm = ({ path }: { path: string }): ReactElement => {\n const { value, onChange } = Form.useField<\n Omit<Toggle.UseProps, \"aetherKey\"> & { control: ControlStateProps }\n >({ path });\n const sourceP = telem.sourcePipelinePropsZ.parse(value.source?.props);\n const sinkP = telem.sinkPipelinePropsZ.parse(value.sink?.props);\n const source = telem.streamChannelValuePropsZ.parse(\n sourceP.segments.valueStream.props,\n );\n const sink = control.setChannelValuePropsZ.parse(sinkP.segments.setter.props);\n\n const handleSourceChange = (v: channel.Key | null): void => {\n v = v ?? 0;\n const t = telem.sourcePipeline(\"boolean\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"threshold\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: v }),\n threshold: telem.withinBounds({ trueBound: { lower: 0.9, upper: 1.1 } }),\n },\n outlet: \"threshold\",\n });\n onChange({ ...value, source: t });\n };\n\n const handleSinkChange = (v: channel.Key | null): void => {\n v = v ?? 0;\n const t = telem.sinkPipeline(\"boolean\", {\n connections: [\n {\n from: \"setpoint\",\n to: \"setter\",\n },\n ],\n segments: {\n setter: control.setChannelValue({ channel: v }),\n setpoint: telem.setpoint({\n truthy: 1,\n falsy: 0,\n }),\n },\n inlet: \"setpoint\",\n });\n\n const authSource = control.authoritySource({ channel: v });\n\n const controlChipSink = control.acquireChannelControl({\n channel: v,\n authority: 255,\n });\n\n onChange({\n ...value,\n sink: t,\n control: {\n ...value.control,\n showChip: true,\n chip: {\n sink: controlChipSink,\n source: authSource,\n },\n showIndicator: true,\n indicator: {\n statusSource: authSource,\n },\n },\n });\n };\n\n return (\n <FormWrapper direction=\"x\" grow align=\"stretch\">\n <Input.Item label=\"Input Channel\" grow>\n <Channel.SelectSingle\n value={source.channel as number}\n onChange={handleSourceChange}\n />\n </Input.Item>\n <Input.Item label=\"Output Channel\" grow>\n <Channel.SelectSingle value={sink.channel} onChange={handleSinkChange} />\n </Input.Item>\n </FormWrapper>\n );\n};\n\nexport const CommonToggleForm = (): ReactElement => {\n const content: TabRenderProp = useCallback(({ tabKey }) => {\n switch (tabKey) {\n case \"control\":\n return <ToggleControlForm path=\"\" />;\n default: {\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <ColorControl path=\"color\" />\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n }\n }\n }, []);\n\n const props = Tabs.useStatic({ tabs: COMMON_TOGGLE_FORM_TABS, content });\n return <Tabs.Tabs {...props} />;\n};\n\nexport const SolenoidValveForm = (): ReactElement => {\n const content: TabRenderProp = useCallback(({ tabKey }) => {\n switch (tabKey) {\n case \"control\":\n return <ToggleControlForm path=\"\" />;\n default: {\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <Align.Space direction=\"x\">\n <ColorControl path=\"color\" />\n <Form.Field<boolean>\n path=\"normallyOpen\"\n label=\"Normally Open\"\n padHelpText={false}\n >\n {(p) => <Input.Switch {...p} />}\n </Form.Field>\n </Align.Space>\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n }\n }\n }, []);\n\n const props = Tabs.useStatic({ tabs: COMMON_TOGGLE_FORM_TABS, content });\n return <Tabs.Tabs {...props} />;\n};\n\nexport const CommonNonToggleForm = (): ReactElement => {\n return (\n <FormWrapper direction=\"x\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <ColorControl path=\"color\" />\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n};\n\nconst DIMENSIONS_DRAG_SCALE: xy.Crude = { y: 2, x: 0.25 };\nconst DIMENSIONS_BOUNDS: bounds.Bounds = { lower: 0, upper: 2000 };\n\nexport const TankForm = (): ReactElement => {\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <Align.Space direction=\"x\">\n <ColorControl path=\"color\" />\n <Form.Field<number> path=\"dimensions.width\" label=\"Width\" grow>\n {({ value, ...props }) => (\n <Input.Numeric\n value={value ?? 200}\n dragScale={DIMENSIONS_DRAG_SCALE}\n bounds={DIMENSIONS_BOUNDS}\n {...props}\n />\n )}\n </Form.Field>\n <Form.Field<number> path=\"dimensions.height\" label=\"Height\" grow>\n {({ value, ...props }) => (\n <Input.Numeric\n value={value ?? 200}\n dragScale={DIMENSIONS_DRAG_SCALE}\n bounds={DIMENSIONS_BOUNDS}\n {...props}\n />\n )}\n </Form.Field>\n </Align.Space>\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n};\n\nconst VALUE_FORM_TABS: Tabs.Tab[] = [\n {\n tabKey: \"style\",\n name: \"Style\",\n },\n {\n tabKey: \"telemetry\",\n name: \"Telemetry\",\n },\n];\ninterface ValueTelemFormT {\n telem: telem.StringSourceSpec;\n tooltip: string[];\n}\nconst ValueTelemForm = ({ path }: { path: string }): ReactElement => {\n const { value, onChange } = Form.useField<ValueTelemFormT>({ path });\n const sourceP = telem.sourcePipelinePropsZ.parse(value.telem?.props);\n const source = telem.streamChannelValuePropsZ.parse(\n sourceP.segments.valueStream.props,\n );\n const stringifier = telem.stringifyNumberProps.parse(\n sourceP.segments.stringifier.props,\n );\n const rollingAverage = telem.rollingAverageProps.parse(\n sourceP.segments.rollingAverage.props,\n );\n const handleSourceChange = (v: channel.Key | null): void => {\n const t = telem.sourcePipeline(\"string\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"rollingAverage\",\n },\n {\n from: \"rollingAverage\",\n to: \"stringifier\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: v ?? 0 }),\n stringifier: telem.stringifyNumber({\n precision: stringifier.precision ?? 2,\n }),\n rollingAverage: telem.rollingAverage({\n windowSize: rollingAverage.windowSize ?? 1,\n }),\n },\n outlet: \"stringifier\",\n });\n onChange({ ...value, telem: t });\n };\n\n const handlePrecisionChange = (precision: number): void => {\n const t = telem.sourcePipeline(\"string\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"rollingAverage\",\n },\n {\n from: \"rollingAverage\",\n to: \"stringifier\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: source.channel }),\n stringifier: telem.stringifyNumber({ precision }),\n rollingAverage: telem.rollingAverage({ windowSize: rollingAverage.windowSize }),\n },\n outlet: \"stringifier\",\n });\n onChange({ ...value, telem: t });\n };\n\n const handleRollingAverageChange = (windowSize: number): void => {\n const t = telem.sourcePipeline(\"string\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"rollingAverage\",\n },\n {\n from: \"rollingAverage\",\n to: \"stringifier\",\n },\n ],\n segments: {\n stringifier: telem.stringifyNumber({ precision: stringifier.precision ?? 2 }),\n valueStream: telem.streamChannelValue({ channel: source.channel }),\n rollingAverage: telem.rollingAverage({ windowSize }),\n },\n outlet: \"stringifier\",\n });\n onChange({ ...value, telem: t });\n };\n\n const c = Channel.useName(source.channel as number);\n useEffect(() => {\n onChange({ ...value, tooltip: [c] });\n }, [c]);\n\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Input.Item label=\"Input Channel\" grow>\n <Channel.SelectSingle\n value={source.channel as number}\n onChange={handleSourceChange}\n />\n </Input.Item>\n <Input.Item label=\"Precision\" align=\"start\">\n <Input.Numeric\n value={stringifier.precision ?? 2}\n bounds={{ lower: 0, upper: 10 }}\n onChange={handlePrecisionChange}\n />\n </Input.Item>\n <Input.Item label=\"Averaging Window\" align=\"start\">\n <Input.Numeric\n value={rollingAverage.windowSize ?? 1}\n bounds={{ lower: 1, upper: 100 }}\n onChange={handleRollingAverageChange}\n />\n </Input.Item>\n </FormWrapper>\n );\n};\n\nexport const ValueForm = (): ReactElement => {\n const content: TabRenderProp = useCallback(({ tabKey }) => {\n switch (tabKey) {\n case \"telemetry\":\n return <ValueTelemForm path=\"\" />;\n default: {\n return (\n <FormWrapper direction=\"x\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <Align.Space direction=\"x\">\n <ColorControl path=\"color\" />\n <Form.Field<string>\n path=\"units\"\n label=\"Units\"\n align=\"start\"\n padHelpText={false}\n >\n {(p) => <Input.Text {...p} />}\n </Form.Field>\n </Align.Space>\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n }\n }\n }, []);\n const props = Tabs.useStatic({ tabs: VALUE_FORM_TABS, content });\n return <Tabs.Tabs {...props} />;\n};\n\ntype ButtonTelemFormT = Omit<CoreButton.UseProps, \"aetherKey\"> & {\n control: ControlStateProps;\n};\n\nexport const ButtonTelemForm = ({ path }: { path: string }): ReactElement => {\n const { value, onChange } = Form.useField<ButtonTelemFormT>({ path });\n const sinkP = telem.sinkPipelinePropsZ.parse(value.sink?.props);\n const sink = control.setChannelValuePropsZ.parse(sinkP.segments.setter.props);\n\n const handleSinkChange = (v: channel.Key): void => {\n const t = telem.sinkPipeline(\"boolean\", {\n connections: [\n {\n from: \"setpoint\",\n to: \"setter\",\n },\n ],\n segments: {\n setter: control.setChannelValue({ channel: v }),\n setpoint: telem.setpoint({\n truthy: 1,\n falsy: 0,\n }),\n },\n inlet: \"setpoint\",\n });\n\n const authSource = control.authoritySource({ channel: v });\n\n const controlChipSink = control.acquireChannelControl({\n channel: v,\n authority: 255,\n });\n\n onChange({\n ...value,\n sink: t,\n control: {\n ...value.control,\n showChip: true,\n chip: {\n sink: controlChipSink,\n source: authSource,\n },\n showIndicator: true,\n indicator: {\n statusSource: authSource,\n },\n },\n });\n };\n\n return (\n <FormWrapper direction=\"y\">\n <Input.Item label=\"Output Channel\">\n <Channel.SelectSingle value={sink.channel} onChange={handleSinkChange} />\n </Input.Item>\n </FormWrapper>\n );\n};\n\nexport const ButtonForm = (): ReactElement => {\n const content: TabRenderProp = useCallback(({ tabKey }) => {\n switch (tabKey) {\n case \"control\":\n return <ButtonTelemForm path=\"\" />;\n default:\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n }\n }, []);\n\n const props = Tabs.useStatic({ tabs: COMMON_TOGGLE_FORM_TABS, content });\n\n return <Tabs.Tabs {...props} />;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type FC } from \"react\";\n\nimport { z } from \"zod\";\n\nimport { telem } from \"@/telem/aether\";\nimport { control } from \"@/telem/control/aether\";\nimport { type Theming } from \"@/theming\";\nimport {\n CommonToggleForm,\n type SymbolFormProps,\n SolenoidValveForm,\n TankForm,\n CommonNonToggleForm,\n ValueForm,\n ButtonForm,\n} from \"@/vis/schematic/Forms\";\nimport {\n type ThreeWayValveProps,\n type SymbolProps,\n ThreeWayValve,\n ThreeWayValvePreview,\n type ValveProps,\n Valve,\n ValvePreview,\n type SolenoidValveProps,\n SolenoidValve,\n SolenoidValvePreview,\n FourWayValve,\n FourWayValvePreview,\n type AngledValveProps,\n type PumpProps,\n AngledValve,\n Pump,\n Tank,\n ReliefValve,\n ReliefValvePreview,\n TankPreview,\n type ReliefValveProps,\n type TankProps,\n type RegulatorProps,\n RegulatorPreview,\n Regulator,\n BurstDiscPreview,\n Cap,\n CapPreview,\n ManualValvePreview,\n type FilterProps,\n Filter,\n FilterPreview,\n type NeedleValveProps,\n NeedleValvePreview,\n type CheckValveProps,\n CheckValve,\n CheckValvePreview,\n BurstDisc,\n type ManualValveProps,\n ManualValve,\n NeedleValve,\n type OrificeProps,\n Orifice,\n OrificePreview,\n PumpPreview,\n AngledReliefValve,\n AngledValvePreview,\n AngledReliefValvePreview,\n type ValueProps,\n Value,\n ValuePreview,\n type ButtonProps,\n Button,\n ButtonPreview,\n Switch,\n SwitchPreview,\n type SwitchProps,\n} from \"@/vis/schematic/Symbols\";\n\nexport interface Spec<P extends object> {\n key: Variant;\n name: string;\n Form: FC<SymbolFormProps>;\n Symbol: FC<SymbolProps<P>>;\n defaultProps: (t: Theming.Theme) => P;\n Preview: FC<SymbolProps<P>>;\n zIndex: number;\n}\n\nconst Z_INDEX_UPPER = 4;\nconst Z_INDEX_LOWER = 2;\n\nconst VARIANTS = [\n \"threeWayValve\",\n \"valve\",\n \"solenoidValve\",\n \"fourWayValve\",\n \"angledValve\",\n \"pump\",\n \"tank\",\n \"reliefValve\",\n \"regulator\",\n \"burstDisc\",\n \"cap\",\n \"manualValve\",\n \"filter\",\n \"needleValve\",\n \"checkValve\",\n \"orifice\",\n \"angledReliefValve\",\n \"value\",\n \"button\",\n \"switch\",\n] as const;\n\nconst typeZ = z.enum(VARIANTS);\nexport type Variant = z.infer<typeof typeZ>;\n\nconst ZERO_TOGGLE_PROPS = {\n source: telem.sourcePipeline(\"boolean\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"threshold\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: 0 }),\n threshold: telem.withinBounds({ trueBound: { lower: 0.9, upper: 1.1 } }),\n },\n outlet: \"threshold\",\n }),\n sink: telem.sinkPipeline(\"boolean\", {\n connections: [\n {\n from: \"setpoint\",\n to: \"setter\",\n },\n ],\n segments: {\n setter: control.setChannelValue({ channel: 0 }),\n setpoint: telem.setpoint({ truthy: 1, falsy: 0 }),\n },\n inlet: \"setpoint\",\n }),\n};\n\nconst threeWayValve: Spec<ThreeWayValveProps> = {\n name: \"Three Way Valve\",\n key: \"threeWayValve\",\n Form: CommonToggleForm,\n Symbol: ThreeWayValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Three Way Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n ...ZERO_TOGGLE_PROPS,\n orientation: \"left\",\n }),\n Preview: ThreeWayValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst valve: Spec<ValveProps> = {\n name: \"Valve\",\n key: \"valve\",\n Form: CommonToggleForm,\n Symbol: Valve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: ValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst solenoidValve: Spec<SolenoidValveProps> = {\n name: \"Pneumatic Valve\",\n key: \"solenoidValve\",\n Form: SolenoidValveForm,\n Symbol: SolenoidValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Pneumatic Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n normallyOpen: false,\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: SolenoidValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst fourWayValve: Spec<ValveProps> = {\n name: \"Four Way Valve\",\n key: \"fourWayValve\",\n Form: CommonToggleForm,\n Symbol: FourWayValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Four Way Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: FourWayValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst angledValve: Spec<AngledValveProps> = {\n name: \"Angled Valve\",\n key: \"angledValve\",\n Form: CommonToggleForm,\n Symbol: AngledValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Angled Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: AngledValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst pump: Spec<PumpProps> = {\n name: \"Pump\",\n key: \"pump\",\n Form: CommonToggleForm,\n Symbol: Pump,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Pump\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: PumpPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst tank: Spec<TankProps> = {\n name: \"Tank\",\n key: \"tank\",\n Form: TankForm,\n Symbol: Tank,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Tank\",\n level: \"p\",\n orientation: \"top\",\n },\n dimensions: {\n width: 100,\n height: 200,\n },\n orientation: \"left\",\n }),\n Preview: TankPreview,\n zIndex: Z_INDEX_LOWER,\n};\n\nconst reliefValve: Spec<ReliefValveProps> = {\n name: \"Relief Valve\",\n key: \"reliefValve\",\n Form: CommonNonToggleForm,\n Symbol: ReliefValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Relief Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: ReliefValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst regulator: Spec<RegulatorProps> = {\n name: \"Regulator\",\n key: \"regulator\",\n Form: CommonNonToggleForm,\n Symbol: Regulator,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Regulator\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: RegulatorPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst burstDisc: Spec<ReliefValveProps> = {\n name: \"Burst Disc\",\n key: \"burstDisc\",\n Form: CommonNonToggleForm,\n Symbol: BurstDisc,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Burst Disc\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: BurstDiscPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst cap: Spec<ReliefValveProps> = {\n name: \"Cap\",\n key: \"cap\",\n Form: CommonNonToggleForm,\n Symbol: Cap,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Cap\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: CapPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst manualValve: Spec<ManualValveProps> = {\n name: \"Manual Valve\",\n key: \"manualValve\",\n Form: CommonNonToggleForm,\n Symbol: ManualValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Manual Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: ManualValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst filter: Spec<FilterProps> = {\n name: \"Filter\",\n key: \"filter\",\n Form: CommonNonToggleForm,\n Symbol: Filter,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Filter\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: FilterPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst needleValve: Spec<NeedleValveProps> = {\n name: \"Needle Valve\",\n key: \"needleValve\",\n Form: CommonNonToggleForm,\n Symbol: NeedleValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Needle Valve\",\n level: \"p\",\n },\n orientation: \"left\",\n }),\n Preview: NeedleValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst checkValve: Spec<CheckValveProps> = {\n name: \"Check Valve\",\n key: \"checkValve\",\n Form: CommonNonToggleForm,\n Symbol: CheckValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Check Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: CheckValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst orifice: Spec<OrificeProps> = {\n name: \"Orifice\",\n key: \"orifice\",\n Form: CommonNonToggleForm,\n Symbol: Orifice,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Orifice\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: OrificePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst angledReliefValve: Spec<ReliefValveProps> = {\n name: \"Angled Relief Valve\",\n key: \"angledReliefValve\",\n Form: CommonNonToggleForm,\n Symbol: AngledReliefValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Angled Relief Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: AngledReliefValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst value: Spec<ValueProps> = {\n name: \"Value\",\n key: \"value\",\n Form: ValueForm,\n Symbol: Value,\n Preview: ValuePreview,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n units: \"psi\",\n level: \"h5\",\n label: {\n label: \"Value\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n telem: telem.sourcePipeline(\"string\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"rollingAverage\",\n },\n {\n from: \"rollingAverage\",\n to: \"stringifier\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: 0 }),\n stringifier: telem.stringifyNumber({ precision: 2 }),\n rollingAverage: telem.rollingAverage({ windowSize: 1 }),\n },\n outlet: \"stringifier\",\n }),\n }),\n zIndex: Z_INDEX_UPPER,\n};\n\nconst button: Spec<ButtonProps> = {\n name: \"Button\",\n key: \"button\",\n Symbol: Button,\n Form: ButtonForm,\n Preview: ButtonPreview,\n defaultProps: (t) => ({\n label: {\n label: \"Button\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n sink: telem.sinkPipeline(\"boolean\", {\n connections: [\n {\n from: \"setpoint\",\n to: \"setter\",\n },\n ],\n segments: {\n setter: control.setChannelValue({ channel: 0 }),\n setpoint: telem.setpoint({ truthy: 1, falsy: 0 }),\n },\n inlet: \"setpoint\",\n }),\n }),\n zIndex: Z_INDEX_UPPER,\n};\n\nconst switch_: Spec<SwitchProps> = {\n name: \"Switch\",\n key: \"switch\",\n Symbol: Switch,\n Preview: SwitchPreview,\n Form: CommonToggleForm,\n defaultProps: (t) => ({\n label: {\n label: \"Switch\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n zIndex: Z_INDEX_UPPER,\n};\n\nexport const SYMBOLS: Record<Variant, Spec<any>> = {\n value,\n threeWayValve,\n valve,\n solenoidValve,\n fourWayValve,\n angledValve,\n pump,\n tank,\n reliefValve,\n regulator,\n burstDisc,\n cap,\n manualValve,\n filter,\n needleValve,\n checkValve,\n orifice,\n angledReliefValve,\n button,\n switch: switch_,\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useContext,\n useEffect,\n} from \"react\";\n\nimport { Instrumentation } from \"@synnaxlabs/alamos\";\n\nimport { Aether } from \"@/aether\";\nimport { alamos } from \"@/alamos/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\n\nexport interface ContextValue {\n instrumentation: Instrumentation;\n}\n\nconst Context = createContext<ContextValue>({\n instrumentation: Instrumentation.NOOP,\n});\n\nexport interface ProviderProps extends PropsWithChildren, alamos.ProviderState {}\n\nexport const useInstrumentation = (): Instrumentation =>\n useContext(Context).instrumentation;\n\nexport const Provider = Aether.wrap<ProviderProps>(\n alamos.Provider.TYPE,\n ({ aetherKey, children, ...props }): ReactElement => {\n const memoProps = useMemoDeepEqualProps(props);\n const [{ path }, , setState] = Aether.use({\n aetherKey,\n type: alamos.Provider.TYPE,\n schema: alamos.providerStateZ,\n initialState: memoProps,\n });\n\n useEffect(() => {\n setState(memoProps);\n }, [memoProps, setState]);\n\n return <Aether.Composite path={path}>{children}</Aether.Composite>;\n },\n);\n","export default \"data:video/mp2t;base64,Ly8gQ29weXJpZ2h0IDIwMjMgU3lubmF4IExhYnMsIEluYy4KLy8KLy8gVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIGluY2x1ZGVkIGluIHRoZSBmaWxlCi8vIGxpY2Vuc2VzL0JTTC50eHQuCi8vCi8vIEFzIG9mIHRoZSBDaGFuZ2UgRGF0ZSBzcGVjaWZpZWQgaW4gdGhhdCBmaWxlLCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIEJ1c2luZXNzIFNvdXJjZQovLyBMaWNlbnNlLCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSB3aWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsCi8vIGluY2x1ZGVkIGluIHRoZSBmaWxlIGxpY2Vuc2VzL0FQTC50eHQuCgppbXBvcnQgeyBwbHV0byB9IGZyb20gIkAvcGx1dG8vYWV0aGVyIjsKCnBsdXRvLnJlbmRlcigpOwo=\"","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type PropsWithChildren, type ReactElement } from \"react\";\n\nimport { Aether } from \"@/aether\";\nimport { telem } from \"@/telem/aether\";\n\nexport interface ProviderProps extends PropsWithChildren<any> {}\n\nexport const Provider = Aether.wrap<ProviderProps>(\n telem.BaseProvider.TYPE,\n ({ children, aetherKey }): ReactElement | null => {\n const [{ path }] = Aether.use({\n aetherKey,\n type: telem.BaseProvider.TYPE,\n schema: telem.providerStateZ,\n initialState: {},\n });\n return <Aether.Composite path={path}>{children}</Aether.Composite>;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { FC, type PropsWithChildren, type ReactElement } from \"react\";\n\nimport { Aether } from \"@/aether\";\nimport { Alamos } from \"@/alamos\";\nimport { Channel } from \"@/channel\";\nimport { Haul } from \"@/haul\";\nimport DefaultWorkerURL from \"@/pluto/defaultWorker.ts?url\";\nimport { Status } from \"@/status\";\nimport { Synnax } from \"@/synnax\";\nimport { Telem } from \"@/telem\";\nimport { Control } from \"@/telem/control\";\nimport { Theming } from \"@/theming\";\nimport { Tooltip } from \"@/tooltip\";\nimport { Triggers } from \"@/triggers\";\nimport { Worker } from \"@/worker\";\n\n// // @ts-expect-error - unable to resolve valid vite import\n// // eslint-disable-next-line import/no-unresolved\n\nimport \"@synnaxlabs/media/dist/style.css\";\n\ntype CanDisabledProps<T extends PropsWithChildren> = T & { disabled?: boolean };\n\nconst canDisable =\n <T extends PropsWithChildren>(C: FC<T>): FC<CanDisabledProps<T>> =>\n ({ disabled = false, ...props }) =>\n disabled ? props.children : <C {...(props as T)} />;\n\nconst CanDisableTelem = canDisable<Telem.ProviderProps>(Telem.Provider);\nconst CanDisableAether = canDisable<Aether.ProviderProps>(Aether.Provider);\n\nexport interface ProviderProps\n extends PropsWithChildren, Synnax.ProviderProps {\n theming?: Theming.ProviderProps,\n workerEnabled?: boolean;\n workerURL?: URL | string;\n alamos?: Alamos.ProviderProps;\n tooltip?: Tooltip.ConfigProps;\n triggers?: Triggers.ProviderProps;\n haul?: Haul.ProviderProps;\n channelAlias?: Channel.AliasProviderProps;\n telem?: CanDisabledProps<Telem.ProviderProps>;\n}\n\nexport const Provider = ({\n children,\n connParams,\n workerEnabled = true,\n workerURL,\n theming,\n tooltip,\n triggers,\n alamos,\n haul,\n channelAlias,\n telem,\n}: ProviderProps): ReactElement => {\n return (\n <Triggers.Provider {...triggers}>\n <Tooltip.Config {...tooltip}>\n <Haul.Provider {...haul}>\n <Worker.Provider url={workerURL ?? DefaultWorkerURL} enabled={workerEnabled}>\n <CanDisableAether workerKey=\"vis\">\n <Alamos.Provider {...alamos}>\n <Status.Aggregator>\n <Synnax.Provider connParams={connParams}>\n <Channel.AliasProvider {...channelAlias}>\n <CanDisableTelem {...telem}>\n <Theming.Provider {...theming}>\n <Control.StateProvider>{children}</Control.StateProvider>\n </Theming.Provider>\n </CanDisableTelem>\n </Channel.AliasProvider>\n </Synnax.Provider>\n </Status.Aggregator>\n </Alamos.Provider>\n </CanDisableAether>\n </Worker.Provider>\n </Haul.Provider>\n </Tooltip.Config>\n </Triggers.Provider>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { type CrudeTimeRange, TimeStamp, TimeSpan } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { Text } from \"@/text\";\n\nimport \"@/ranger/TimeRangeChip.css\";\n\nexport interface TimeRangeChipProps {\n timeRange: CrudeTimeRange;\n}\n\nexport const TimeRangeChip = ({ timeRange }: TimeRangeChipProps): ReactElement => {\n const startTS = new TimeStamp(timeRange.start);\n const startFormat = startTS.isToday ? \"time\" : \"dateTime\";\n const endTS = new TimeStamp(timeRange.end);\n const isOpen = endTS.equals(TimeStamp.MAX);\n const endFormat = endTS.span(startTS) < TimeSpan.DAY ? \"time\" : \"dateTime\";\n\n return (\n <Align.Space\n direction=\"x\"\n size=\"small\"\n className={CSS(CSS.B(\"time-range-chip\"))}\n align=\"center\"\n >\n {startTS.isToday && (\n <Text.Text level=\"p\" shade={7} weight={450}>\n Today\n </Text.Text>\n )}\n <Text.DateTime\n level=\"p\"\n displayTZ=\"local\"\n format={startFormat}\n shade={7}\n weight={450}\n >\n {startTS}\n </Text.DateTime>\n <Icon.Arrow.Right color=\"var(--pluto-text-color)\" />\n {isOpen ? (\n <Text.Text level=\"p\">Now</Text.Text>\n ) : (\n <Text.DateTime\n level=\"p\"\n displayTZ=\"local\"\n format={endFormat}\n shade={7}\n weight={450}\n >\n {endTS}\n </Text.DateTime>\n )}\n </Align.Space>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { type label } from \"@synnaxlabs/client\";\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { type List } from \"@/list\";\nimport { Select } from \"@/select\";\nimport { Synnax } from \"@/synnax\";\nimport { Tag } from \"@/tag\";\n\nconst labelColumns: Array<List.ColumnSpec<label.Key, label.Label>> = [\n {\n key: \"color\",\n name: \"Color\",\n width: 50,\n render: (v) => (\n <Icon.Circle\n style={{ fontSize: 10, marginLeft: 10, marginRight: 30 }}\n color={v.entry.color}\n />\n ),\n },\n {\n key: \"name\",\n name: \"Name\",\n },\n];\n\nexport interface SelectLabelsProps\n extends Omit<Select.MultipleProps<label.Key, label.Label>, \"columns\" | \"searcher\"> {}\n\nexport const SelectLabels = (props: SelectLabelsProps): ReactElement => {\n const client = Synnax.use();\n return (\n <Select.Multiple\n {...props}\n searcher={client?.labels}\n columns={labelColumns}\n renderTag={(v) => {\n if (v.entry == null) return <Tag.Tag color=\"gray\">{v.entryKey}</Tag.Tag>;\n return <Tag.Tag color={v.entry.color}>{v.entry.name}</Tag.Tag>;\n }}\n />\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { CSS } from \"@/css\";\n\nimport \"@/progress/Progress.css\";\n\ninterface ProgressProps {\n value: number;\n}\n\nexport const Progress = ({ value }: ProgressProps): ReactElement => {\n return (\n <div className={CSS.B(\"progress\")}>\n <div className={CSS.B(\"progress-bar\")} style={{ width: `${value}%` }} />\n </div>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { Fragment, type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { type Input } from \"@/input\";\n\nexport interface Step {\n key: string;\n title: string;\n}\n\nexport interface StepsProps\n extends Omit<Align.SpaceProps, \"children\" | \"onChange\">,\n Input.Control<string> {\n steps: Step[];\n}\n\nexport const Steps = ({\n steps,\n value,\n onChange,\n ...props\n}: StepsProps): ReactElement => {\n const selectedIdx = steps.findIndex((step) => step.key === value);\n return (\n <Align.Space direction=\"x\" align=\"center\" className={CSS.B(\"steps\")} {...props}>\n {steps.map((step, i) => (\n <Fragment key={step.key}>\n <Button.Button\n onClick={() => onChange(step.key)}\n key={step.key}\n variant=\"outlined\"\n disabled={i > selectedIdx}\n >\n {i + 1}. {step.title}\n </Button.Button>\n {i !== steps.length - 1 && (\n <Icon.Arrow.Right\n style={{ fontSize: \"15px\", color: \"var(--pluto-gray-l8)\" }}\n />\n )}\n </Fragment>\n ))}\n </Align.Space>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { type device } from \"@synnaxlabs/client\";\nimport { type AsyncTermSearcher } from \"@synnaxlabs/x\";\n\nimport { type List } from \"@/list\";\nimport { Select } from \"@/select\";\nimport { Synnax } from \"@/synnax\";\n\nconst deviceColumns: Array<List.ColumnSpec<device.DeviceKey, device.Device>> = [\n {\n key: \"name\",\n name: \"Name\",\n },\n {\n key: \"location\",\n name: \"Location\",\n },\n];\n\nexport interface SelectSingleProps\n extends Omit<Select.SingleProps<device.DeviceKey, device.Device>, \"columns\"> {\n searchOptions?: device.RetrieveOptions;\n}\n\nexport const SelectSingle = ({\n searchOptions,\n ...props\n}: SelectSingleProps): ReactElement => {\n const client = Synnax.use();\n let searcher: AsyncTermSearcher<string, device.DeviceKey, device.Device> | undefined =\n client?.hardware.devices;\n if (searchOptions != null && client != null)\n searcher = client.hardware.devices.newSearcherWithOptions(searchOptions);\n return (\n <Select.Single<device.DeviceKey, device.Device>\n columns={deviceColumns}\n searcher={searcher}\n entryRenderKey={\"name\"}\n {...props}\n />\n );\n};\n"],"names":["Circle","jsx","Icon","jsxs","Align.Space","Text.Text","Text.DateTime","Button.Icon","toArray","a","i","Button.Button","e","Core","location","direction","box","Multiple","v","math","p","f","xy","mouseKey","Triggers.mouseKey","Single","clamp","Resize.useMultiple","Resize.Multiple","Fragment","Header.Header","Header.ButtonTitle","Header.Actions","value","state.usePurePassthrough","s","scale","Color.Swatch","c","Text.MaybeEditable","runtime","Aether.wrap","canvas.Canvas","Aether.use","canvas.canvasStateZ","handleResize","bootstrapped","Aether.Composite","canvas","BackgroundVariant","dimensions","React","Background","shallow","Background$1","Context","useContext","reactUseContext","deep","LinePlot","lineplot.LinePlot","lineplot.linePlotStateZ","_","Canvas.useRegion","grid","k","hold","Legend","Core.Simple","Line","line.Line","line.stateZ","Core.Line","Theming.useTypography","D","use","Triggers.flattenConfig","Triggers.compareModeConfigs","Triggers.determineMode","next","Triggers.useHeldRef","Triggers.useDrag","Triggers.use","Color.cssString","Text.WithIcon","Text.ComponentSizeLevels","Dropdown.use","compare","CoreList.Search","CoreList.Filter","onChange","CoreList.useSelectionUtils","Input.Text","Tag.Tag","convertRenderV","primitiveIsZero","DATA","CoreButton.Icon","Button","TelemDataType","caseconv","Tooltip","Triggers.Text","Select.Button","props","Core.use","Core.Mask","lineplot.XAxis","lineplot.YAxis","useMemoDeepEqual","state","Text.dimensions","labelSize","XAxis","YAxis","tooltip.Tooltip","tooltip.tooltipStateZ","measure.Measure","measure.measureStateZ","LinePlot.useViewport","rule.Rule","rule.ruleStateZ","bounds","Text.Editable","range.Annotation","range.annotationStateZ","Provider","range.Provider","range.providerStateZ","Menu.useContextMenu","Menu.ContextMenu","canDrop","Haul.canDropOfType","loc","Core.LinePlot","Core.Legend","Core.Title","Core.Viewport","Tooltip.Tooltip","Measure.Measure","Haul.useDrop","Haul.filterByType","key","Core.XAxis","Haul.useDraggingState","Rule.Rule","Range.Provider","y","Core.YAxis","telem.streamChannelData","telem.channelData","synnax.ZERO_CONTEXT_VALUE","synnax.Provider","Status.useAggregator","Synnax","TimeSpan","n","Synnax.use","aliases","h","filter","Status.Text","Haul.useDragAndDrop","unique","Select.Multiple","SelectSingle","nullToArr","Select.Single","Tabs.resetSelection","Tabs.rename","Portal.Node","_a","Portal.In","size","Haul.Provider","Tabs.Tabs","Portal.Out","eraser.Eraser","eraser.eraserStateZ","Eraser.use","Resize.Single","Align.Pack","Controls","stump","connector.buildNew","connector.segmentsToPoints","connector.moveSourceNode","connector.checkIntegrity","connector.moveTargetNode","connector.dragSegment","diagram.Diagram","diagram.diagramStateZ","Theming.use","CoreViewport.DEFAULT_TRIGGERS","prev","useRFOnViewportChange","renderer","rfApplyNodeChanges","rfApplyEdgeChanges","rfAddEdge","EdgeComponent","Triggers.purgeMouse","RFBackground","Button.ToggleIcon","Value","text.levelZ","control.Controller","control.controllerStateZ","control.StateProvider","control.stateProviderStateZ","control.Indicator","TimeStamp","control.indicatorStateZ","Color.Color","Tooltip.Dialog","_b","clientControl","control.Chip","control.chipStateZ","control.Legend","control.legendStateZ","s2","UnexpectedError","button.Button","button.buttonStateZ","RFPosition","RFHandle","FourWayValve","ThreeWayValve","Valve","SolenoidValve","ReliefValve","CheckValve","AngledValve","Pump","BurstDisc","Cap","ManualValve","Filter","Tank","Regulator","Orifice","NeedleValve","AngledReliefValve","Switch","Input.Switch","CoreButton.Button","toggle.Toggle","toggle.toggleStateZ","Control.Chip","Control.Indicator","Toggle.use","Primitives.ThreeWayValve","Primitives.Valve","Primitives.SolenoidValve","Primitives.FourWayValve","Primitives.AngledValve","Primitives.Pump","Primitives.Tank","Primitives.ReliefValve","Primitives.Regulator","Primitives.BurstDisc","Primitives.Cap","Primitives.ManualValve","Primitives.Filter","Primitives.NeedleValve","Primitives.CheckValve","Primitives.Orifice","Primitives.AngledReliefValve","label","CoreValue.use","Primitives.Value","Primitives.Switch","CoreButton.use","Primitives.Button","l","u","shallowCopy","Input.Item","Input.Numeric","Select.DropdownButton","schema","zodutil","Form.Field","Text.SelectLevel","Color.ZERO","Form.useField","telem.sourcePipelinePropsZ","telem.sinkPipelinePropsZ","telem.streamChannelValuePropsZ","control.setChannelValuePropsZ","telem.sourcePipeline","telem.streamChannelValue","telem.withinBounds","telem.sinkPipeline","control.setChannelValue","telem.setpoint","control.authoritySource","control.acquireChannelControl","Channel.SelectSingle","Tabs.useStatic","telem.stringifyNumberProps","rollingAverage","telem.rollingAverageProps","telem.stringifyNumber","telem.rollingAverage","Channel.useName","Instrumentation","alamos.Provider","alamos.providerStateZ","telem.BaseProvider","telem.providerStateZ","Telem.Provider","Aether.Provider","Triggers.Provider","Tooltip.Config","Worker.Provider","Alamos.Provider","Status.Aggregator","Synnax.Provider","Channel.AliasProvider","Theming.Provider","Control.StateProvider"],"mappings":"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","x_google_ignoreList":[12]}
1
+ {"version":3,"file":"index.js","sources":["../src/status/Circle.tsx","../src/status/Notification.tsx","../src/util/event.ts","../src/resize/Core.tsx","../src/resize/Multiple.tsx","../src/hooks/useCursorDrag/useCursorDrag.tsx","../src/resize/Single.tsx","../src/accordion/Accordion.tsx","../src/channel/types.ts","../src/vis/legend/Container.tsx","../src/vis/legend/Simple.tsx","../src/vis/canvas/Canvas.tsx","../../node_modules/.pnpm/@reactflow+background@11.3.12_@types+react@18.3.2_react-dom@18.3.1_react@18.3.1/node_modules/@reactflow/background/dist/esm/index.mjs","../src/vis/lineplot/LinePlot.tsx","../src/vis/lineplot/Legend.tsx","../src/vis/line/Line.tsx","../src/vis/lineplot/Line.tsx","../src/vis/lineplot/Title.tsx","../src/viewport/Mask.tsx","../src/viewport/use.ts","../src/select/ClearButton.tsx","../src/tag/Tag.tsx","../src/select/Multiple.tsx","../src/select/Single.tsx","../src/select/Direction.tsx","../src/select/DataType.tsx","../src/viewport/SelectMode.tsx","../src/vis/lineplot/Viewport.tsx","../src/vis/lineplot/Axis.tsx","../src/vis/lineplot/tooltip/Tooltip.tsx","../src/vis/measure/Measure.tsx","../src/vis/rule/Rule.tsx","../src/vis/lineplot/range/Annotation.tsx","../src/vis/lineplot/range/Provider.tsx","../src/channel/LinePlot.tsx","../src/synnax/Provider.tsx","../src/channel/AliasProvider.tsx","../src/channel/Select.tsx","../src/note/Note.tsx","../src/mosaic/tree.ts","../src/portal/Portal.tsx","../src/mosaic/Mosaic.tsx","../src/mosaic/use.tsx","../src/vis/eraser/use.tsx","../src/nav/Drawer.tsx","../src/nav/Bar.tsx","../src/os/Controls/Mac.tsx","../src/os/Controls/Windows.tsx","../src/os/use.ts","../src/os/Controls/Controls.tsx","../src/vis/diagram/edge/connector/connector.ts","../src/vis/diagram/util.ts","../src/vis/diagram/edge/Edge.tsx","../src/vis/diagram/Diagram.tsx","../src/vis/diagram/align.ts","../src/vis/value/use.ts","../src/telem/control/Controller.tsx","../src/telem/control/StateProvider.tsx","../src/telem/control/Indicator.tsx","../src/telem/control/Chip.tsx","../src/telem/control/Legend.tsx","../src/vis/button/use.ts","../src/vis/schematic/Labeled.tsx","../src/vis/schematic/primitives/Primitives.tsx","../src/vis/toggle/use.ts","../src/vis/schematic/Symbols.tsx","../../x/ts/dist/zodutil.js","../src/form/Form.tsx","../src/vis/schematic/SelectOrientation.tsx","../src/vis/schematic/Forms.tsx","../src/vis/schematic/registry.ts","../src/alamos/Provider.tsx","../src/pluto/defaultWorker.ts?url","../src/telem/Provider.tsx","../src/pluto/Pluto.tsx","../src/ranger/TimeRangeChip.tsx","../src/ranger/SelectLabel.tsx","../src/progress/Progress.tsx","../src/steps/Steps.tsx","../src/hardware/device/Select.tsx"],"sourcesContent":["// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon, type IconProps } from \"@synnaxlabs/media\";\n\nimport { type status } from \"@/status/aether\";\nimport { variantColors } from \"@/status/colors\";\n\nexport interface CircleProps extends IconProps {\n variant: status.Variant;\n}\n\nexport const Circle = ({ variant, ...props }: CircleProps): ReactElement => {\n return <Icon.Circle color={variantColors[variant]} {...props} />;\n};\n","import { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { NotificationSpec } from \"@/status/Aggregator\";\nimport { Circle } from \"@/status/Circle\";\nimport { Text } from \"@/text\";\nimport { Icon } from \"@synnaxlabs/media\";\nimport { toArray } from \"@synnaxlabs/x\";\nimport { ReactElement, isValidElement } from \"react\";\n\nimport \"@/status/Notification.css\";\n\nexport interface NotificationProps extends Align.SpaceProps {\n status: NotificationSpec;\n silence: (key: string) => void;\n actions?: ReactElement | Button.ButtonProps[];\n}\n\nexport const Notification = ({\n status: { key, time, count, message, description, variant },\n silence,\n actions,\n className,\n ...props\n}: NotificationProps): ReactElement => {\n return (\n <Align.Space\n className={CSS(CSS.B(\"notification\"), className)}\n direction=\"y\"\n key={time.toString()}\n empty\n {...props}\n >\n <Align.Space direction=\"x\" justify=\"spaceBetween\" grow style={{ width: \"100%\" }}>\n <Align.Space direction=\"x\" align=\"center\" size=\"small\">\n <Circle style={{ height: \"2.25rem\", width: \"2.5rem\" }} variant={variant} />\n <Text.Text level=\"small\" shade={7}>\n {`x${count}`}\n </Text.Text>\n <Text.DateTime\n className={CSS(CSS.BE(\"notification\", \"time\"))}\n level=\"small\"\n format=\"time\"\n >\n {time}\n </Text.DateTime>\n </Align.Space>\n <Button.Icon\n className={CSS(CSS.BE(\"notification\", \"silence\"))}\n variant=\"outlined\"\n size=\"small\"\n onClick={() => silence(key)}\n >\n <Icon.Close />\n </Button.Icon>\n </Align.Space>\n <Align.Space\n direction=\"y\"\n align=\"start\"\n className={CSS(CSS.BE(\"notification\", \"content\"))}\n size=\"small\"\n >\n <Text.Text\n className={CSS(CSS.BE(\"notification\", \"message\"))}\n level=\"p\"\n style={{ flexGrow: 1 }}\n >\n {message}\n </Text.Text>\n {description != null && (\n <Text.Text\n className={CSS(CSS.BE(\"notification\", \"description\"))}\n level=\"small\"\n style={{ flexGrow: 1 }}\n >\n {description}\n </Text.Text>\n )}\n </Align.Space>\n {actions != null && (\n <Align.Space\n direction=\"x\"\n align=\"center\"\n justify=\"end\"\n className={CSS(CSS.BE(\"notification\", \"actions\"))}\n >\n {toArray<ReactElement | Button.ButtonProps>(actions).map((a, i) => (\n <Action key={a.key} action={a} />\n ))}\n </Align.Space>\n )}\n </Align.Space>\n );\n};\n\ninterface ActionProps {\n action: ReactElement | Button.ButtonProps;\n}\n\nconst Action = ({ action }: ActionProps): ReactElement => {\n if (!isValidElement(action)) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n const props = action as Button.ButtonProps;\n return <Button.Button {...props} />;\n }\n return action;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nexport const preventDefault = (e: { preventDefault: () => void }): void =>\n e.preventDefault();\n\nexport const stopPropagation = (e: { stopPropagation: () => void }): void =>\n e.stopPropagation();\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n forwardRef,\n type DetailedHTMLProps,\n type HTMLAttributes,\n type ReactElement,\n} from \"react\";\n\nimport { direction, location } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { preventDefault } from \"@/util/event\";\n\nimport \"@/resize/Core.css\";\n\nexport interface CoreProps\n extends DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement> {\n location: location.Crude;\n size: number;\n onDragStart: (e: React.DragEvent<HTMLDivElement>) => void;\n sizeUnits?: \"px\" | \"%\";\n showHandle?: boolean;\n}\n\nexport const Core = forwardRef<HTMLDivElement, CoreProps>(\n (\n {\n location: cloc,\n style,\n size,\n className,\n children,\n onDragStart,\n sizeUnits = \"px\",\n showHandle = true,\n ...props\n }: CoreProps,\n ref,\n ): ReactElement => {\n const loc_ = location.construct(cloc);\n const dir = location.direction(loc_);\n const dim = direction.dimension(dir);\n return (\n <div\n className={CSS(CSS.B(\"resize\"), CSS.loc(loc_), CSS.dir(dir), className)}\n style={{ [dim]: `${size}${sizeUnits}`, ...style }}\n ref={ref}\n {...props}\n >\n {children}\n {showHandle && (\n <div\n draggable\n className={CSS(\n CSS.BE(\"resize\", \"handle\"),\n CSS.bordered(location.swap(loc_)),\n )}\n onDragStart={onDragStart}\n onDrag={preventDefault}\n onDragEnd={preventDefault}\n />\n )}\n </div>\n );\n },\n);\n\nCore.displayName = \"Resize.Core\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n Children,\n type ForwardedRef,\n forwardRef,\n useCallback,\n useState,\n useEffect,\n useRef,\n type RefObject,\n} from \"react\";\n\nimport { box, direction, type xy, math } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { Core } from \"@/resize/Core\";\n\nimport \"@/resize/Multiple.css\";\n\n/** Props for the {@link Resize.Multiple} component. */\nexport interface MultipleProps extends Align.SpaceProps {\n sizeDistribution: number[];\n onDragHandle: (e: ResizeStartEvent, i: number) => void;\n}\n\nexport type ResizeStartEvent = xy.Client & { preventDefault: () => void };\n\n/** Props for the {@link Resize.useMultiple} hook. */\nexport interface UseMultipleProps {\n count: number;\n onResize?: (sizes: number[]) => void;\n direction?: direction.Crude;\n initialSizes?: number[];\n minSize?: number;\n}\n\n/** Return value of the {@link Resize.useMultiple} hook. */\nexport interface UseMultipleReturn {\n setSize: (i: number, size?: number) => void;\n props: Pick<MultipleProps, \"sizeDistribution\" | \"onDragHandle\" | \"direction\"> & {\n ref: RefObject<HTMLDivElement>;\n };\n}\n\ninterface MultipleState {\n sizeDistribution: number[];\n root: number | null;\n}\n\n/**\n * A hook that implements the control logic for {@link Resize.Multiple}. This hook\n * should be used in conjunction with {@link Resize.Multiple}.\n *\n * @param props - The a component props.\n * @param props.count - The number of panels to render. This should be the same as the\n * number of children passed to {@link Resize.Multiple}.\n * @param props.onResize - A callback executed when the panels are resized.\n * @param props.initialSizes - The initial sizes of the panels. This should be an array of\n * numbers, where each number is the initial size of the corresponding panel either in pixels\n * or as a decimal percentage. If this array is not provided (or is shorter than the expected length),\n * the (remaining) panels will be evenly distributed across the container.\n * @param props.direction - The direction in which the panels should be draggable. This should\n * be Default: \"x\"\n * @param props.minSize - The smallest size the panels can be resized to. Defaults to 100.\n *\n * @returns The props that should be passed to {@link Resize.Multiple} along with a few\n * utility functions. setSize can be used to manually set the size of a particular panel.\n */\nexport const useMultiple = ({\n onResize,\n count,\n initialSizes = [],\n minSize = 100,\n direction = \"x\",\n}: UseMultipleProps): UseMultipleReturn => {\n const ref = useRef<HTMLDivElement>(null);\n const [state, setState] = useState<MultipleState>({\n sizeDistribution: calculateInitialSizeDistribution(initialSizes, count),\n root: null,\n });\n\n const _handleResize = useCallback(\n (dragging: number, clientPos?: number, targetSize?: number) => {\n if (ref.current == null) return;\n const parentSize = box.dim(box.construct(ref.current), direction);\n setState((prev) =>\n handleResize(prev, parentSize, dragging, minSize, clientPos, targetSize),\n );\n },\n [minSize, setState, direction],\n );\n\n useEffect(\n () => onResize?.(state.sizeDistribution),\n [state.sizeDistribution, onResize],\n );\n\n const handleDragHandle = useCallback(\n (e: ResizeStartEvent, dragging: number): void => {\n e.preventDefault();\n const dim = direction === \"x\" ? \"clientX\" : \"clientY\";\n const handleMouseMove = (e: MouseEvent): void => _handleResize(dragging, e[dim]);\n const handleMouseUp = (): void => {\n setState((prev) => ({ ...prev, root: null }));\n document.removeEventListener(\"mousemove\", handleMouseMove);\n };\n setState((prev) => ({ ...prev, root: e[dim] }));\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp, { once: true });\n },\n [setState, direction, handleResize],\n );\n\n const setSize = useCallback(\n (i: number, size?: number) => _handleResize(i, undefined, size),\n [handleResize],\n );\n\n return {\n setSize,\n props: {\n direction,\n sizeDistribution: state.sizeDistribution,\n onDragHandle: handleDragHandle,\n ref,\n },\n };\n};\n\n/**\n * A set of panels that can be resized within their container. Resize.Multiple must be\n * used in conjunction with {@link Resize.useMultiple}.\n *\n * @param props - The component props. All unused props will be passed to the div\n * containing the div containing the panels. Generally these props should not be provided\n * directly, and you should instead spread the props returned from {@link Resize.useMultiple}.\n * The only exceptions to this are stylistic props (e.g. className, style, etc.) as well\n * as the `children` prop.\n */\nexport const Multiple = forwardRef(\n (\n {\n direction: direction_ = \"x\",\n children: _children,\n sizeDistribution,\n onDragHandle: onDrag,\n className,\n ...props\n }: MultipleProps,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n const dir = direction.construct(direction_);\n const children = Children.toArray(_children);\n\n /**\n * You may be wondering, why on earth are we doing this? Well, the answer is that\n * if you're moving elements within the resize multiple, and the sizes are all the\n * same, any resize observers will not trigger. The slight offset ensures that if\n * a re-ordering occurs, the resize observers will trigger and everything will\n * be in sync.\n */\n sizeDistribution = slightlyOffsetEvenDistribution(sizeDistribution);\n\n return (\n <Align.Space\n {...props}\n ref={ref}\n direction={dir}\n className={CSS(CSS.B(\"resize-multiple\"), className)}\n empty\n grow\n >\n {children.map((child, i) => (\n <Core\n onDragStart={(e) => onDrag(e, i)}\n key={i}\n location={direction.location(dir)}\n size={sizeDistribution[i] * 100}\n sizeUnits=\"%\"\n showHandle={i !== children.length - 1}\n >\n {child}\n </Core>\n ))}\n </Align.Space>\n );\n },\n);\nMultiple.displayName = \"Resize.Multiple\";\n\nconst calculateInitialSizeDistribution = (\n initial: number[],\n count: number,\n): number[] => {\n const total = initial.reduce((a, b) => a + b, 0);\n const gap = count - initial.length;\n if (gap <= 0) return initial.slice(0, count).map((v) => v / total);\n if (initial.every((v) => v <= 1)) {\n const remaining = 1 - total;\n return [...initial, ...Array(gap).fill(remaining / gap)];\n }\n return initial.map(() => 1 / count);\n};\n\nconst DELTA = 0.001;\n\nconst slightlyOffsetEvenDistribution = (sizes: number[]): number[] => {\n if (sizes.every((v) => math.closeTo(v, 1 / sizes.length), DELTA))\n return sizes.map((v, i) => {\n if (i % 2 === 0) return v + DELTA;\n if (i === sizes.length - 1) return v;\n return v - DELTA;\n });\n return sizes;\n};\n\nconst handleResize = (\n prev: MultipleState,\n parentSize: number,\n dragging: number,\n minSize: number,\n clientPos?: number,\n targetSize?: number,\n): MultipleState => {\n const diffPercentage = calculateDiffPercentage(\n prev,\n parentSize,\n dragging,\n clientPos,\n targetSize,\n );\n let [sizeDistribution, changed] = resizeWithSibling(\n prev.sizeDistribution,\n dragging,\n diffPercentage,\n minSize / parentSize,\n );\n const root = changed ? clientPos ?? null : prev.root;\n return { ...prev, sizeDistribution, root };\n};\n\nexport const calculateDiffPercentage = (\n prev: MultipleState,\n parentSize: number,\n dragging: number,\n clientPos?: number,\n targetSize?: number,\n): number => {\n let diff: number;\n // If the caller provided a target size, prefer that.\n if (targetSize != null) {\n // If the target size is a pixel value, convert it to a percentage.\n if (targetSize > 1) targetSize = targetSize / parentSize;\n diff = targetSize - prev.sizeDistribution[dragging];\n } else if (clientPos != null) {\n if (prev.root === null) throw new Error(\"resize root is null during handle drag\");\n diff = (clientPos - prev.root) / parentSize;\n } else throw new Error(\"must provide either a MouseEvent or a targetSize\");\n return diff;\n};\n\nconst resizeWithSibling = (\n prevDistribution: number[],\n item: number,\n diff: number,\n minSizePercent: number,\n): [number[], boolean] => {\n let next = item;\n\n // The while loops find a pane we can actually resize.\n while (next > 0 && prevDistribution[next] + diff <= minSizePercent) next--;\n const nextSize = prevDistribution[next] + diff;\n\n const nextSibling = findResizableSibling(\n next,\n prevDistribution,\n minSizePercent,\n diff,\n );\n const nextSiblingSize = prevDistribution[nextSibling] - diff;\n // This means we can't resize any panes so we return null to indicate that the next\n // set of sizes should remain the same.\n if (nextSize < minSizePercent || nextSiblingSize < minSizePercent)\n return [prevDistribution, false];\n\n return [\n prevDistribution.map((p, i) => {\n if (i === next) return nextSize;\n if (i === nextSibling) return nextSiblingSize;\n return p;\n }),\n true,\n ];\n};\n\nconst findResizableSibling = (\n item: number,\n sizes: number[],\n minSize: number,\n diff: number,\n): number => {\n const f = item === sizes.length - 1 ? findBackward : findForward;\n return f(item, sizes, minSize, diff);\n};\n\nconst findForward = (\n start: number,\n sizes: number[],\n minSize: number,\n diff: number,\n): number => {\n let i = start + 1;\n while (i < sizes.length - 1 && sizes[i] - diff <= minSize) i++;\n return i;\n};\n\nconst findBackward = (\n start: number,\n sizes: number[],\n minSize: number,\n diff: number,\n): number => {\n let i = start - 1;\n while (i > 0 && sizes[i] - diff <= minSize) i--;\n return i;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type DragEvent, useCallback } from \"react\";\n\nimport { xy, box } from \"@synnaxlabs/x\";\n\nimport { Triggers } from \"@/triggers\";\n\nexport interface UseCursorDragProps {\n onStart?: (loc: xy.XY, mouseKey: Triggers.Key, e: DragEvent) => void;\n onMove?: (box: box.Box, mouseKey: Triggers.Key, e: MouseEvent) => void;\n onEnd?: (box: box.Box, mouseKey: Triggers.Key, e: MouseEvent) => void;\n}\n\nexport type UseCursorDragStart = (e: DragEvent) => void;\n\nexport const useCursorDrag = ({\n onMove,\n onStart,\n onEnd,\n}: UseCursorDragProps): UseCursorDragStart =>\n useCallback(\n (e) => {\n e.preventDefault();\n const startLoc = xy.construct(e);\n const mouseKey = Triggers.mouseKey(e.button);\n onStart?.(startLoc, mouseKey, e);\n const handleMove = (e: MouseEvent): void => {\n if (e.buttons === 0) return handleUp(e);\n const next = xy.construct(e);\n onMove?.(box.construct(startLoc, next), mouseKey, e);\n };\n window.addEventListener(\"mousemove\", handleMove);\n const handleUp = (e: xy.Crude): void => {\n window.removeEventListener(\"mousemove\", handleMove);\n const next = xy.construct(e);\n onEnd?.(box.construct(startLoc, next), mouseKey, e as MouseEvent);\n };\n window.addEventListener(\"mouseup\", handleUp, { once: true });\n },\n [onMove, onStart, onEnd],\n );\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { box, clamp, location } from \"@synnaxlabs/x\";\nimport { clsx } from \"clsx\";\n\nimport { CSS } from \"@/css\";\nimport { useCursorDrag } from \"@/hooks/useCursorDrag\";\nimport { Core, type CoreProps } from \"@/resize/Core\";\n\n/** Props for the {@link Single} component. */\nexport interface SingleProps\n extends Omit<CoreProps, \"showHandle\" | \"size\" | \"onResize\" | \"onDragStart\" | \"ref\"> {\n initialSize?: number;\n minSize?: number;\n maxSize?: number;\n onResize?: (size: number, box: box.Box) => void;\n collapseThreshold?: number;\n onCollapse?: () => void;\n}\n\nconst COLLAPSED_SIZE = 2;\n\n/**\n * A panel that can be resized in one direction by dragging its handle.\n *\n * @param props - The component props. All unused props will be passed to the div\n * containing the content.\n * @param props.location - The the location of the panel. The drag handle will be on the opposite side.\n * @param props.minSize - The smallest size the panel can be resized to.\n * @param props.maxSize - The largest size the panel can be resized to.\n * @param props.onResize - A callback executed when the panel is resized.\n */\nexport const Single = ({\n onCollapse,\n onResize,\n location: location_ = \"left\",\n minSize = 100,\n maxSize = Infinity,\n initialSize = 200,\n collapseThreshold = Infinity,\n className,\n ...props\n}: SingleProps): ReactElement => {\n const [size, setSize] = useState(clamp(initialSize, minSize, maxSize));\n const marker = useRef<number | null>(null);\n const loc = location.construct(location_);\n\n const calcNextSize = useCallback(\n (b: box.Box) => {\n if (marker.current === null) return 0;\n const dim =\n box.dim(b, location.direction(loc), true) *\n (1 - 2 * Number([\"bottom\", \"right\"].includes(loc)));\n const rawNextSize = marker.current + dim;\n const nextSize = clamp(rawNextSize, minSize, maxSize);\n if ((nextSize - rawNextSize) / minSize > collapseThreshold) return COLLAPSED_SIZE;\n return nextSize;\n },\n [loc, minSize, maxSize, collapseThreshold],\n );\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleMove = useCallback(\n (dragRegion: box.Box) => {\n const nextSize = calcNextSize(dragRegion);\n setSize(nextSize);\n if (ref.current == null) return;\n onResize?.(nextSize, box.construct(ref.current));\n },\n [onResize, calcNextSize],\n );\n\n const handleStart = useCallback(\n () =>\n setSize((prev) => {\n marker.current = prev;\n return prev;\n }),\n [setSize],\n );\n\n const handleEnd = useCallback(\n (box: box.Box) => calcNextSize(box) === COLLAPSED_SIZE && onCollapse?.(),\n [onCollapse, calcNextSize],\n );\n\n useEffect(\n () =>\n setSize((prev) => {\n const nextSize = clamp(prev, minSize, maxSize);\n marker.current = nextSize;\n return nextSize;\n }),\n [minSize, maxSize],\n );\n\n const handleDragStart = useCursorDrag({\n onMove: handleMove,\n onStart: handleStart,\n onEnd: handleEnd,\n });\n\n return (\n <Core\n ref={ref}\n location={loc}\n size={size}\n onDragStart={handleDragStart}\n className={clsx(className, CSS.expanded(size !== COLLAPSED_SIZE))}\n {...props}\n />\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, type RefObject } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { box, type direction } from \"@synnaxlabs/x/spatial\";\n\nimport { type Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { Header } from \"@/header\";\nimport { Resize } from \"@/resize\";\n\nimport \"@/accordion/Accordion.css\";\n\n/** The props for a single entry in the {@link Accordion} component. */\nexport interface Entry {\n /** A unique key for the entry. */\n key: string;\n /** The name for the entries header. */\n name: string;\n /** The content for the entry. */\n content: ReactElement;\n /**\n * The initial size for the entry. It's recommended to set this to a decimal value\n * representing the percentage of the overall parent size.\n */\n initialSize?: number;\n /**\n * A list of actions to display in the entry's header. See the {@link Header.Actions}\n * component for more details.\n */\n actions?: Array<Button.IconProps | ReactElement>;\n}\n\n/** The props for the {@link Accordion} component. */\nexport interface AccordionProps\n extends Omit<\n Resize.MultipleProps,\n \"sizeDistribution\" | \"parentSize\" | \"onDragHandle\" | \"direction\"\n > {\n data: Entry[];\n}\n\nconst DIRECTION: direction.Direction = \"y\";\nconst MIN_SIZE = 28;\nconst COLLAPSED_THRESHOLD = 32;\nconst EXPAND_THRESHOLD = 40;\nconst DEFAULT_EXPAND_SIZE = 0.5;\n\n/**\n * A resizable accordion component, whose entries can be expanded and collapsed. This\n * component is intentionally opinionated in its interface in order to provide stylistic\n * consistency and simplicity. If you need more control, look at building a custom\n * accordion component using {@link Resize.Multiple}.\n *\n * @param props - All unused props are passed to the underlying {@link Resize.Multiple}\n * component.\n * @param props.entries - The entries to display in the accordion. See the\n * {@link Entry} interface for more details.\n */\nexport const Accordion = ({ data, ...props }: AccordionProps): ReactElement => {\n const {\n setSize,\n props: { sizeDistribution: sizes, ref, ...resizeProps },\n } = Resize.useMultiple({\n direction: DIRECTION,\n count: data.length,\n minSize: MIN_SIZE,\n });\n\n const onExpand = (index: number): void => {\n if (ref.current == null) return;\n const parentSize = box.dim(box.construct(ref.current), DIRECTION);\n if (sizes[index] < EXPAND_THRESHOLD / parentSize)\n setSize(index, data[index].initialSize ?? DEFAULT_EXPAND_SIZE);\n else setSize(index, MIN_SIZE + 1);\n };\n\n return (\n <Resize.Multiple\n empty\n className={CSS.B(\"accordion\")}\n sizeDistribution={sizes}\n ref={ref}\n {...props}\n {...resizeProps}\n >\n {data.map((entry, i) => (\n <EntryC\n {...entry}\n key={entry.key}\n index={i}\n direction={DIRECTION}\n onExpand={onExpand}\n parent={ref}\n size={sizes[i]}\n />\n ))}\n </Resize.Multiple>\n );\n};\n\ninterface EntryCProps extends Omit<Entry, \"key\"> {\n index: number;\n size: number;\n parent: RefObject<HTMLDivElement>;\n onExpand: (i: number) => void;\n direction: direction.Direction;\n}\n\nconst expandedIcon = <Icon.Caret.Down aria-label=\"contract\" />;\nconst collapsedIcon = <Icon.Caret.Right aria-label=\"expand\" />;\n\nconst EntryC = ({\n index,\n name,\n content,\n actions,\n size,\n parent,\n onExpand,\n}: EntryCProps): ReactElement => {\n let expanded = true;\n if (parent.current != null) {\n const parentSize = box.dim(box.construct(parent.current), DIRECTION);\n expanded = size * parentSize > COLLAPSED_THRESHOLD;\n }\n const icon = expanded ? expandedIcon : collapsedIcon;\n return (\n <>\n <Header.Header level=\"p\" className={CSS.expanded(expanded)} empty>\n <Header.ButtonTitle startIcon={icon} onClick={() => onExpand(index)}>\n {name}\n </Header.ButtonTitle>\n {actions != null && <Header.Actions>{actions}</Header.Actions>}\n </Header.Header>\n {content}\n </>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nexport const HAUL_TYPE = \"channel\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type CSSProperties,\n memo,\n type ReactElement,\n type RefObject,\n useCallback,\n useRef,\n useState,\n} from \"react\";\n\nimport { box, location, scale, xy } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { useSyncedRef } from \"@/hooks\";\nimport { useCursorDrag } from \"@/hooks/useCursorDrag\";\nimport { type OptionalControl } from \"@/input/types\";\nimport { state } from \"@/state\";\nimport { preventDefault } from \"@/util/event\";\n\nimport \"@/vis/legend/Container.css\";\n\nexport interface ContainerProps\n extends Omit<Align.SpaceProps, \"onChange\">,\n Partial<OptionalControl<xy.XY>> {\n dragEnabled?: boolean;\n}\n\ntype CSSPosition = Partial<\n Pick<CSSProperties, \"left\" | \"right\" | \"top\" | \"bottom\" | \"display\">\n>;\n\nexport const intelligentPosition = (\n pos: xy.XY,\n ref: RefObject<HTMLDivElement>,\n): CSSPosition => {\n if (ref.current == null) return { display: \"none\" };\n const ret: CSSPosition = {};\n const parentBox = box.construct(ref.current.parentElement as HTMLDivElement);\n const b = box.construct(ref.current);\n if (pos.x > 0.8) {\n ret.right = `${(1 - pos.x) * box.width(parentBox) - box.width(b)}px`;\n } else if (pos.x < 0.2) {\n ret.left = `${pos.x * box.width(parentBox)}px`;\n } else {\n ret.left = `${pos.x * 100}%`;\n }\n if (pos.y > 0.8) {\n ret.bottom = `${(1 - pos.y) * box.height(parentBox) - box.height(b)}px`;\n } else if (pos.y < 0.2) {\n ret.top = `${pos.y * box.height(parentBox)}px`;\n } else {\n ret.top = `${pos.y * 100}%`;\n }\n return ret;\n};\n\nexport const Container = memo(\n ({\n className,\n value,\n onChange,\n style,\n draggable = true,\n ...props\n }: ContainerProps): ReactElement | null => {\n const [position, setPosition] = state.usePurePassthrough<xy.XY>({\n value,\n onChange,\n initial: xy.construct(0.1, 0.01),\n });\n\n const positionRef = useRef(position);\n const disabled = useSyncedRef(draggable === false);\n const ref = useRef<HTMLDivElement | null>(null);\n const [intelligentPos, setIntelligentPos] = useState<CSSPosition>({});\n\n if (position !== null) style = { ...style, ...intelligentPos };\n\n const refCallback = useCallback((el: HTMLDivElement | null) => {\n ref.current = el;\n setIntelligentPos(intelligentPosition(xy.construct(position), ref));\n }, []);\n\n const calculatePosition = useCallback((b: box.Box): xy.XY => {\n if (ref.current?.parentElement == null) return positionRef.current;\n const bounds = box.construct(ref.current.parentElement);\n const d = box.reRoot(box.DECIMAL, location.TOP_LEFT);\n const s = scale.XY.scale(bounds).scale(d);\n const el = s.box(box.construct(ref.current));\n const clamp = scale.XY.clamp(\n box.construct(box.topLeft(d), {\n width: box.width(d) - box.width(el),\n height: box.height(d) - box.height(el),\n }),\n );\n return clamp.pos(\n xy.translate(xy.construct(positionRef.current), box.signedDims(s.box(b))),\n );\n }, []);\n\n const handleCursorDragStart = useCursorDrag({\n onMove: useCallback(\n (box: box.Box) => {\n if (disabled.current) return;\n const pos = calculatePosition(box);\n setIntelligentPos(intelligentPosition(xy.construct(pos), ref));\n },\n [setPosition],\n ),\n onEnd: useCallback((box: box.Box) => {\n if (disabled.current) return;\n positionRef.current = calculatePosition(box);\n }, []),\n });\n\n return (\n <Align.Space\n className={CSS(className, CSS.B(\"legend\"))}\n bordered\n rounded\n style={style}\n onDragStart={handleCursorDragStart}\n draggable={draggable}\n ref={refCallback}\n {...props}\n onDrag={preventDefault}\n onDragEnd={preventDefault}\n empty\n />\n );\n },\n);\nContainer.displayName = \"Legend.Container\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useState } from \"react\";\n\nimport { Align } from \"@/align\";\nimport { Color } from \"@/color\";\nimport { Text } from \"@/text\";\nimport { Container, type ContainerProps } from \"@/vis/legend/Container\";\n\ninterface SimpleEntry {\n key: string;\n label: string;\n color: Color.Crude;\n}\n\nexport interface SimpleProps extends Omit<ContainerProps, \"value\" | \"onChange\"> {\n data?: SimpleEntry[];\n onEntryChange?: (value: SimpleEntry) => void;\n position?: ContainerProps[\"value\"];\n onPositionChange?: ContainerProps[\"onChange\"];\n}\n\nexport const Simple = ({\n data = [],\n onEntryChange,\n position,\n onPositionChange,\n ...props\n}: SimpleProps): ReactElement | null => {\n const [pickerVisible, setPickerVisible] = useState<boolean>(false);\n\n if (data.length === 0) return null;\n\n return (\n <Container\n {...props}\n draggable={!pickerVisible}\n value={position}\n onChange={onPositionChange}\n >\n {data\n .sort((a, b) => a.label.localeCompare(b.label))\n .map(({ key, color, label }) => (\n <Align.Space\n key={key}\n style={{ cursor: \"pointer\" }}\n direction=\"x\"\n align=\"center\"\n >\n <Color.Swatch\n value={color}\n onChange={(c) => onEntryChange?.({ key, color: c, label })}\n onVisibleChange={setPickerVisible}\n draggable={false}\n size=\"small\"\n />\n <Text.MaybeEditable\n level=\"small\"\n value={label}\n onChange={(l) => onEntryChange?.({ key, color, label: l })}\n noWrap\n />\n </Align.Space>\n ))}\n </Container>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type CanvasHTMLAttributes,\n type DetailedHTMLProps,\n type ReactElement,\n useCallback,\n useRef,\n useEffect,\n} from \"react\";\n\nimport { box, runtime, scale, xy } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { CSS } from \"@/css\";\nimport { type UseResizeHandler, useResize } from \"@/hooks\";\nimport { canvas } from \"@/vis/canvas/aether\";\n\nimport \"@/vis/canvas/Canvas.css\";\n\ntype HTMLDivProps = DetailedHTMLProps<\n CanvasHTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n>;\n\nexport interface CanvasProps extends Omit<HTMLDivProps, \"ref\"> {\n resizeDebounce?: number;\n}\n\nconst ZERO_PROPS = { region: box.ZERO, dpr: 1, os: runtime.getOS() as runtime.OS };\n\ninterface Canvases {\n gl: HTMLCanvasElement | null;\n lower2d: HTMLCanvasElement | null;\n upper2d: HTMLCanvasElement | null;\n bootstrapped: boolean;\n}\n\nconst ZERO_CANVASES: Canvases = {\n gl: null,\n lower2d: null,\n upper2d: null,\n bootstrapped: false,\n};\n\nexport const Canvas = Aether.wrap<CanvasProps>(\n canvas.Canvas.TYPE,\n ({\n children,\n resizeDebounce: debounce = 100,\n aetherKey,\n className,\n ...props\n }): ReactElement => {\n const [{ path }, { bootstrapped, dpr }, setState] = Aether.use({\n aetherKey,\n type: canvas.Canvas.TYPE,\n schema: canvas.canvasStateZ,\n initialState: ZERO_PROPS,\n });\n\n const canvases = useRef<Canvases>({ ...ZERO_CANVASES });\n\n const handleResize = useCallback(\n (region: box.Box) => {\n if (canvases.current.bootstrapped)\n setState(() => ({\n bootstrapped: true,\n region,\n dpr: window.devicePixelRatio,\n os: runtime.getOS({ default: \"Windows\" }) as runtime.OS,\n }));\n },\n [setState],\n );\n\n const resizeRef = useResize(handleResize, { debounce });\n\n useEffect(() => {\n // Handle device pixel ratio change i.e. when the user moves the window to a\n // different display.\n const handleChange = (): void => {\n if (window.devicePixelRatio === dpr) return;\n setState((p) => ({ ...p, dpr: window.devicePixelRatio }));\n };\n window\n .matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`)\n .addEventListener(\"change\", handleChange, { once: true });\n }, [dpr]);\n\n const refCallback = useCallback(\n (el: HTMLCanvasElement | null) => {\n resizeRef(el);\n if (el == null) return;\n\n // Store the canvas\n if (el.className.includes(\"gl\")) canvases.current.gl = el;\n else if (el.className.includes(\"upper2d\")) canvases.current.upper2d = el;\n else canvases.current.lower2d = el;\n const { gl, lower2d, upper2d, bootstrapped } = canvases.current;\n\n if (gl == null || lower2d == null || upper2d == null || bootstrapped) return;\n\n // Bootstrap the canvas\n canvases.current.bootstrapped = true;\n const glCanvas = gl.transferControlToOffscreen();\n const upper2dCanvas = upper2d.transferControlToOffscreen();\n const lower2dCanvas = lower2d.transferControlToOffscreen();\n setState(\n {\n glCanvas,\n upper2dCanvas,\n lower2dCanvas,\n bootstrap: true,\n bootstrapped: false,\n region: box.construct(gl),\n dpr: window.devicePixelRatio,\n os: runtime.getOS({ default: \"Windows\" }) as runtime.OS,\n },\n [glCanvas, upper2dCanvas, lower2dCanvas],\n );\n },\n [setState],\n );\n\n return (\n <div className={CSS(CSS.B(\"canvas-container\"), className)} {...props}>\n <canvas\n ref={refCallback}\n className={CSS(CSS.B(\"canvas\"), CSS.BM(\"canvas\", \"lower2d\"))}\n />\n <canvas\n ref={refCallback}\n className={CSS(CSS.B(\"canvas\"), CSS.BM(\"canvas\", \"gl\"))}\n />\n <canvas\n ref={refCallback}\n className={CSS(CSS.B(\"canvas\"), CSS.BM(\"canvas\", \"upper2d\"))}\n />\n <Aether.Composite path={path}>{bootstrapped && children}</Aether.Composite>\n </div>\n );\n },\n);\n\nexport const useRegion = (handler: UseResizeHandler): React.RefCallback<HTMLElement> =>\n useResize(\n useCallback(\n (b, el) => {\n const canvas = document.querySelector(\".pluto-canvas--lower2d\");\n if (canvas == null) return;\n handler(scale.XY.translate(xy.scale(box.topLeft(canvas), -1)).box(b), el);\n },\n [handler],\n ),\n );\n","import React, { memo, useRef } from 'react';\nimport cc from 'classcat';\nimport { useStore } from '@reactflow/core';\nimport { shallow } from 'zustand/shallow';\n\nvar BackgroundVariant;\n(function (BackgroundVariant) {\n BackgroundVariant[\"Lines\"] = \"lines\";\n BackgroundVariant[\"Dots\"] = \"dots\";\n BackgroundVariant[\"Cross\"] = \"cross\";\n})(BackgroundVariant || (BackgroundVariant = {}));\n\nfunction LinePattern({ color, dimensions, lineWidth }) {\n return (React.createElement(\"path\", { stroke: color, strokeWidth: lineWidth, d: `M${dimensions[0] / 2} 0 V${dimensions[1]} M0 ${dimensions[1] / 2} H${dimensions[0]}` }));\n}\nfunction DotPattern({ color, radius }) {\n return React.createElement(\"circle\", { cx: radius, cy: radius, r: radius, fill: color });\n}\n\nconst defaultColor = {\n [BackgroundVariant.Dots]: '#91919a',\n [BackgroundVariant.Lines]: '#eee',\n [BackgroundVariant.Cross]: '#e2e2e2',\n};\nconst defaultSize = {\n [BackgroundVariant.Dots]: 1,\n [BackgroundVariant.Lines]: 1,\n [BackgroundVariant.Cross]: 6,\n};\nconst selector = (s) => ({ transform: s.transform, patternId: `pattern-${s.rfId}` });\nfunction Background({ id, variant = BackgroundVariant.Dots, \n// only used for dots and cross\ngap = 20, \n// only used for lines and cross\nsize, lineWidth = 1, offset = 2, color, style, className, }) {\n const ref = useRef(null);\n const { transform, patternId } = useStore(selector, shallow);\n const patternColor = color || defaultColor[variant];\n const patternSize = size || defaultSize[variant];\n const isDots = variant === BackgroundVariant.Dots;\n const isCross = variant === BackgroundVariant.Cross;\n const gapXY = Array.isArray(gap) ? gap : [gap, gap];\n const scaledGap = [gapXY[0] * transform[2] || 1, gapXY[1] * transform[2] || 1];\n const scaledSize = patternSize * transform[2];\n const patternDimensions = isCross ? [scaledSize, scaledSize] : scaledGap;\n const patternOffset = isDots\n ? [scaledSize / offset, scaledSize / offset]\n : [patternDimensions[0] / offset, patternDimensions[1] / offset];\n return (React.createElement(\"svg\", { className: cc(['react-flow__background', className]), style: {\n ...style,\n position: 'absolute',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n }, ref: ref, \"data-testid\": \"rf__background\" },\n React.createElement(\"pattern\", { id: patternId + id, x: transform[0] % scaledGap[0], y: transform[1] % scaledGap[1], width: scaledGap[0], height: scaledGap[1], patternUnits: \"userSpaceOnUse\", patternTransform: `translate(-${patternOffset[0]},-${patternOffset[1]})` }, isDots ? (React.createElement(DotPattern, { color: patternColor, radius: scaledSize / offset })) : (React.createElement(LinePattern, { dimensions: patternDimensions, color: patternColor, lineWidth: lineWidth }))),\n React.createElement(\"rect\", { x: \"0\", y: \"0\", width: \"100%\", height: \"100%\", fill: `url(#${patternId + id})` })));\n}\nBackground.displayName = 'Background';\nvar Background$1 = memo(Background);\n\nexport { Background$1 as Background, BackgroundVariant };\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type CSSProperties,\n type DetailedHTMLProps,\n type HTMLAttributes,\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useCallback,\n useContext as reactUseContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { location, type Destructor, deep, direction, box, xy } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { type Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { useEffectCompare } from \"@/hooks\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { type Viewport } from \"@/viewport\";\nimport { Canvas } from \"@/vis/canvas\";\nimport { lineplot } from \"@/vis/lineplot/aether\";\nimport {\n type GridEntrySpec,\n filterGridEntries,\n type GridSpec,\n} from \"@/vis/lineplot/aether/grid\";\n\nimport \"@/vis/lineplot/LinePlot.css\";\n\ntype HTMLDivProps = DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\nexport interface LinePlotContextValue {\n setGridEntry: (meta: GridEntrySpec) => void;\n removeGridEntry: (key: string) => void;\n setLine: (meta: LineSpec) => void;\n removeLine: (key: string) => void;\n lines: LineSpec[];\n setViewport: (viewport: Viewport.UseEvent) => void;\n addViewportHandler: (handler: Viewport.UseHandler) => Destructor;\n setHold: (hold: boolean) => void;\n}\n\nconst Context = createContext<LinePlotContextValue | null>(null);\n\nexport const useContext = (component: string): LinePlotContextValue => {\n const ctx = reactUseContext(Context);\n if (ctx == null)\n throw new Error(`Cannot to use ${component} as a non-child of LinePlot.`);\n return ctx;\n};\n\nexport const useViewport = (handle: Viewport.UseHandler): void => {\n const ctx = useContext(\"Viewport\");\n const { addViewportHandler } = ctx;\n useEffect(() => addViewportHandler(handle), [addViewportHandler, handle]);\n};\n\nexport const useGridEntry = (meta: GridEntrySpec, component: string): CSSProperties => {\n const { setGridEntry, removeGridEntry } = useContext(component);\n const { key } = meta;\n useEffectCompare(\n () => {\n location.outer.parse(meta.loc);\n setGridEntry(meta);\n },\n ([a], [b]) => deep.equal(a, b),\n [meta],\n );\n useEffect(() => {\n return () => removeGridEntry(key);\n }, []);\n const dir = direction.swap(location.direction(meta.loc));\n const gridArea =\n dir === \"x\"\n ? `axis-start-${key} / plot-start / axis-end-${key} / plot-end`\n : `plot-start / axis-start-${key} / plot-end / axis-end-${key}`;\n return { gridArea };\n};\n\nexport interface LineSpec {\n key: string;\n color: Color.Crude;\n label: string;\n}\n\ntype LineState = LineSpec[];\n\nexport interface LinePlotProps\n extends PropsWithChildren,\n Partial<Pick<z.input<typeof lineplot.linePlotStateZ>, \"clearOverScan\" | \"hold\">>,\n HTMLDivProps {\n resizeDebounce?: number;\n onHold?: (hold: boolean) => void;\n}\n\nexport const LinePlot = Aether.wrap<LinePlotProps>(\n \"LinePlot\",\n ({\n aetherKey,\n style,\n resizeDebounce: debounce = 0,\n clearOverScan = xy.ZERO,\n children,\n hold = false,\n onHold,\n ...props\n }): ReactElement => {\n const [lines, setLines] = useState<LineState>([]);\n\n const memoProps = useMemoDeepEqualProps({ clearOverScan, hold });\n\n const [{ path }, { grid }, setState] = Aether.use({\n aetherKey,\n type: lineplot.LinePlot.TYPE,\n schema: lineplot.linePlotStateZ,\n initialState: {\n container: box.ZERO,\n viewport: box.DECIMAL,\n grid: {},\n ...memoProps,\n },\n });\n\n useEffect(() => setState((prev) => ({ ...prev, ...memoProps })), [memoProps]);\n\n const viewportHandlers = useRef<Map<Viewport.UseHandler, null>>(new Map());\n\n const addViewportHandler = useCallback(\n (handler: Viewport.UseHandler) => {\n viewportHandlers.current.set(handler, null);\n return () => viewportHandlers.current.delete(handler);\n },\n [viewportHandlers],\n );\n\n const setViewport: Viewport.UseHandler = useCallback(\n (args) => {\n const { mode, box, stage } = args;\n if (\n (mode === \"pan\" && stage !== \"start\") ||\n mode === \"zoom\" ||\n (mode === \"zoomReset\" && stage === \"start\")\n )\n setState((prev) => ({ ...prev, viewport: box }));\n viewportHandlers.current.forEach((_, handler) => handler(args));\n },\n [setState],\n );\n\n // We use a single resize handler for both the container and plotting region because\n // the container is guaranteed to only resize if the plotting region does. This allows\n // us to save a window observer.\n const handleResize = useCallback(\n (container: box.Box) => setState((prev) => ({ ...prev, container })),\n [setState],\n );\n\n const ref = Canvas.useRegion(handleResize);\n\n const setGridEntry: LinePlotContextValue[\"setGridEntry\"] = useCallback(\n (meta: GridEntrySpec) =>\n setState((prev) => ({\n ...prev,\n grid: { ...prev.grid, [meta.key]: meta },\n })),\n [setState],\n );\n\n const removeGridEntry = useCallback(\n (key: string) =>\n setState((prev) => {\n const { [key]: _, ...grid } = prev.grid;\n return { ...prev, grid };\n }),\n [setState],\n );\n\n const setLine = useCallback(\n (meta: LineSpec) => {\n setLines((prev) => [...prev.filter(({ key }) => key !== meta.key), meta]);\n },\n [setLines, setViewport],\n );\n\n const removeLine = useCallback(\n (key: string) => setLines((prev) => prev.filter(({ key: k }) => k !== key)),\n [setLine],\n );\n\n const cssGrid = useMemo(() => buildPlotGrid(grid), [grid]);\n\n const setHold = useCallback(\n (hold: boolean) => {\n setState((prev) => ({ ...prev, hold }));\n onHold?.(hold);\n },\n [setState, onHold],\n );\n\n const contextValue = useMemo<LinePlotContextValue>(\n () => ({\n lines,\n setGridEntry,\n removeGridEntry,\n setLine,\n removeLine,\n setViewport,\n addViewportHandler,\n setHold,\n }),\n [\n lines,\n setGridEntry,\n removeGridEntry,\n setLine,\n removeLine,\n setViewport,\n addViewportHandler,\n setHold,\n ],\n );\n\n return (\n <div\n className={CSS.B(\"line-plot\")}\n style={{ ...style, ...cssGrid }}\n ref={ref}\n {...props}\n >\n <Context.Provider value={contextValue}>\n <Aether.Composite path={path}>{children}</Aether.Composite>\n </Context.Provider>\n </div>\n );\n },\n);\n\nconst buildPlotGrid = (grid: GridSpec): CSSProperties => {\n const b = CSS.newGridBuilder();\n filterGridEntries(\"top\", grid).forEach(({ key, size }) =>\n b.row(`axis-start-${key}`, `axis-end-${key}`, size),\n );\n b.row(\"plot-start\", \"plot-end\", \"minmax(0, 1fr)\");\n filterGridEntries(\"bottom\", grid).forEach(({ key, size }) =>\n b.row(`axis-start-${key}`, `axis-end-${key}`, size),\n );\n filterGridEntries(\"left\", grid).forEach(({ key, size }) =>\n b.col(`axis-start-${key}`, `axis-end-${key}`, size),\n );\n b.col(\"plot-start\", \"plot-end\", \"minmax(0, 1fr)\");\n filterGridEntries(\"right\", grid).forEach(({ key, size }) =>\n b.col(`axis-start-${key}`, `axis-end-${key}`, size),\n );\n return b.build();\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Legend as Core } from \"@/vis/legend\";\nimport { type LineSpec, useContext } from \"@/vis/lineplot/LinePlot\";\n\nimport \"@/vis/legend/Container.css\";\n\nexport interface LegendProps extends Omit<Core.SimpleProps, \"data\" | \"onEntryChange\"> {\n onLineChange?: (line: LineSpec) => void;\n}\n\nexport const Legend = ({\n className,\n style,\n onLineChange,\n ...props\n}: LegendProps): ReactElement | null => {\n const { lines } = useContext(\"Legend\");\n useContext(\"Legend\");\n return <Core.Simple data={lines} onEntryChange={onLineChange} {...props} />;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useLayoutEffect } from \"react\";\n\nimport { type Optional } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { line } from \"@/vis/line/aether\";\n\nexport interface LineProps extends Optional<Omit<line.State, \"key\">, \"strokeWidth\"> {}\n\nexport const Line = Aether.wrap<LineProps>(\n \"Line\",\n ({ aetherKey, ...props }): ReactElement | null => {\n const [, , setState] = Aether.use({\n aetherKey,\n type: line.Line.TYPE,\n schema: line.stateZ,\n initialState: props,\n });\n const memoProps = useMemoDeepEqualProps(props);\n useLayoutEffect(() => setState(memoProps), [memoProps]);\n return null;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useEffect } from \"react\";\n\nimport { Aether } from \"@/aether\";\nimport { Line as Core } from \"@/vis/line\";\nimport { useContext } from \"@/vis/lineplot/LinePlot\";\n\nexport interface LineProps extends Core.LineProps {}\n\nexport const Line = Aether.wrap<LineProps>(\n \"Line\",\n ({ aetherKey, color, label = \"\", ...props }): ReactElement => {\n const { setLine, removeLine } = useContext(\"Line\");\n useEffect(() => {\n setLine({\n key: aetherKey,\n color,\n label,\n });\n return () => removeLine(aetherKey);\n }, [label, color]);\n return <Core.Line aetherKey={aetherKey} color={color} label={label} {...props} />;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Align } from \"@/align\";\nimport { useUniqueKey } from \"@/hooks/useUniqueKey\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\nimport { useGridEntry } from \"@/vis/lineplot/LinePlot\";\n\nexport type TitleProps<L extends Text.Level = \"h2\"> = Text.MaybeEditableProps<L>;\n\nexport const Title = <L extends Text.Level = \"h2\">({\n level = \"h2\" as TitleProps<L>[\"level\"],\n ...props\n}: TitleProps<L>): ReactElement => {\n const key = useUniqueKey();\n const font = Theming.useTypography(level);\n const gridStyle = useGridEntry(\n {\n key,\n size: (font.lineHeight + 2) * font.baseSize,\n loc: \"top\",\n order: \"first\",\n },\n \"Title\",\n );\n return (\n <Align.Space justify=\"center\" align=\"center\" style={gridStyle}>\n {/* @ts-expect-error */}\n <Text.MaybeEditable<L> {...props} level={level} />\n </Align.Space>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type CSSProperties, type ReactElement, forwardRef } from \"react\";\n\nimport { box } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { type UseReturn, type Mode } from \"@/viewport/use\";\n\nimport \"@/viewport/Mask.css\";\n\ntype DivProps = React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLDivElement>,\n HTMLDivElement\n>;\n\nexport interface MaskProps\n extends Omit<UseReturn, \"ref\">,\n Omit<DivProps, \"onDragStart\" | \"onDragEnd\" | \"onDrag\" | \"ref\" | \"onDoubleClick\"> {}\n\nconst MODE_CURSORS: Record<Mode, CSSProperties[\"cursor\"]> = {\n select: \"pointer\",\n zoom: \"crosshair\",\n pan: \"grab\",\n zoomReset: \"crosshair\",\n click: \"pointer\",\n};\n\nexport const Mask = forwardRef<HTMLDivElement, MaskProps>(\n (\n { className, mode, maskBox, children, style, ...props },\n ref,\n ): ReactElement | null => (\n <div\n ref={ref}\n className={CSS(CSS.noSelect, CSS.BE(\"viewport-mask\", \"container\"), className)}\n style={{\n cursor: MODE_CURSORS[mode],\n ...style,\n }}\n {...props}\n >\n <div\n style={{\n ...box.css(maskBox),\n display: box.areaIsZero(maskBox) ? \"none\" : \"block\",\n }}\n className={CSS.BE(\"viewport-mask\", \"selection\")}\n />\n {children}\n </div>\n ),\n);\nMask.displayName = \"ZoomPanMask\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type MutableRefObject,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ForwardedRef,\n} from \"react\";\n\nimport { box, xy, dimensions, location, scale } from \"@synnaxlabs/x\";\n\nimport { useStateRef } from \"@/hooks/ref\";\nimport { useMemoCompare } from \"@/memo\";\nimport { Triggers } from \"@/triggers\";\n\nexport interface UseEvent {\n box: box.Box;\n cursor: xy.XY;\n mode: Mode;\n stage: Triggers.Stage;\n}\n\nexport type UseHandler = (e: UseEvent) => void;\n\nexport type UseTriggers = Triggers.ModeConfig<TriggerMode>;\n\nexport interface UseRefValue {\n reset: () => void;\n}\n\nexport interface UseProps {\n triggers?: UseTriggers;\n onChange?: UseHandler;\n resetOnDoubleClick?: boolean;\n threshold?: dimensions.Dimensions;\n initial?: box.Box;\n ref?:\n | MutableRefObject<UseRefValue | undefined>\n | ForwardedRef<UseRefValue | undefined>;\n}\n\nexport interface UseReturn {\n mode: Mode;\n maskBox: box.Box;\n ref: React.MutableRefObject<HTMLDivElement | null>;\n}\n\nconst TRUNC_PRECISION = 6;\n\ntype StringLiteral<T> = T extends string ? (string extends T ? never : T) : never;\n\nconst TRIGGER_MODES = [\"zoom\", \"pan\", \"select\", \"zoomReset\"] as const;\nexport const MODES = [...TRIGGER_MODES, \"click\"] as const;\nexport type Mode = StringLiteral<(typeof MODES)[number]>;\ntype TriggerMode = StringLiteral<(typeof TRIGGER_MODES)[number]>;\nexport const MASK_MODES: Mode[] = [\"zoom\", \"select\"];\n\nexport const ZOOM_DEFAULT_TRIGGERS: UseTriggers = {\n defaultMode: \"zoom\",\n zoom: [[\"MouseLeft\"]],\n zoomReset: [[\"MouseLeft\", \"Control\"]],\n pan: [[\"MouseLeft\", \"Shift\"]],\n select: [[\"MouseLeft\", \"Alt\"]],\n};\n\nexport const PAN_DEFAULT_TRIGGERS: UseTriggers = {\n defaultMode: \"pan\",\n pan: [[\"MouseLeft\"]],\n zoom: [[\"MouseLeft\", \"Shift\"]],\n zoomReset: [[\"MouseLeft\", \"Control\"]],\n select: [[\"MouseLeft\", \"Alt\"]],\n};\n\nexport const SELECT_DEFAULT_TRIGGERS: UseTriggers = {\n defaultMode: \"select\",\n select: [[\"MouseLeft\"]],\n pan: [[\"MouseLeft\", \"Shift\"]],\n zoom: [[\"MouseLeft\", \"Alt\"]],\n zoomReset: [[\"MouseLeft\", \"Control\"]],\n};\n\nexport const DEFAULT_TRIGGERS: Record<Mode, UseTriggers> = {\n zoom: ZOOM_DEFAULT_TRIGGERS,\n pan: PAN_DEFAULT_TRIGGERS,\n select: SELECT_DEFAULT_TRIGGERS,\n zoomReset: ZOOM_DEFAULT_TRIGGERS,\n click: ZOOM_DEFAULT_TRIGGERS,\n};\n\nconst purgeMouseTriggers = (triggers: UseTriggers): UseTriggers => {\n const e = Object.entries(triggers) as Array<\n [TriggerMode | \"defaultMode\", Triggers.Trigger[]]\n >;\n return Object.fromEntries(\n e.map(([key, value]: [string, Triggers.Trigger[]]) => {\n if (key === \"defaultMode\") return [key, value];\n return [\n key,\n value\n .map((t) => t.filter((k) => k !== \"MouseLeft\"))\n .filter((t) => t.length > 0),\n ];\n }),\n ) as unknown as UseTriggers;\n};\n\nconst D = box.construct(0, 0, 1, 1, location.TOP_LEFT);\n\nconst DEFAULT_THRESHOLD = { width: 30, height: 50 };\n\nexport const use = ({\n onChange,\n triggers: initialTriggers,\n initial = D,\n threshold: threshold_ = DEFAULT_THRESHOLD,\n ref,\n}: UseProps): UseReturn => {\n const defaultMode = initialTriggers?.defaultMode ?? \"zoom\";\n\n const [maskBox, setMaskBox] = useState<box.Box>(box.ZERO);\n const [maskMode, setMaskMode] = useState<Mode>(defaultMode);\n const [stateRef, setStateRef] = useStateRef<box.Box>(initial);\n const canvasRef = useRef<HTMLDivElement | null>(null);\n const threshold = dimensions.construct(threshold_);\n\n useEffect(() => setStateRef(() => box.truncate(initial, 3)), [initial]);\n useEffect(() => setMaskMode(defaultMode), [defaultMode]);\n\n const [triggerConfig, reducedTriggerConfig, purgedTriggers, reducedPurgedTriggers] =\n useMemoCompare(\n (): [UseTriggers, Triggers.Trigger[], UseTriggers, Triggers.Trigger[]] => {\n const config: UseTriggers = {\n ...DEFAULT_TRIGGERS[defaultMode],\n ...initialTriggers,\n };\n const reducedTriggers = Triggers.flattenConfig(config);\n const mouseTriggers = purgeMouseTriggers(config);\n return [\n config,\n reducedTriggers,\n mouseTriggers,\n Triggers.flattenConfig(mouseTriggers),\n ];\n },\n Triggers.compareModeConfigs,\n [initialTriggers],\n );\n\n const handleDrag = useCallback<Triggers.DragCallback>(\n ({ box: box_, triggers, stage, cursor }): void => {\n if (canvasRef.current == null) return;\n const mode = Triggers.determineMode<TriggerMode>(triggerConfig, triggers);\n const canvas = box.construct(canvasRef.current);\n if (mode == null) return;\n\n if (mode === \"zoomReset\") {\n setMaskBox(box.ZERO);\n onChange?.({ box: box.DECIMAL, mode, stage, cursor });\n return setStateRef(box.DECIMAL);\n }\n\n if (stage === \"end\") {\n // This prevents clicks from being registered as a drag\n if (box.width(box_) < 5 && box.height(box_) < 5) {\n if (mode === \"zoom\") setMaskBox(box.ZERO);\n onChange?.({ box: stateRef.current, mode: \"click\", stage, cursor });\n return;\n }\n return setStateRef((prev) => {\n if (mode === \"pan\") {\n const next = handlePan(box_, prev, canvas);\n if (next === null) return prev;\n onChange?.({ box: next, mode, stage, cursor });\n return next;\n }\n const next = handleZoomSelect(box_, prev, canvas);\n if (next === null) return prev;\n onChange?.({ box: next, mode, stage, cursor });\n\n if (mode === \"zoom\") {\n setMaskBox(box.ZERO);\n return next;\n }\n return box.truncate(prev, TRUNC_PRECISION);\n });\n }\n\n if (MASK_MODES.includes(mode)) {\n if (box.height(box_) < 5 && box.width(box_) < 5) return;\n return setMaskBox(\n scale.XY.scale(canvas)\n .clamp(canvas)\n .translate({ x: -box.left(canvas), y: -box.top(canvas) })\n .box(fullSize(threshold, box_, canvas)),\n );\n }\n\n setMaskBox((prev) => (!box.areaIsZero(prev) ? box.ZERO : prev));\n const next = handlePan(box_, stateRef.current, canvas);\n if (box.equals(next, stateRef.current)) return;\n onChange?.({\n box: next,\n mode,\n stage,\n cursor,\n });\n },\n [\n setMaskBox,\n setMaskMode,\n onChange,\n triggerConfig,\n threshold_.height,\n threshold_.width,\n setStateRef,\n canvasRef,\n ],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n reset: () => {\n setMaskBox(box.ZERO);\n setStateRef(box.DECIMAL);\n onChange?.({\n box: box.DECIMAL,\n mode: \"zoomReset\",\n stage: \"start\",\n cursor: xy.ZERO,\n });\n },\n }),\n [onChange],\n );\n\n const handleZoomSelect = useCallback(\n (b: box.Box, prev: box.Box, canvas: box.Box): box.Box | null =>\n box.truncate(\n constructScale(prev, canvas).box(fullSize(threshold, b, canvas)),\n TRUNC_PRECISION,\n ),\n [threshold_],\n );\n\n const verticalTrigger = Triggers.useHeldRef({ triggers: [[\"Control\"]] });\n const horizontalTrigger = Triggers.useHeldRef({ triggers: [[\"Alt\"]] });\n\n useEffect(() => {\n const handler = (e: WheelEvent): void => {\n if (canvasRef.current == null) return;\n let sf = 1;\n if (e.deltaY < 0) sf -= 0.035;\n else sf += 0.035;\n const canvasBox = box.construct(canvasRef.current);\n const rawCursor = xy.construct(e);\n if (!box.contains(canvasBox, rawCursor) || e.target !== canvasRef.current) return;\n const s2 = constructScale(stateRef.current, box.construct(canvasRef.current));\n const cursor = s2.pos(xy.construct(e));\n const s = scale.XY.magnify({\n x: verticalTrigger.current.held ? 1 : sf,\n y: horizontalTrigger.current.held ? 1 : sf,\n });\n let next = s.box(stateRef.current);\n next = box.translate(next, {\n x: verticalTrigger.current.held ? 0 : cursor.x * (1 - sf),\n y: horizontalTrigger.current.held ? 0 : cursor.y * (1 - sf),\n });\n setStateRef(next);\n onChange?.({\n stage: \"end\",\n box: next,\n cursor: xy.construct(e),\n mode: \"zoom\",\n });\n };\n window.addEventListener(\"wheel\", handler);\n return () => window.removeEventListener(\"wheel\", handler);\n }, [setStateRef, onChange]);\n\n Triggers.useDrag({\n bound: canvasRef,\n onDrag: handleDrag,\n triggers: reducedTriggerConfig,\n loose: true,\n });\n\n const handleKeyTrigger = useCallback(\n ({ triggers, stage }: Triggers.UseEvent) => {\n if (stage === \"end\") return setMaskMode(defaultMode);\n const mode = Triggers.determineMode<TriggerMode>(purgedTriggers, triggers);\n if (mode == null) return;\n setMaskMode(mode);\n },\n [purgedTriggers, defaultMode, onChange],\n );\n\n Triggers.use({\n triggers: reducedPurgedTriggers,\n callback: handleKeyTrigger,\n region: canvasRef,\n });\n\n return {\n maskBox,\n ref: canvasRef,\n mode: maskMode,\n };\n};\n\nconst constructScale = (prev: box.Box, canvas: box.Box): scale.XY =>\n scale.XY.scale(canvas).clamp(canvas).scale(prev);\n\nconst handlePan = (b: box.Box, prev: box.Box, canvas: box.Box): box.Box => {\n let dims = box.signedDims(constructScale(prev, canvas).box(b));\n dims = { signedWidth: -dims.signedWidth, signedHeight: -dims.signedHeight };\n return box.truncate(\n scale.XY.translate(xy.construct(dims)).box(prev),\n TRUNC_PRECISION,\n );\n};\n\nconst fullSize = (\n threshold: dimensions.Dimensions,\n b: box.Box,\n parent: box.Box,\n): box.Box => {\n if (box.height(b) <= threshold.height)\n return box.construct(\n box.left(b),\n box.top(parent),\n box.width(b),\n box.height(parent),\n );\n if (box.width(b) <= threshold.width)\n return box.construct(\n box.left(parent),\n box.top(b),\n box.width(parent),\n box.height(b),\n );\n return b;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\n\nexport const ClearButton = (\n props: Omit<Button.IconProps, \"children\">,\n): ReactElement => (\n <Button.Icon className={CSS.BE(\"select\", \"clear\")} variant=\"outlined\" {...props}>\n <Icon.Close aria-label=\"clear\" />\n </Button.Icon>\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Button } from \"@/button\";\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Text } from \"@/text\";\nimport { type ComponentSize } from \"@/util/component\";\n\nimport \"@/tag/Tag.css\";\n\nexport interface TagProps extends Omit<Text.TextProps, \"level\" | \"size\" | \"wrap\"> {\n icon?: ReactElement;\n onClose?: () => void;\n color?: Color.Crude;\n size?: ComponentSize;\n variant?: \"filled\" | \"outlined\";\n}\n\nexport const Tag = ({\n children = \"\",\n size = \"medium\",\n variant = \"filled\",\n color,\n icon,\n onClose,\n className,\n onDragStart,\n ...props\n}: TagProps): ReactElement => {\n const cssColor = Color.cssString(color);\n if (icon == null && color != null) icon = <Icon.Circle fill={cssColor} />;\n const closeIcon =\n onClose == null ? undefined : (\n <Button.Icon\n aria-label=\"close\"\n size={size}\n className={CSS.BE(\"tag\", \"close\")}\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n >\n <Icon.Close />\n </Button.Icon>\n );\n return (\n // @ts-expect-error - TODO: Generic Elements are weird\n <Text.WithIcon\n startIcon={icon}\n endIcon={closeIcon}\n className={CSS(\n className,\n CSS.B(\"tag\"),\n onClose != null && CSS.BM(\"tag\", \"closeable\"),\n )}\n level={Text.ComponentSizeLevels[size]}\n noWrap\n align=\"center\"\n onDragStart={onDragStart}\n {...props}\n >\n {children}\n </Text.WithIcon>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type ReactElement,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n convertRenderV,\n type Key,\n type Keyed,\n type AsyncTermSearcher,\n compare,\n toArray,\n type RenderableValue,\n} from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { type Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { useAsyncEffect } from \"@/hooks\";\nimport { Input } from \"@/input\";\nimport { List as CoreList } from \"@/list\";\nimport { selectValueIsZero, type UseSelectMultipleProps } from \"@/list/useSelect\";\nimport { ClearButton } from \"@/select/ClearButton\";\nimport { Core } from \"@/select/List\";\nimport { Tag } from \"@/tag\";\nimport { type RenderProp, componentRenderProp } from \"@/util/renderProp\";\n\nimport \"@/select/Multiple.css\";\n\nexport interface MultipleProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends Omit<Dropdown.DialogProps, \"visible\" | \"onChange\" | \"children\" | \"close\">,\n Omit<UseSelectMultipleProps<K, E>, \"data\">,\n Omit<CoreList.ListProps<K, E>, \"children\">,\n Pick<Input.TextProps, \"placeholder\"> {\n columns?: Array<CoreList.ColumnSpec<K, E>>;\n searcher?: AsyncTermSearcher<string, K, E>;\n entryRenderKey?: keyof E | ((e: E) => string | number);\n renderTag?: RenderProp<MultipleTagProps<K, E>>;\n onTagDragStart?: (e: React.DragEvent<HTMLDivElement>, key: K) => void;\n onTagDragEnd?: (e: React.DragEvent<HTMLDivElement>, key: K) => void;\n}\n\n/**\n * Allows a user to browse, search for, and select multiple values from a list of\n * options. It's important to note that Select maintains no internal selection state.\n * The caller must provide the selected value via the `value` prop and handle any\n * changes via the `onChange` prop.\n *\n * @param props - The props for the component. Any additional props will be passed to\n * the input group containing the selection input and the selected tags.\n * @param props.data - The data to be used to populate the select options.\n * @param props.columns - The columns to be used to render the select options in the\n * dropdown. See the {@link ListColumn} type for more details on how to configure\n * columns.\n * @param props.entryRenderKey - The option field rendered for each tag when selected in the\n * input group. Defaults to \"key\".\n * @param props.location - Whether to render the dropdown above or below the select\n * component. Defaults to \"below\".\n * @param props.onChange - The callback to be invoked when the selected value changes.\n * @param props.value - The currently selected value.\n */\nexport const Multiple = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n onChange,\n value,\n className,\n data,\n columns = [],\n entryRenderKey = \"key\",\n emptyContent,\n searcher,\n renderTag,\n placeholder,\n onTagDragStart,\n allowMultiple,\n allowNone,\n replaceOnSingle,\n onTagDragEnd,\n style,\n ...props\n}: MultipleProps<K, E>): ReactElement => {\n const { visible, open, close } = Dropdown.use();\n const [selected, setSelected] = useState<readonly E[]>([]);\n const [loading, setLoading] = useState(false);\n const searchMode = searcher != null;\n\n // This hook makes sure we have the selected entries fetched to render their tags\n // properly.\n useAsyncEffect(async () => {\n setLoading(true);\n if (selectValueIsZero(value)) setSelected([]);\n const inSelected = selected.map((v) => v.key);\n const nextValue = toArray(value);\n if (compare.unorderedPrimitiveArrays(inSelected, nextValue) === compare.EQUAL)\n return;\n let nextSelected: E[] = [];\n if (searchMode) {\n // Wrap this in a try-except clause just in case the searcher throws an error.\n try {\n nextSelected = await searcher.retrieve(nextValue);\n } finally {\n setLoading(false);\n }\n } else if (data != null)\n nextSelected = data.filter((v) => nextValue.includes(v.key));\n setSelected(nextSelected);\n }, [searcher, searchMode, value, data]);\n\n const handleChange: UseSelectMultipleProps<K, E>[\"onChange\"] = useCallback(\n (v, extra) => {\n setSelected(extra.entries);\n onChange(v, extra);\n },\n [onChange],\n );\n\n const InputWrapper = useMemo(\n () => (searchMode ? CoreList.Search : CoreList.Filter),\n [searchMode],\n );\n\n return (\n <Core<K, E>\n close={close}\n open={open}\n data={data}\n emptyContent={emptyContent}\n visible={visible}\n value={value}\n onChange={handleChange}\n allowNone={allowNone}\n replaceOnSingle={replaceOnSingle}\n columns={columns}\n allowMultiple\n {...props}\n >\n <InputWrapper<K, E> searcher={searcher}>\n {({ onChange, value: inputValue }) => (\n <MultipleInput<K, E>\n value={inputValue}\n selectedKeys={value}\n className={className}\n onChange={onChange}\n loading={loading}\n selected={selected}\n onFocus={open}\n entryRenderKey={entryRenderKey}\n visible={visible}\n renderTag={renderTag}\n placeholder={placeholder}\n onTagDragStart={onTagDragStart}\n onTagDragEnd={onTagDragEnd}\n style={style}\n />\n )}\n </InputWrapper>\n </Core>\n );\n};\n\ninterface SelectMultipleInputProps<K extends Key, E extends Keyed<K>>\n extends Omit<Input.TextProps, \"onFocus\"> {\n loading: boolean;\n selectedKeys: K | K[];\n selected: readonly E[];\n entryRenderKey: keyof E | ((e: E) => string | number);\n visible: boolean;\n renderTag?: RenderProp<MultipleTagProps<K, E>>;\n onTagDragStart?: (e: React.DragEvent<HTMLDivElement>, key: K) => void;\n onTagDragEnd?: (e: React.DragEvent<HTMLDivElement>, key: K) => void;\n onFocus?: () => void;\n}\n\nconst MultipleInput = <K extends Key, E extends Keyed<K>>({\n selectedKeys,\n loading,\n selected,\n onChange,\n onFocus,\n visible,\n entryRenderKey,\n renderTag = componentRenderProp(MultipleTag<K, E>),\n placeholder = \"Select...\",\n onTagDragStart,\n onTagDragEnd,\n value,\n className,\n ...props\n}: SelectMultipleInputProps<K, E>): ReactElement => {\n const { onSelect, clear } = CoreList.useSelectionUtils();\n const ref = useRef<HTMLInputElement>(null);\n\n useLayoutEffect(() => {\n if (visible) ref.current?.focus();\n }, [visible, selected]);\n\n const handleFocus: Input.TextProps[\"onFocus\"] = (e) => {\n if (!visible) onChange(\"\");\n onFocus?.();\n };\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>): void => {\n if (visible) return;\n onFocus?.();\n };\n\n const handleBlur = (): void => {\n if (visible) return;\n onChange(\"\");\n };\n\n return (\n <Input.Text\n ref={ref}\n className={CSS(\n CSS.BE(\"select-multiple\", \"input\"),\n CSS.visible(visible),\n className,\n )}\n onBlur={handleBlur}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onFocus={handleFocus}\n autoComplete=\"off\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n onClick={handleClick}\n {...props}\n >\n <Align.Space\n direction=\"x\"\n className={CSS.BE(\"select-multiple\", \"tags\")}\n align=\"center\"\n grow\n >\n {toArray(selectedKeys).map((k, i) => {\n const e = selected[i];\n return renderTag({\n key: k,\n entryKey: k,\n entryRenderKey,\n loading,\n entry: e,\n onClose: () => onSelect?.(k),\n onDragStart: (ev) => onTagDragStart?.(ev, k),\n onDragEnd: (ev) => onTagDragEnd?.(ev, k),\n });\n })}\n </Align.Space>\n <ClearButton onClick={clear} />\n </Input.Text>\n );\n};\n\nexport interface MultipleTagProps<K extends Key, E extends Keyed<K>> {\n key: K;\n entryKey: K;\n entryRenderKey: keyof E | ((e: E) => string | number);\n entry?: E;\n color?: Color.Crude;\n loading: boolean;\n onClose?: () => void;\n onDragStart: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>) => void;\n}\n\nexport const MultipleTag = <K extends Key, E extends Keyed<K>>({\n entryKey,\n entryRenderKey,\n entry,\n loading,\n ...props\n}: MultipleTagProps<K, E>): ReactElement => {\n let v: RenderableValue = entryKey;\n if (entry != null)\n v =\n typeof entryRenderKey === \"function\"\n ? entryRenderKey(entry)\n : (entry[entryRenderKey] as RenderableValue);\n return (\n <Tag.Tag\n size=\"small\"\n variant=\"outlined\"\n className={CSS(\n entry == null && !loading && CSS.BEM(\"select-multiple\", \"tag\", \"invalid\"),\n )}\n draggable\n {...props}\n key={entryKey.toString()}\n >\n {convertRenderV(v)}\n </Tag.Tag>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type FocusEventHandler,\n type ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport {\n type AsyncTermSearcher,\n type Key,\n primitiveIsZero,\n type Keyed,\n} from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { useAsyncEffect } from \"@/hooks\";\nimport { Input } from \"@/input\";\nimport { List as CoreList } from \"@/list\";\nimport {\n selectValueIsZero,\n type UseSelectSingleProps,\n type UseSelectOnChangeExtra,\n} from \"@/list/useSelect\";\nimport { ClearButton } from \"@/select/ClearButton\";\nimport { Core } from \"@/select/List\";\n\nimport \"@/select/Single.css\";\n\nexport interface SingleProps<K extends Key, E extends Keyed<K>>\n extends Omit<\n Dropdown.DialogProps,\n \"onChange\" | \"visible\" | \"children\" | \"variant\" | \"close\"\n >,\n Omit<UseSelectSingleProps<K, E>, \"data\" | \"allowMultiple\">,\n Omit<CoreList.ListProps<K, E>, \"children\">,\n Pick<Input.TextProps, \"variant\" | \"disabled\"> {\n entryRenderKey?: keyof E | ((e: E) => string | number);\n columns?: Array<CoreList.ColumnSpec<K, E>>;\n inputProps?: Omit<Input.TextProps, \"onChange\">;\n searcher?: AsyncTermSearcher<string, K, E>;\n hideColumnHeader?: boolean;\n omit?: Array<K>;\n}\n\n/**\n * Allows a user to browse, search for, and select a value from a list of options.\n * It's important to note that Select maintains no internal selection state. The caller\n * must provide the selected value via the `value` prop and handle any changes via the\n * `onChange` prop.\n *\n * @param props - The props for the component. Any additional props will be passed to the\n * underlying input element.\n * @param props.data - The data to be used to populate the select options.\n * @param props.columns - The columns to be used to render the select options in the\n * dropdown. See the {@link ListColumn} type for more details on available options.\n * @param props.entryRenderKey - The option field rendered when selected. Defaults to \"key\".\n * @param props.location - Whether to render the dropdown above or below the select\n * component. Defaults to \"below\".\n * @param props.onChange - The callback to be invoked when the selected value changes.\n * @param props.value - The currently selected value.\n */\nexport const Single = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n onChange,\n value,\n entryRenderKey = \"key\",\n columns,\n data,\n emptyContent,\n inputProps,\n allowNone,\n searcher,\n className,\n variant,\n hideColumnHeader = false,\n disabled,\n omit,\n ...props\n}: SingleProps<K, E>): ReactElement => {\n const { visible, open, close } = Dropdown.use();\n const [selected, setSelected] = useState<E | null>(null);\n const searchMode = searcher != null;\n\n // This hook runs to make sure we have the selected entry populated when the value\n // changes externally.\n useAsyncEffect(async () => {\n if (selectValueIsZero(value)) return setSelected(null);\n if (selected?.key === value) return;\n let nextSelected: E | null = null;\n if (searchMode)\n // Wrap this in a try-except clause just in case the searcher throws an error.\n try {\n [nextSelected] = await searcher.retrieve([value]);\n } finally {\n // It might be undefined, so coalesce it to null.\n nextSelected ??= null;\n }\n else if (data != null) nextSelected = data.find((e) => e.key === value) ?? null;\n setSelected(nextSelected);\n }, [searcher, value, data]);\n\n const handleChange = useCallback<UseSelectSingleProps<K, E>[\"onChange\"]>(\n (v: K, e: UseSelectOnChangeExtra<K, E>): void => {\n setSelected(v == null ? null : e.entries[0]);\n close();\n onChange(v, e);\n },\n [onChange, allowNone],\n );\n\n const InputWrapper = useMemo(\n () => (searchMode ? CoreList.Search : CoreList.Filter),\n [searchMode],\n );\n\n return (\n <Core<K, E>\n close={close}\n open={open}\n data={data}\n omit={omit}\n emptyContent={emptyContent}\n allowMultiple={false}\n visible={visible}\n value={value}\n hideColumnHeader={hideColumnHeader}\n onChange={handleChange}\n allowNone={allowNone}\n columns={columns}\n {...props}\n >\n <InputWrapper<K, E> searcher={searcher}>\n {({ onChange }) => (\n <SingleInput<K, E>\n variant={variant}\n onChange={onChange}\n onFocus={open}\n selected={selected}\n entryRenderKey={entryRenderKey}\n visible={visible}\n allowNone={allowNone}\n className={className}\n disabled={disabled}\n />\n )}\n </InputWrapper>\n </Core>\n );\n};\n\nexport interface SelectInputProps<K extends Key, E extends Keyed<K>>\n extends Omit<Input.TextProps, \"value\" | \"onFocus\"> {\n entryRenderKey: keyof E | ((e: E) => string | number);\n selected: E | null;\n visible: boolean;\n debounceSearch?: number;\n allowNone?: boolean;\n onFocus: () => void;\n}\n\nconst SingleInput = <K extends Key, E extends Keyed<K>>({\n entryRenderKey,\n selected,\n visible,\n onChange,\n onFocus,\n allowNone = true,\n debounceSearch = 250,\n placeholder = \"Select...\",\n className,\n ...props\n}: SelectInputProps<K, E>): ReactElement => {\n const { clear } = CoreList.useSelectionUtils();\n // We maintain our own value state for two reasons:\n //\n // 1. So we can avoid executing a search when the user selects an item and hides the\n // dropdown.\n // 2. So that we can display the previous search results when the user focuses on the\n // while still being able to clear the input value for searching.\n //\n const [internalValue, setInternalValue] = useState(\"\");\n\n // Runs to set the value of the input to the item selected from the list.\n useEffect(() => {\n if (visible) return;\n if (primitiveIsZero(selected?.key)) return setInternalValue(\"\");\n if (selected == null) return;\n if (typeof entryRenderKey === \"function\")\n return setInternalValue(entryRenderKey(selected).toString());\n else\n return setInternalValue(\n (selected?.[entryRenderKey] as string | number).toString(),\n );\n }, [selected, visible, entryRenderKey]);\n\n const handleChange = (v: string): void => {\n onChange(v);\n setInternalValue(v);\n };\n\n const handleFocus: FocusEventHandler<HTMLInputElement> = (e) => {\n setInternalValue(\"\");\n onFocus?.();\n };\n\n const handleClick: React.MouseEventHandler<HTMLInputElement> = (e) => {\n if (visible) return;\n e.preventDefault();\n onFocus?.();\n };\n\n const handleClear = (): void => {\n setInternalValue(\"\");\n clear?.();\n };\n\n return (\n <Input.Text\n className={CSS(CSS.BE(\"select\", \"input\"), className)}\n value={internalValue}\n onChange={handleChange}\n onFocus={handleFocus}\n style={{ flexGrow: 1 }}\n onClick={handleClick}\n placeholder={placeholder}\n {...props}\n >\n {allowNone && <ClearButton onClick={handleClear} />}\n </Input.Text>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { type direction } from \"@synnaxlabs/x\";\n\nimport { Button as CoreButton } from \"@/button\";\nimport { Button, type ButtonOptionProps, type ButtonProps } from \"@/select/Button\";\n\ninterface Entry {\n key: direction.Direction;\n icon: ReactElement;\n}\n\nexport interface DirectionProps\n extends Omit<ButtonProps<direction.Direction, Entry>, \"data\" | \"entryRenderKey\"> {}\n\nconst DATA: Entry[] = [\n {\n key: \"x\",\n icon: <Icon.Arrow.Right />,\n },\n {\n key: \"y\",\n icon: <Icon.Arrow.Down />,\n },\n];\n\nconst defaultSelectDirectionButton = ({\n key,\n entry,\n onClick,\n selected,\n}: ButtonOptionProps<direction.Crude, Entry>): ReactElement => {\n return (\n <CoreButton.Icon\n key={key}\n variant={selected ? \"filled\" : \"outlined\"}\n onClick={onClick}\n >\n {entry.icon}\n </CoreButton.Icon>\n );\n};\n\nexport const Direction = ({\n children = defaultSelectDirectionButton,\n allowMultiple = false,\n ...props\n}: DirectionProps): ReactElement => {\n return (\n <Button {...props} data={DATA}>\n {children}\n </Button>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { caseconv, DataType as TelemDataType } from \"@synnaxlabs/x\";\n\nimport { type List } from \"@/list\";\nimport { DropdownButton, type DropdownButtonProps } from \"@/select/Button\";\n\ninterface ListEntry {\n key: string;\n name: string;\n}\n\nconst DATA: ListEntry[] = TelemDataType.ALL.filter(\n (d) => d !== TelemDataType.UNKNOWN,\n).map((d) => ({\n key: d.toString(),\n name: caseconv.capitalize(d.toString()),\n}));\n\nconst COLUMNS: Array<List.ColumnSpec<string, ListEntry>> = [\n {\n key: \"name\",\n name: \"Name\",\n },\n];\n\nexport interface DataTypeProps\n extends Omit<DropdownButtonProps<string, ListEntry>, \"data\" | \"columns\"> {}\n\nexport const DataType = (props: DataTypeProps): ReactElement => (\n <DropdownButton<string, ListEntry>\n {...props}\n data={DATA}\n columns={COLUMNS}\n entryRenderKey=\"name\"\n />\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, type ReactNode } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { caseconv } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { Select } from \"@/select\";\nimport { Text } from \"@/text\";\nimport { Triggers } from \"@/triggers\";\nimport { type Trigger } from \"@/triggers/triggers\";\nimport { MODES, type Mode, type UseTriggers } from \"@/viewport/use\";\n\ninterface Entry {\n key: Mode;\n icon: ReactElement;\n tooltip: ReactNode;\n}\n\ninterface TooltipProps {\n mode: Mode;\n triggers: Trigger[];\n}\n\nconst Tooltip = ({ mode, triggers }: TooltipProps): ReactElement => (\n <Align.Space direction=\"x\" align=\"center\">\n <Text.Text level=\"small\">{caseconv.capitalize(mode)}</Text.Text>\n <Triggers.Text trigger={triggers[0]} level=\"small\" />\n </Align.Space>\n);\n\nconst MODE_ICONS: Record<Mode, ReactElement> = {\n zoom: <Icon.Zoom />,\n pan: <Icon.Pan />,\n select: <Icon.Selection />,\n zoomReset: <Icon.Expand />,\n click: <Icon.Bolt />,\n};\n\nexport interface SelectModeProps extends Omit<Select.ButtonProps<Mode>, \"data\"> {\n triggers: UseTriggers;\n disable?: Mode[];\n}\n\nexport const SelectMode = ({\n triggers,\n disable = [\"zoomReset\", \"click\"],\n ...props\n}: SelectModeProps): ReactElement => {\n const data = Object.entries(triggers)\n .filter(([key]) => !disable.includes(key as Mode) && MODES.includes(key as Mode))\n .map(([key, value]) => ({\n key: key as Mode,\n icon: MODE_ICONS[key as Mode],\n tooltip: <Tooltip mode={key as Mode} triggers={value as Trigger[]} />,\n }))\n .sort((a, b) => MODES.indexOf(a.key) - MODES.indexOf(b.key));\n\n return (\n <Select.Button<Mode, Entry> {...props} data={data} entryRenderKey=\"icon\">\n {({ title: _, entry, ...props }) => (\n <Button.Icon\n {...props}\n key={entry.key}\n variant={props.selected ? \"filled\" : \"text\"}\n size=\"medium\"\n tooltip={entry.tooltip}\n tooltipLocation={{ x: \"right\", y: \"top\" }}\n >\n {entry.icon}\n </Button.Icon>\n )}\n </Select.Button>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n useCallback,\n useLayoutEffect,\n forwardRef,\n} from \"react\";\n\nimport { box, xy } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Viewport as Core } from \"@/viewport\";\nimport { type UseRefValue } from \"@/viewport/use\";\nimport { useContext } from \"@/vis/lineplot/LinePlot\";\n\nimport \"@/vis/lineplot/Viewport.css\";\n\nexport interface ViewportProps extends PropsWithChildren, Core.UseProps {}\n\nexport const selectViewportEl = (el: HTMLElement | null): Element | null =>\n el == null\n ? null\n : document.querySelectorAll(\".pluto-line-plot__viewport\")[0] ?? null;\n\nexport const Viewport = forwardRef<UseRefValue | undefined, ViewportProps>(\n (\n { children, initial = box.DECIMAL, onChange, ...props }: ViewportProps,\n ref,\n ): ReactElement => {\n const { setViewport } = useContext(\"Viewport\");\n\n useLayoutEffect(() => {\n setViewport({ box: initial, mode: \"zoom\", cursor: xy.ZERO, stage: \"start\" });\n }, [setViewport, initial]);\n\n const handleChange = useCallback(\n (e: Core.UseEvent): void => {\n setViewport(e);\n onChange?.(e);\n },\n [onChange, setViewport],\n );\n\n const maskProps = Core.use({\n onChange: handleChange,\n initial,\n ref,\n ...props,\n });\n\n return (\n <Core.Mask className={CSS.BE(\"line-plot\", \"viewport\")} {...maskProps}>\n {children}\n </Core.Mask>\n );\n },\n);\nViewport.displayName = \"Viewport\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n useEffect,\n type FC,\n useRef,\n} from \"react\";\n\nimport { direction, type bounds } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { useMemoDeepEqualProps as useMemoDeepEqual } from \"@/memo\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\nimport { lineplot } from \"@/vis/lineplot/aether\";\nimport {\n coreAxisStateZ,\n parseAutoBounds,\n withinSizeThreshold,\n} from \"@/vis/lineplot/aether/axis\";\nimport { useGridEntry } from \"@/vis/lineplot/LinePlot\";\n\nimport \"@/vis/lineplot/Axis.css\";\n\nexport interface AxisProps\n extends PropsWithChildren,\n Omit<z.input<typeof lineplot.xAxisStateZ>, \"position\" | \"size\">,\n Omit<Align.SpaceProps, \"color\"> {\n resizeDebounce?: number;\n label?: string;\n labelLevel?: Text.Level;\n labelDirection?: direction.Direction;\n onLabelChange?: (label: string) => void;\n onAutoBoundsChange?: (bounds: bounds.Bounds) => void;\n}\n\nexport const axisFactory = (dir: direction.Direction): FC<AxisProps> => {\n const defaultLocation = dir === \"x\" ? \"bottom\" : \"left\";\n const aetherType = dir === \"x\" ? lineplot.XAxis.TYPE : lineplot.YAxis.TYPE;\n const cssClass = `${dir}-axis`;\n return Aether.wrap<AxisProps>(\n aetherType,\n ({\n aetherKey,\n children,\n resizeDebounce: debounce = 0,\n location = defaultLocation,\n label = \"\",\n labelLevel = \"small\",\n labelDirection = dir,\n onLabelChange,\n color,\n labelSize: propsLabelSize,\n showGrid,\n type,\n bounds,\n className,\n tickSpacing,\n autoBounds,\n autoBoundUpdateInterval,\n onAutoBoundsChange,\n style,\n ...props\n }): ReactElement => {\n const showLabel = (label?.length ?? 0) > 0;\n\n const aetherProps = useMemoDeepEqual({\n location,\n showGrid,\n type,\n bounds,\n label,\n labelDirection,\n tickSpacing,\n autoBounds,\n autoBoundUpdateInterval,\n });\n\n const [{ path }, { size, labelSize, ...state }, setState] = Aether.use({\n aetherKey,\n type: aetherType,\n schema: coreAxisStateZ,\n initialState: aetherProps,\n });\n\n useEffect(\n () => setState((state) => ({ ...state, ...aetherProps })),\n [aetherProps],\n );\n useEffect(() => {\n const { lower, upper } = parseAutoBounds(state.autoBounds);\n if (state.bounds == null) return;\n if (\n (lower && bounds?.lower !== state.bounds.lower) ||\n (upper && bounds?.upper !== state.bounds.upper)\n )\n onAutoBoundsChange?.(state.bounds);\n }, [state.autoBounds, state.bounds]);\n\n const gridStyle = useGridEntry(\n {\n loc: location,\n key: `${aetherType}-${aetherKey}`,\n size: size + labelSize,\n order: \"last\",\n },\n \"XAxis\",\n );\n\n const font = Theming.useTypography(labelLevel).toString();\n\n const prevLabelSize = useRef(0);\n\n useEffect(() => {\n if (dir === \"y\") {\n if (label == null) return;\n const dims = Text.dimensions(label, font);\n let labelSize =\n dims[direction.dimension(direction.construct(labelDirection))];\n if (labelSize > 0) labelSize += 6;\n setState((state) => ({\n ...state,\n labelSize,\n }));\n } else {\n const dims = Text.dimensions(label, font);\n const labelSize = dims.height + 12;\n const prevSize = prevLabelSize.current;\n if (!withinSizeThreshold(prevSize, labelSize)) {\n prevLabelSize.current = labelSize;\n setState((state) => ({\n ...state,\n labelSize,\n }));\n }\n }\n }, [label, labelDirection, font]);\n\n return (\n <>\n <Align.Space\n className={CSS(\n className,\n CSS.B(\"axis\"),\n CSS.B(cssClass),\n CSS.loc(location),\n )}\n style={{ ...style, ...gridStyle }}\n align=\"center\"\n justify={dir === \"x\" ? \"end\" : \"start\"}\n direction={direction.swap(dir)}\n {...props}\n >\n {showLabel && (\n <Text.MaybeEditable\n className={CSS(CSS.BE(\"axis\", \"label\"), CSS.dir(labelDirection))}\n value={label}\n onChange={onLabelChange}\n level={labelLevel}\n />\n )}\n </Align.Space>\n <Aether.Composite path={path}>{children}</Aether.Composite>\n </>\n );\n },\n );\n};\n\nexport const XAxis = axisFactory(\"x\");\nexport const YAxis = axisFactory(\"y\");\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useEffect, useRef } from \"react\";\n\nimport { box, xy } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { tooltip } from \"@/vis/lineplot/tooltip/aether\";\n\nexport interface TooltipProps\n extends Omit<z.input<typeof tooltip.tooltipStateZ>, \"position\"> {}\n\nexport const Tooltip = Aether.wrap<TooltipProps>(\n \"Tooltip\",\n ({ aetherKey }): ReactElement | null => {\n const [, , setState] = Aether.use({\n aetherKey,\n type: tooltip.Tooltip.TYPE,\n schema: tooltip.tooltipStateZ,\n initialState: {\n position: null,\n },\n });\n\n const ref = useRef<HTMLSpanElement>(null);\n\n const handleMove = useCallback(\n (e: MouseEvent): void => {\n // select the .pluto-canvas-container element\n const canvas = document.querySelector(\".pluto-canvas-container\");\n if (canvas == null) return;\n const topLeft = box.topLeft(canvas);\n setState({ position: xy.translation(topLeft, xy.construct(e)) });\n },\n [setState],\n );\n\n const handleLeave = useCallback(\n (): void => setState({ position: null }),\n [setState],\n );\n\n useEffect(() => {\n if (ref.current === null) return;\n // Select the parent node of the tooltip\n const parent = ref.current.parentElement;\n if (parent == null) return;\n // Bind a hover listener to the parent node\n parent.addEventListener(\"mousemove\", handleMove);\n parent.addEventListener(\"mouseleave\", handleLeave);\n return () => {\n parent.removeEventListener(\"mousemove\", handleMove);\n parent.removeEventListener(\"mouseleave\", handleLeave);\n };\n }, [handleMove]);\n\n return <span ref={ref} />;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { xy } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { Triggers } from \"@/triggers\";\nimport { type Viewport } from \"@/viewport\";\nimport { LinePlot } from \"@/vis/lineplot\";\nimport { measure } from \"@/vis/measure/aether\";\n\ntype ClickMode = \"one\" | \"two\" | \"clear\" | \"empty\";\n\nconst MEASURE_TRIGGERS: Triggers.ModeConfig<ClickMode> = {\n defaultMode: \"empty\",\n one: [[\"1\"]],\n two: [[\"2\"]],\n clear: [[\"Shift\"]],\n empty: [[]],\n};\n\nconst REDUCED_MEASURE_TRIGGERS = Triggers.flattenConfig(MEASURE_TRIGGERS);\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface MeasureProps {}\n\nexport const Measure = Aether.wrap<MeasureProps>(\"Measure\", ({ aetherKey }) => {\n const [, , setState] = Aether.use({\n aetherKey,\n type: measure.Measure.TYPE,\n schema: measure.measureStateZ,\n initialState: {\n hover: null,\n one: null,\n two: null,\n },\n });\n\n const ref = useRef<HTMLSpanElement>(null);\n\n const triggers = Triggers.useHeldRef({\n triggers: REDUCED_MEASURE_TRIGGERS,\n loose: true,\n });\n\n const handleClick: Viewport.UseHandler = useCallback(\n ({ mode, cursor }): void => {\n if (mode === \"click\") {\n const measureMode = Triggers.determineMode<ClickMode>(\n MEASURE_TRIGGERS,\n triggers.current.triggers,\n true,\n );\n if ([\"one\", \"two\"].includes(measureMode))\n return setState((p) => ({ ...p, [measureMode]: cursor }));\n else if (measureMode === \"clear\")\n setState((p) => ({ ...p, one: null, two: null }));\n else\n setState((p) => ({\n ...p,\n one: p.one ?? cursor,\n two: p.one !== null ? cursor : p.two,\n }));\n }\n },\n [setState, triggers],\n );\n\n LinePlot.useViewport(handleClick);\n\n const handleMove = useCallback(\n (e: MouseEvent): void => setState((p) => ({ ...p, hover: xy.construct(e) })),\n [setState],\n );\n\n const handleLeave = useCallback((): void => {\n setState((p) => ({\n ...p,\n hover: null,\n }));\n }, [setState]);\n\n useEffect(() => {\n if (ref.current === null) return;\n // Select the parent node of the tooltip\n const parent = ref.current.parentElement;\n if (parent == null) return;\n // Bind a hover listener to the parent node\n parent.addEventListener(\"mousemove\", handleMove);\n parent.addEventListener(\"mouseleave\", handleLeave);\n return () => {\n parent.removeEventListener(\"mousemove\", handleMove);\n parent.removeEventListener(\"mouseleave\", handleLeave);\n };\n }, [handleClick]);\n\n return <span ref={ref} />;\n});\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useEffect, useRef } from \"react\";\n\nimport { bounds, box } from \"@synnaxlabs/x/spatial\";\nimport { createPortal } from \"react-dom\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { useCursorDrag } from \"@/hooks/useCursorDrag\";\nimport { state } from \"@/state\";\nimport { Text } from \"@/text\";\nimport { selectViewportEl } from \"@/vis/lineplot/Viewport\";\nimport { rule } from \"@/vis/rule/aether\";\n\nimport \"@/vis/rule/Rule.css\";\n\nexport interface RuleProps\n extends Omit<z.input<typeof rule.ruleStateZ>, \"dragging\" | \"pixelPosition\"> {\n label?: string;\n onLabelChange?: (label: string) => void;\n units?: string;\n onPositionChange?: (position: number) => void;\n}\n\nexport const Rule = Aether.wrap<RuleProps>(\n \"Rule\",\n ({\n aetherKey,\n label,\n position: propsPosition,\n onLabelChange,\n onPositionChange,\n units = \"\",\n color,\n lineWidth,\n lineDash,\n }): ReactElement | null => {\n const [internalLabel, setInternalLabel] = state.usePurePassthrough({\n value: label,\n onChange: onLabelChange,\n initial: \"\",\n });\n\n const [, { position, pixelPosition }, setState] = Aether.use({\n aetherKey,\n type: rule.Rule.TYPE,\n schema: rule.ruleStateZ,\n initialState: {\n color,\n dragging: false,\n position: propsPosition,\n lineWidth,\n lineDash,\n },\n });\n\n useEffect(() => {\n if (position == null) return;\n if (propsPosition == null) return onPositionChange?.(position);\n const b = bounds.construct(position + 0.01, position - 0.01);\n if (propsPosition != null && !bounds.contains(b, propsPosition))\n onPositionChange?.(Math.trunc(position * 100) / 100);\n }, [position]);\n\n const pixelPosRef = useRef(pixelPosition);\n if (pixelPosition !== pixelPosRef.current) pixelPosRef.current = pixelPosition;\n\n const dragStartRef = useRef(pixelPosition);\n\n useEffect(() => {\n setState((p) => ({ ...p, position: propsPosition, color, lineWidth, lineDash }));\n }, [propsPosition, color, lineWidth, lineDash]);\n\n const handleDragStart = useCursorDrag({\n onStart: useCallback(() => {\n setState((p) => ({ ...p, dragging: true }));\n dragStartRef.current = pixelPosRef.current;\n }, []),\n onMove: (b: box.Box) => {\n setState((p) => ({\n ...p,\n pixelPosition: (dragStartRef.current ?? 0) + box.signedHeight(b),\n }));\n },\n onEnd: useCallback(() => {\n setState((p) => ({ ...p, dragging: false }));\n dragStartRef.current = pixelPosition;\n }, []),\n });\n\n const ref = useRef<HTMLDivElement>(null);\n\n if (position == null || pixelPosition == null) return null;\n\n const viewportEl = selectViewportEl(ref?.current);\n\n const content = (\n <div\n ref={ref}\n className={CSS.B(\"rule\")}\n style={{ top: `calc(${pixelPosition}px - 0.5rem)` }}\n >\n <div\n className={CSS.BE(\"rule\", \"drag-handle\")}\n onDragStart={handleDragStart}\n draggable\n />\n <Align.Space direction=\"x\" align=\"center\" style={{ marginLeft: \"2rem\" }}>\n <Text.Editable level=\"p\" value={internalLabel} onChange={setInternalLabel} />\n <Text.Text\n level=\"p\"\n style={{ padding: \"0.25rem 0\", width: \"fit-content\" }}\n >{`${position.toFixed(2)} ${units}`}</Text.Text>\n </Align.Space>\n </div>\n );\n\n if (viewportEl == null) return content;\n return createPortal(content, viewportEl);\n },\n);\n","import { Aether } from \"@/aether\";\nimport { range } from \"@/vis/lineplot/range/aether\";\nimport { z } from \"zod\";\n\ninterface AnnotationProps extends z.input<typeof range.annotationStateZ> {}\n\nexport const Annotation = Aether.wrap<AnnotationProps>(\n \"Tooltip\",\n ({ aetherKey, ...props }): null => {\n Aether.use({\n aetherKey,\n type: range.Annotation.TYPE,\n schema: range.annotationStateZ,\n initialState: props,\n });\n return null;\n },\n);\n","import { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { useGridEntry, useContext } from \"@/vis/lineplot/LinePlot\";\nimport { range } from \"@/vis/lineplot/range/aether\";\nimport { box, xy } from \"@synnaxlabs/x\";\nimport { ReactElement, useCallback, useRef } from \"react\";\nimport { Menu } from \"@/menu\";\nimport { RenderProp } from \"@/util/renderProp\";\nimport { SelectedState } from \"@/vis/lineplot/range/aether/provider\";\nimport { useSyncedRef } from \"@/hooks\";\n\nexport interface ProviderProps {\n menu?: RenderProp<range.SelectedState>;\n}\n\nexport const Provider = Aether.wrap<ProviderProps>(\n \"Annotation.Provider\",\n ({ aetherKey, menu, ...props }): ReactElement => {\n const { setViewport, setHold } = useContext(\"Range.Provider\");\n const [, { hovered, count }, setState] = Aether.use({\n aetherKey,\n type: range.Provider.TYPE,\n schema: range.providerStateZ,\n initialState: {\n ...props,\n cursor: null,\n hovered: null,\n count: 0,\n },\n });\n const gridStyle = useGridEntry(\n {\n key: aetherKey,\n loc: \"top\",\n size: count > 0 ? 32 : 0,\n order: \"last\",\n },\n \"Annotation.Provider\",\n );\n\n const menuProps = Menu.useContextMenu();\n const visibleRef = useSyncedRef(menuProps.visible);\n\n const handleMouseEnter: React.MouseEventHandler<HTMLDivElement> = useCallback(\n (e) => {\n // add an event listener for the movement until it leaves\n const handleMouseMove = (e: MouseEvent) => {\n setState((state) => ({ ...state, cursor: { x: e.clientX, y: e.clientY } }));\n };\n const target = e.currentTarget;\n target.addEventListener(\"mousemove\", handleMouseMove);\n target.addEventListener(\n \"mouseleave\",\n () => {\n target.removeEventListener(\"mousemove\", handleMouseMove);\n if (!visibleRef.current) setState((state) => ({ ...state, cursor: null }));\n },\n { once: true },\n );\n },\n [setState],\n );\n\n return (\n <Menu.ContextMenu\n style={{\n ...gridStyle,\n cursor: hovered != null ? \"pointer\" : \"default\",\n }}\n {...menuProps}\n menu={() => {\n if (menu == null || hovered == null) return null;\n return menu(hovered);\n }}\n >\n <Align.Space\n style={{ width: \"100%\", height: \"100%\" }}\n onClick={() => {\n if (hovered != null) {\n setViewport({\n box: box.construct(\n { x: hovered.viewport.lower, y: 0 },\n { x: hovered.viewport.upper, y: 1 },\n ),\n mode: \"zoom\",\n cursor: xy.ZERO,\n stage: \"start\",\n });\n setHold(true);\n }\n }}\n onMouseEnter={handleMouseEnter}\n />\n </Menu.ContextMenu>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useRef } from \"react\";\n\nimport { type channel } from \"@synnaxlabs/client\";\nimport { box, location as loc } from \"@synnaxlabs/x/spatial\";\nimport { type TimeRange, type TimeSpan } from \"@synnaxlabs/x/telem\";\n\nimport { HAUL_TYPE } from \"@/channel/types\";\nimport { type Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Haul } from \"@/haul\";\nimport { usePrevious } from \"@/hooks\";\nimport { telem } from \"@/telem/aether\";\nimport { type Text } from \"@/text\";\nimport { type Viewport } from \"@/viewport\";\nimport { LinePlot as Core } from \"@/vis/lineplot\";\nimport { Tooltip } from \"@/vis/lineplot/tooltip\";\nimport { Measure } from \"@/vis/measure\";\nimport { Rule } from \"@/vis/rule\";\nimport { Range } from \"@/vis/lineplot/range\";\n\nimport \"@/channel/LinePlot.css\";\n\n/** Props for an axis in {@link LinePlot} */\nexport interface AxisProps extends Core.AxisProps {\n /** A unique identifier for the axis */\n key: string;\n}\n\nexport interface BaseLineProps {\n key: string;\n axes: {\n x: string;\n y: string;\n };\n channels: {\n y: channel.KeyOrName;\n x?: channel.KeyOrName;\n };\n color: Color.Crude;\n strokeWidth?: number;\n label?: string;\n downsample?: number;\n}\n\nexport interface StaticLineProps extends BaseLineProps {\n variant: \"static\";\n timeRange: TimeRange;\n}\n\nexport interface DynamicLineProps extends BaseLineProps {\n variant: \"dynamic\";\n timeSpan: TimeSpan;\n}\n\nexport type LineProps = StaticLineProps | DynamicLineProps;\n\nexport interface RuleProps {\n key: string;\n position: number;\n color: Color.Crude;\n axis: string;\n label: string;\n lineWidth?: number;\n lineDash?: number;\n units?: string;\n}\n\nexport interface LinePlotProps extends Core.LinePlotProps {\n // Axes\n axes: AxisProps[];\n onAxisChannelDrop?: (axis: string, channels: channel.Key[]) => void;\n onAxisChange?: (axis: Partial<AxisProps> & { key: string }) => void;\n // Lines\n lines: LineProps[];\n onLineChange?: (line: Partial<LineProps> & { key: string }) => void;\n // Rules\n rules?: RuleProps[];\n onRuleChange?: (rule: Partial<RuleProps> & { key: string }) => void;\n // Title\n title?: string;\n showTitle?: boolean;\n onTitleChange?: (value: string) => void;\n titleLevel?: Text.Level;\n // Legend\n showLegend?: boolean;\n enableTooltip?: boolean;\n enableMeasure?: boolean;\n initialViewport?: Viewport.UseProps[\"initial\"];\n onViewportChange?: Viewport.UseProps[\"onChange\"];\n viewportTriggers?: Viewport.UseProps[\"triggers\"];\n annotationProvider?: Range.ProviderProps;\n}\n\nconst canDrop = Haul.canDropOfType(HAUL_TYPE);\n\n/**\n * A line plot component that automatically pulls data from specified channels and\n * displays it. Can be used to render both real-time and historical data.\n *\n * @param props - The props for the line plot\n * @param\n * @returns\n */\nexport const LinePlot = ({\n lines,\n axes,\n showTitle = true,\n title = \"\",\n onTitleChange,\n showLegend = true,\n titleLevel = \"h4\",\n onLineChange,\n onRuleChange,\n onAxisChannelDrop,\n onAxisChange,\n rules,\n enableTooltip = true,\n enableMeasure = false,\n initialViewport = box.DECIMAL,\n onViewportChange,\n viewportTriggers,\n annotationProvider,\n ...props\n}: LinePlotProps): ReactElement => {\n const xAxes = axes.filter(({ location: l }) => loc.isY(l));\n const ref = useRef<Viewport.UseRefValue>();\n const prevLinesLength = usePrevious(lines.length);\n const prevHold = usePrevious(props.hold);\n if (\n (prevLinesLength === 0 && lines.length !== 0) ||\n (prevHold === true && props.hold === false)\n )\n ref.current?.reset();\n return (\n <Core.LinePlot {...props}>\n {xAxes.map((a, i) => {\n const axisLines = lines.filter((l) => l.axes.x === a.key);\n const yAxes = axes.filter(({ location: l }) => loc.isX(l));\n const axisRules = rules?.filter((r) =>\n [...yAxes.map(({ key: id }) => id), a.key].includes(r.axis),\n );\n return (\n <XAxis\n key={a.key}\n axis={a}\n index={i}\n lines={axisLines}\n yAxes={yAxes}\n rules={axisRules}\n onAxisChannelDrop={onAxisChannelDrop}\n onAxisChange={onAxisChange}\n annotationProvider={annotationProvider}\n />\n );\n })}\n {showLegend && <Core.Legend onLineChange={onLineChange} />}\n {showTitle && (\n <Core.Title value={title} onChange={onTitleChange} level={titleLevel} />\n )}\n <Core.Viewport\n initial={initialViewport}\n onChange={onViewportChange}\n triggers={viewportTriggers}\n ref={ref}\n >\n {enableTooltip && <Tooltip.Tooltip />}\n {enableMeasure && <Measure.Measure />}\n </Core.Viewport>\n </Core.LinePlot>\n );\n};\n\ninterface XAxisProps\n extends Pick<\n LinePlotProps,\n \"onRuleChange\" | \"lines\" | \"rules\" | \"onAxisChannelDrop\" | \"onAxisChange\"\n > {\n axis: AxisProps;\n yAxes: AxisProps[];\n index: number;\n annotationProvider?: Range.ProviderProps;\n}\n\nconst XAxis = ({\n yAxes,\n lines,\n index,\n rules,\n onRuleChange,\n onAxisChannelDrop,\n onAxisChange,\n axis: { location, key, showGrid, ...axis },\n annotationProvider,\n}: XAxisProps): ReactElement => {\n const dropProps = Haul.useDrop({\n type: \"Channel.LinePlot.XAxis\",\n canDrop,\n onDrop: useCallback(\n ({ items }) => {\n const dropped = Haul.filterByType(HAUL_TYPE, items);\n onAxisChannelDrop?.(\n key,\n dropped.map(({ key }) => key as channel.Key),\n );\n return dropped;\n },\n [key, onAxisChannelDrop],\n ),\n });\n\n const xRules = rules?.filter((r) => r.axis === key);\n return (\n <Core.XAxis\n {...axis}\n {...dropProps}\n location={location as loc.Y}\n showGrid={showGrid ?? index === 0}\n className={CSS(\n CSS.dropRegion(Haul.canDropOfType(HAUL_TYPE)(Haul.useDraggingState())),\n )}\n onAutoBoundsChange={(bounds) => onAxisChange?.({ key, bounds })}\n >\n {yAxes.map((a, i) => {\n const yLines = lines.filter((l) => l.axes.y === a.key);\n const yRules = rules?.filter((r) => r.axis === a.key);\n return (\n <YAxis\n key={a.key}\n axis={{\n ...a,\n showGrid: showGrid ?? (index === 0 && i === 0),\n }}\n lines={yLines}\n rules={yRules}\n onRuleChange={onRuleChange}\n onAxisChannelDrop={onAxisChannelDrop}\n onAxisChange={onAxisChange}\n />\n );\n })}\n {xRules?.map((rule) => (\n <Rule.Rule\n aetherKey={rule.key}\n {...rule}\n key={rule.key}\n onLabelChange={(value) => onRuleChange?.({ key: rule.key, label: value })}\n onPositionChange={(value) =>\n onRuleChange?.({ key: rule.key, position: value })\n }\n />\n ))}\n <Range.Provider {...annotationProvider} />\n </Core.XAxis>\n );\n};\n\ninterface YAxisProps\n extends Pick<\n LinePlotProps,\n \"onRuleChange\" | \"lines\" | \"rules\" | \"onAxisChannelDrop\" | \"onAxisChange\"\n > {\n axis: AxisProps;\n}\n\nconst lineKey = ({ channels: { x, y } }: LineProps): string => `${x ?? 0}-${y}`;\n\nconst YAxis = ({\n lines,\n rules,\n onRuleChange,\n onAxisChannelDrop,\n onAxisChange,\n axis: { key, location: loc, ...props },\n}: YAxisProps): ReactElement => {\n const dropProps = Haul.useDrop({\n type: \"Channel.LinePlot.YAxis\",\n canDrop,\n onDrop: useCallback(\n ({ items }) => {\n const dropped = Haul.filterByType(HAUL_TYPE, items);\n onAxisChannelDrop?.(\n key,\n dropped.map(({ key }) => key as channel.Key),\n );\n return dropped;\n },\n [key, onAxisChannelDrop],\n ),\n });\n\n const dragging = Haul.useDraggingState();\n\n return (\n <Core.YAxis\n {...props}\n {...dropProps}\n location={loc as loc.X}\n className={CSS(CSS.dropRegion(Haul.canDropOfType(HAUL_TYPE)(dragging)))}\n onAutoBoundsChange={(bounds) => onAxisChange?.({ key, bounds })}\n >\n {lines.map((l) => (\n <Line key={lineKey(l)} line={l} />\n ))}\n {rules?.map((r) => (\n <Rule.Rule\n aetherKey={r.key}\n {...r}\n key={r.key}\n onLabelChange={(value) => onRuleChange?.({ key: r.key, label: value })}\n onPositionChange={(value) => onRuleChange?.({ key: r.key, position: value })}\n />\n ))}\n </Core.YAxis>\n );\n};\n\nconst Line = ({ line }: { line: LineProps }): ReactElement =>\n line.variant === \"static\" ? <StaticLine line={line} /> : <DynamicLine line={line} />;\n\nconst DynamicLine = ({\n line: {\n key,\n timeSpan,\n channels: { x, y },\n ...props\n },\n}: {\n line: DynamicLineProps;\n}): ReactElement => {\n const keepFor = Number(timeSpan.valueOf()) * 3;\n const yTelem = telem.streamChannelData({\n timeSpan,\n channel: y,\n keepFor,\n });\n const hasX = x != null && x !== 0;\n const xTelem = telem.streamChannelData({\n timeSpan,\n channel: hasX ? x : y,\n useIndexOfChannel: !hasX,\n keepFor,\n });\n return <Core.Line aetherKey={key} y={yTelem} x={xTelem} {...props} />;\n};\n\nconst StaticLine = ({\n line: {\n timeRange,\n key,\n channels: { x, y },\n ...props\n },\n}: {\n line: StaticLineProps;\n}): ReactElement => {\n const yTelem = telem.channelData({ timeRange, channel: y });\n const hasX = x != null && x !== 0;\n const xTelem = telem.channelData({\n timeRange,\n channel: hasX ? x : y,\n useIndexOfChannel: !hasX,\n });\n return <Core.Line aetherKey={key} y={yTelem} x={xTelem} {...props} />;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useCallback,\n useContext,\n} from \"react\";\n\nimport {\n type connection,\n Synnax,\n type SynnaxProps,\n TimeSpan,\n} from \"@synnaxlabs/client\";\nimport { caseconv } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { useAsyncEffect, useCombinedStateAndRef } from \"@/hooks\";\nimport { Status } from \"@/status\";\nimport { synnax } from \"@/synnax/aether\";\n\nconst Context = createContext<synnax.ContextValue>(synnax.ZERO_CONTEXT_VALUE);\n\nexport const use = (): Synnax | null => useContext(Context).synnax;\n\nexport const useConnectionState = (): connection.State => useContext(Context).state;\n\nexport interface ProviderProps extends PropsWithChildren {\n connParams?: SynnaxProps;\n}\n\nconst CONNECTION_STATE_VARIANT: Record<connection.Status, Status.Variant> = {\n connected: \"success\",\n connecting: \"info\",\n disconnected: \"info\",\n failed: \"error\",\n};\n\nexport const Provider = Aether.wrap<ProviderProps>(\n synnax.Provider.TYPE,\n ({ aetherKey, connParams, children }): ReactElement => {\n const [state, setState, ref] = useCombinedStateAndRef<synnax.ContextValue>(\n synnax.ZERO_CONTEXT_VALUE,\n );\n\n const [{ path }, , setAetherState] = Aether.use({\n aetherKey,\n type: synnax.Provider.TYPE,\n schema: synnax.Provider.stateZ,\n initialState: { props: connParams ?? null, state: null },\n });\n\n const add = Status.useAggregator();\n\n const handleChange = useCallback(\n (state: connection.State) => {\n if (ref.current.state.status !== state.status) {\n add({\n variant: CONNECTION_STATE_VARIANT[state.status],\n message: state.message ?? caseconv.capitalize(state.status),\n });\n }\n setState((prev) => ({ ...prev, state }));\n },\n [add],\n );\n\n useAsyncEffect(async () => {\n if (state.synnax != null) state.synnax.close();\n if (connParams == null) return setState(synnax.ZERO_CONTEXT_VALUE);\n\n const c = new Synnax({\n ...connParams,\n connectivityPollFrequency: TimeSpan.seconds(5),\n });\n\n setState({\n synnax: c,\n state: {\n clusterKey: \"\",\n status: \"connecting\",\n message: \"Connecting...\",\n },\n });\n\n const connectivity = await c.connectivity.check();\n\n setState({\n synnax: c,\n state: connectivity,\n });\n add({\n variant: CONNECTION_STATE_VARIANT[connectivity.status],\n message: connectivity.message ?? connectivity.status.toUpperCase(),\n });\n\n c.connectivity.onChange(handleChange);\n\n setAetherState({ props: connParams, state: connectivity });\n\n return () => {\n c.close();\n setState(synnax.ZERO_CONTEXT_VALUE);\n setAetherState({ props: null, state: null });\n };\n }, [connParams, handleChange]);\n\n return (\n <Context.Provider value={state}>\n <Aether.Composite path={path}>{children}</Aether.Composite>\n </Context.Provider>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n useState,\n type PropsWithChildren,\n type ReactElement,\n useCallback,\n createContext,\n useContext as reactUseContext,\n} from \"react\";\n\nimport { type channel, type ranger } from \"@synnaxlabs/client\";\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Button } from \"@/button\";\nimport { useAsyncEffect } from \"@/hooks\";\nimport { Input } from \"@/input\";\nimport { Synnax } from \"@/synnax\";\nimport { Text } from \"@/text\";\n\ninterface AliasContextValue {\n aliases: Record<channel.Key, string>;\n getName: (key: channel.Key) => Promise<string | undefined>;\n setAlias: ((key: channel.Key, alias: string) => Promise<void>) | null;\n activeRange?: string | null;\n}\n\nconst AliasContext = createContext<AliasContextValue>({\n aliases: {},\n getName: async () => await Promise.resolve(undefined),\n setAlias: null,\n});\n\nexport const useContext = (): AliasContextValue => {\n return reactUseContext(AliasContext);\n};\n\nexport interface AliasProviderProps extends PropsWithChildren {\n activeRange?: string | null;\n}\n\nexport const useAlias = (key: channel.Key): string | null => {\n const { aliases } = reactUseContext(AliasContext);\n return aliases[key] ?? null;\n};\n\nexport const useAliases = (): Record<channel.Key, string> => {\n const { aliases } = reactUseContext(AliasContext);\n return aliases;\n};\n\nexport const useName = (key: channel.Key, def: string = \"\"): string => {\n const { getName } = reactUseContext(AliasContext);\n const [name, setName] = useState(def);\n useAsyncEffect(async () => {\n const n = await getName(key);\n if (n != null) setName(n);\n }, [key, getName]);\n return name;\n};\n\nexport const useActiveRange = (): string | undefined => {\n const { activeRange } = reactUseContext(AliasContext);\n return activeRange ?? undefined;\n};\n\nexport const AliasProvider = ({\n activeRange,\n children,\n}: AliasProviderProps): ReactElement => {\n const c = Synnax.use();\n const [aliases, setAliases] = useState<Record<channel.Key, string>>({});\n\n const handleAliasChange = useCallback(\n (changes: ranger.AliasChange[]) => {\n setAliases((aliases) => {\n const newAliases = { ...aliases };\n changes.forEach(({ variant, key, value }) => {\n const channelKey = Number(key.split(\"---\")[1]);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n if (variant === \"delete\") delete newAliases[channelKey];\n else newAliases[value.channel] = value.alias;\n });\n return newAliases;\n });\n },\n [setAliases],\n );\n\n const setAlias = useCallback(\n async (key: channel.Key, alias: string) => {\n if (c == null || activeRange == null) return;\n const r = await c.ranges.retrieve(activeRange);\n await r.setAlias(key, alias);\n },\n [c, activeRange],\n );\n\n const getName = useCallback(\n async (key: channel.Key): Promise<string | undefined> => {\n if (c == null || key === 0) return undefined;\n const alias = aliases[key];\n if (alias != null) return alias;\n return (await c.channels.retrieve(key)).name;\n },\n [aliases, c],\n );\n\n useAsyncEffect(async () => {\n if (c == null || activeRange == null) {\n setAliases({});\n return;\n }\n const r = await c.ranges.retrieve(activeRange);\n const aliases = await r.listAliases();\n setAliases(aliases);\n const tracker = await r.openAliasTracker();\n const disconnect = tracker.onChange(handleAliasChange);\n return () => {\n disconnect();\n void tracker.close();\n };\n }, [c, activeRange]);\n\n return (\n <AliasContext.Provider\n value={{\n aliases,\n activeRange,\n setAlias: activeRange != null ? setAlias : null,\n getName,\n }}\n >\n {children}\n </AliasContext.Provider>\n );\n};\n\nexport interface AliasInputProps extends Input.TextProps {\n channelKey: channel.Key;\n shadow?: boolean;\n}\n\nexport const AliasInput = ({\n channelKey,\n value,\n shadow,\n className,\n ...props\n}: AliasInputProps): ReactElement => {\n const [loading, setLoading] = useState(false);\n const { setAlias } = useContext();\n const alias = useAlias(channelKey);\n const name = useName(channelKey);\n let icon = <Icon.Rename />;\n if (loading) icon = <Icon.Loading />;\n else if (alias === value) icon = <Icon.Check />;\n const canSetAlias =\n setAlias != null && !loading && alias !== value && channelKey !== 0;\n const handleSetAlias = (): void => {\n if (!canSetAlias) return;\n void (async () => {\n setLoading(true);\n await setAlias(channelKey, value);\n setLoading(false);\n })();\n };\n\n const handleSetValueToAlias = (): void => {\n if (alias == null) return;\n props.onChange?.(alias);\n };\n\n const SetAliasTooltip = (): ReactElement => {\n if (channelKey === 0)\n return (\n <Text.Text level=\"small\">\n Select a channel to enable alias syncing with this label\n </Text.Text>\n );\n if (setAlias == null)\n return (\n <Text.Text level=\"small\">\n Select a range to enable alias syncing with this label\n </Text.Text>\n );\n if (value.length === 0)\n return (\n <Text.Text level=\"small\">\n Enter a value to enable alias syncing with this label\n </Text.Text>\n );\n if (alias === value)\n return <Text.Text level=\"small\">Alias synced with this label</Text.Text>;\n return <Text.Text level=\"small\">Sync alias for {name} with this label</Text.Text>;\n };\n\n return (\n <Input.Text value={value} {...props}>\n {canSetAlias && (\n <Button.Icon\n onClick={handleSetValueToAlias}\n tooltip={<Text.Text level=\"small\">Set {name} as label</Text.Text>}\n tooltipLocation={{ y: \"top\" }}\n variant=\"outlined\"\n >\n <Icon.Sync />\n </Button.Icon>\n )}\n <Button.Icon\n onClick={handleSetAlias}\n disabled={!canSetAlias}\n tooltip={<SetAliasTooltip />}\n tooltipLocation={{ y: \"top\" }}\n variant=\"outlined\"\n >\n {icon}\n </Button.Icon>\n </Input.Text>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type DragEvent, type ReactElement, useCallback, useId, useMemo } from \"react\";\n\nimport { type channel } from \"@synnaxlabs/client\";\nimport { nullToArr, toArray, unique } from \"@synnaxlabs/x\";\n\nimport { useActiveRange, useAliases } from \"@/channel/AliasProvider\";\nimport { HAUL_TYPE } from \"@/channel/types\";\nimport { CSS } from \"@/css\";\nimport { Haul } from \"@/haul\";\nimport { type DraggingState } from \"@/haul/Haul\";\nimport { type List } from \"@/list\";\nimport { Select } from \"@/select\";\nimport { Status } from \"@/status\";\nimport { Synnax } from \"@/synnax\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\n\nconst channelColumns: Array<List.ColumnSpec<channel.Key, channel.Payload>> = [\n {\n key: \"name\",\n name: \"Name\",\n },\n {\n key: \"alias\",\n name: \"Alias\",\n },\n {\n key: \"rate\",\n name: \"Rate\",\n },\n {\n key: \"dataType\",\n name: \"Data Type\",\n },\n {\n key: \"index\",\n name: \"Index\",\n },\n {\n key: \"key\",\n name: \"Key\",\n },\n {\n key: \"isIndex\",\n name: \"Is Index\",\n },\n];\n\nconst canDrop = (\n { items: entities }: DraggingState,\n value: channel.Key[] | readonly channel.Key[],\n): boolean => {\n const f = Haul.filterByType(HAUL_TYPE, entities);\n return f.length > 0 && !f.every((h) => value.includes(h.key as channel.Key));\n};\n\nexport interface SelectMultipleProps\n extends Omit<\n Select.MultipleProps<channel.Key, channel.Payload>,\n \"columns\" | \"searcher\"\n > {\n columns?: string[];\n searchOptions?: channel.RetrieveOptions;\n}\n\nconst DEFAULT_FILTER = [\"name\", \"alias\"];\n\nconst useColumns = (\n filter: string[],\n): Array<List.ColumnSpec<channel.Key, channel.Payload>> => {\n const aliases = useAliases();\n return useMemo(() => {\n if (filter.length === 0) return channelColumns;\n return channelColumns.filter((column) => filter.includes(column.key));\n }, [filter, aliases]);\n};\n\nexport const SelectMultiple = ({\n columns: filter = DEFAULT_FILTER,\n onChange,\n className,\n value,\n searchOptions,\n ...props\n}: SelectMultipleProps): ReactElement => {\n const client = Synnax.use();\n const aliases = useAliases();\n const columns = useColumns(filter);\n const activeRange = useActiveRange();\n const memoSearchOptions = useMemoDeepEqualProps(searchOptions);\n const searcher = useMemo(\n () =>\n client?.channels.newSearcherWithOptions({\n rangeKey: activeRange,\n internal: false,\n ...memoSearchOptions,\n }),\n [client, activeRange, memoSearchOptions],\n );\n const emptyContent =\n client != null ? undefined : (\n <Status.Text.Centered variant=\"error\" level=\"h4\" style={{ height: 150 }}>\n No client available\n </Status.Text.Centered>\n );\n\n const {\n startDrag,\n onDragEnd: endDrag,\n ...dropProps\n } = Haul.useDragAndDrop({\n type: \"Channel.SelectMultiple\",\n canDrop: useCallback((hauled) => canDrop(hauled, toArray(value)), [value]),\n onDrop: useCallback(\n ({ items }) => {\n const dropped = Haul.filterByType(HAUL_TYPE, items);\n if (dropped.length === 0) return [];\n const v = unique([\n ...toArray(value),\n ...(dropped.map((c) => c.key) as channel.Keys),\n ]);\n onChange(v, {\n clickedIndex: null,\n clicked: null,\n entries: [],\n });\n return dropped;\n },\n [onChange, value],\n ),\n });\n const dragging = Haul.useDraggingState();\n\n const handleSuccessfulDrop = useCallback(\n ({ dropped }: Haul.OnSuccessfulDropProps) => {\n onChange(\n toArray(value).filter((key) => !dropped.some((h) => h.key === key)),\n {\n clickedIndex: null,\n clicked: null,\n entries: [],\n },\n );\n },\n [onChange, value],\n );\n\n const onDragStart = useCallback(\n (_: DragEvent<HTMLDivElement>, key: channel.Key) =>\n startDrag([{ key, type: HAUL_TYPE }], handleSuccessfulDrop),\n [startDrag, handleSuccessfulDrop],\n );\n\n const entryRenderKey = useCallback(\n (e: channel.Payload) => aliases[e.key] ?? e.name,\n [aliases],\n );\n\n return (\n <Select.Multiple\n className={CSS(className, CSS.dropRegion(canDrop(dragging, toArray(value))))}\n value={value}\n onTagDragStart={onDragStart}\n onTagDragEnd={endDrag}\n searcher={searcher}\n onChange={onChange}\n columns={columns}\n emptyContent={emptyContent}\n entryRenderKey={entryRenderKey}\n {...dropProps}\n {...props}\n />\n );\n};\n\nexport interface SelectSingleProps\n extends Omit<Select.SingleProps<channel.Key, channel.Payload>, \"columns\"> {\n columns?: string[];\n searchOptions?: channel.RetrieveOptions;\n}\n\nexport const SelectSingle = ({\n columns: filter = DEFAULT_FILTER,\n onChange,\n value,\n className,\n data,\n searchOptions,\n ...props\n}: SelectSingleProps): ReactElement => {\n const client = Synnax.use();\n const aliases = useAliases();\n const columns = useColumns(filter);\n const activeRange = useActiveRange();\n const memoSearchOptions = useMemoDeepEqualProps(searchOptions);\n const searcher = useMemo(() => {\n if (data != null && data.length > 0) return undefined;\n return client?.channels.newSearcherWithOptions({\n rangeKey: activeRange,\n internal: false,\n ...memoSearchOptions,\n });\n }, [client, activeRange, data?.length, memoSearchOptions]);\n\n const emptyContent =\n client != null ? undefined : (\n <Status.Text.Centered variant=\"error\" level=\"h4\" style={{ height: 150 }}>\n No client available\n </Status.Text.Centered>\n );\n\n const id = useId();\n const sourceAndTarget: Haul.Item = useMemo(\n () => ({ key: id, type: \"Channel.SelectMultiple\" }),\n [id],\n );\n\n const {\n startDrag,\n onDragEnd: endDrag,\n ...dragProps\n } = Haul.useDragAndDrop({\n type: \"Channel.SelectSingle\",\n canDrop: useCallback((hauled) => canDrop(hauled, nullToArr(value)), [value]),\n onDrop: useCallback(\n ({ items }) => {\n const ch = Haul.filterByType(HAUL_TYPE, items);\n if (ch.length === 0) return [];\n onChange(ch[0].key as channel.Key, {\n clickedIndex: null,\n clicked: null,\n entries: [],\n });\n return ch;\n },\n [sourceAndTarget, onChange],\n ),\n });\n\n const dragging = Haul.useDraggingState();\n const onDragStart = useCallback(\n () => value != null && startDrag([{ type: HAUL_TYPE, key: value }]),\n [startDrag, value],\n );\n\n const entryRenderKey = useCallback(\n (e: channel.Payload) => aliases[e.key] ?? e.name,\n [aliases],\n );\n\n return (\n <Select.Single\n data={data}\n className={CSS(className, CSS.dropRegion(canDrop(dragging, nullToArr(value))))}\n value={value}\n onDragStart={onDragStart}\n onDragEnd={endDrag}\n onChange={onChange}\n searcher={searcher}\n columns={columns}\n emptyContent={emptyContent}\n entryRenderKey={entryRenderKey}\n {...dragProps}\n {...props}\n />\n );\n};\n","import { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { Status } from \"@/status\";\nimport { PropsWithChildren } from \"react\";\nimport \"@/note/Note.css\";\n\nexport interface NoteProps extends Align.SpaceProps<\"div\"> {\n variant: Status.Variant;\n}\n\nexport const Note = ({\n variant,\n className,\n children,\n ...props\n}: NoteProps): JSX.Element => (\n <Align.Space\n className={CSS(className, CSS.B(\"note\"), CSS.M(variant))}\n align=\"stretch\"\n empty\n {...props}\n >\n {children}\n </Align.Space>\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { deep, type direction, type location, type spatial } from \"@synnaxlabs/x\";\n\nimport { type Node } from \"@/mosaic/types\";\nimport { Tabs } from \"@/tabs\";\n\nconst TabNotFound = new Error(\"Tab not found\");\nconst InvalidMosaic = new Error(\"Invalid Mosaic\");\n\n/**\n * Inserts a tab into a node in the mosaic. If the given key is not found,\n * the tab is inserted into the closest ancestor. This is to deal\n * with mosaic garbage collection.\n *\n * @param key - The key of the node to insert the tab into.\n * @param tab - The tab to insert.\n * @param loc - The location where the tab was 'dropped' relative to the node.\n */\nexport const insertTab = (\n root: Node,\n tab: Tabs.Tab,\n loc: location.Location = \"center\",\n key?: number,\n): Node => {\n root = shallowCopyNode(root);\n if (key === undefined) return insertAnywhere(root, tab);\n\n const node = findNodeOrAncestor(root, key);\n\n // In the case where we're dropping the node in the center,\n // simply add the tab, change the selection, and return.\n if (loc === \"center\") {\n node.tabs?.push(tab);\n node.selected = tab.tabKey;\n return root;\n }\n\n // If we're not dropping the tab in the center,\n // and we have no tabs in the current node,\n // we can't split the node (because one side would be empty),\n // so we do nothing.\n if (node.tabs == null || node.tabs.length === 0) return root;\n\n const [insertOrder, siblingOrder, dir] = splitArrangement(loc);\n node.direction = dir;\n\n node[insertOrder] = { key: 0, tabs: [tab], selected: tab.tabKey };\n node[siblingOrder] = { key: 0, tabs: node.tabs, selected: node.selected };\n\n if (node.first == null || node.last == null) throw InvalidMosaic;\n\n // Assigning these keeps the mosaic sorted so we can do ancestor searches.\n node.first.key = node.key * 2;\n node.last.key = node.key * 2 + 1;\n\n // Clear the previous node, as it's now been and is not used\n // for rendering.\n node.tabs = undefined;\n node.size = undefined;\n node.selected = undefined;\n\n return root;\n};\n\nconst insertAnywhere = (root: Node, tab: Tabs.Tab): Node => {\n root = shallowCopyNode(root);\n if (root.tabs != null) {\n root.tabs.push(tab);\n root.selected = tab.tabKey;\n return root;\n }\n if (root.first != null) root.first = insertAnywhere(root.first, tab);\n else if (root.last != null) root.last = insertAnywhere(root.last, tab);\n return root;\n};\n\n/**\n * Automatically selects tabs for all nodes in the mosaic if they don't already have\n * a selection.\n *\n * @param root - The root of the mosaic.\n * @returns A shallow copy of the root with all nodes having a selection.\n */\nexport const autoSelectTabs = (root: Node): [Node, string[]] => {\n root = shallowCopyNode(root);\n const selected: string[] = [];\n if (root.tabs != null) {\n root.selected = Tabs.resetSelection(root.selected, root.tabs);\n if (root.selected != null) selected.push(root.selected);\n }\n if (root.first != null) {\n const [f, s] = autoSelectTabs(root.first);\n root.first = f;\n selected.push(...s);\n }\n if (root.last != null) {\n const [r, l] = autoSelectTabs(root.last);\n root.last = r;\n selected.push(...l);\n }\n return [root, selected];\n};\n\n/**\n * Removes a tab from the mosaic and performs any necessary garbage collection.\n *\n * @param root - The root of the mosaic.\n * @param tabKey - The key of the tab to remove. This tab must exist in the mosaic.\n */\nexport const removeTab = (root: Node, tabKey: string): [Node, string | null] => {\n root = shallowCopyNode(root);\n const [, node] = findMosaicTab(root, tabKey);\n if (node == null) return [root, null];\n node.tabs = node.tabs?.filter((t) => t.tabKey !== tabKey);\n node.selected = Tabs.resetSelection(node.selected, node.tabs);\n root = gc(root);\n const selected = node.selected ?? findSelected(root);\n return [root, selected];\n};\n\nexport const findSelected = (root: Node): string | null => {\n if (root.selected != null) return root.selected;\n if (root.first != null) return findSelected(root.first);\n if (root.last != null) return findSelected(root.last);\n return null;\n};\n\n/**\n * Marks the given tab as selected.\n *\n * @param root - The root of the mosaic.\n * @param tabKey - The key of the tab to select. This tab must exist in the mosaic.\n * @returns A shallow copy of the root of the mosaic with the tab selected.\n */\nexport const selectTab = (root: Node, tabKey: string): Node => {\n root = shallowCopyNode(root);\n const [tab, entry] = findMosaicTab(root, tabKey);\n if (tab == null || entry == null) throw TabNotFound;\n entry.selected = tabKey;\n return root;\n};\n\n/**\n * Moves a tab from one node to another.\n *\n * @param root - The root of the mosaic.\n * @param to - The key of the node to move the tab to.\n * @param tabKey - The key of the tab to move. This tab must exist in the mosaic.\n * @param loc - The location where the tab was 'dropped' relative to the node.\n * @returns A shallow copy of the root of the mosaic with the tab moved.\n */\nexport const moveTab = (\n root: Node,\n tabKey: string,\n loc: location.Location,\n to: number,\n): [Node, string | null] => {\n root = shallowCopyNode(root);\n const [tab, entry] = findMosaicTab(root, tabKey);\n if (tab == null || entry == null) throw TabNotFound;\n const [r2, selected] = removeTab(root, tabKey);\n const r3 = insertTab(r2, tab, loc, to);\n return [r3, selected];\n};\n\n/**\n * Resizes the given mosaic leaf.\n *\n * @param root - The root of the mosaic.\n * @param key - The key of the leaf to resize.\n * @param size - The new size distribution for the leaf. Expressed as either a percentage\n * or a number of pixels of the first child.\n * @returns A shallow copy of the root of the mosaic with the leaf resized.\n */\nexport const resizeNode = (root: Node, key: number, size: number): Node => {\n const node = findMosaicNode(root, key);\n if (node == null) throw new Error(\"Node not found\");\n else node.size = size;\n return root;\n};\n\n/**\n * Sets the title of a tab.\n *\n * @param root - The root of the mosaic.\n * @param tabKey - The key of the tab to resize.\n * @param name - The new title of the tab.\n * @returns A shallow copy of the root of the mosaic with the tab title changed.\n */\nexport const renameTab = (root: Node, tabKey: string, name: string): Node => {\n root = shallowCopyNode(root);\n const [, leaf] = findMosaicTab(root, tabKey);\n if (leaf?.tabs == null) throw TabNotFound;\n leaf.tabs = Tabs.rename(tabKey, name, leaf?.tabs ?? []);\n return root;\n};\n\n/***\n * @returns True if the given mosaic node is empty, false otherwise.\n */\nexport const isEmpty = (root: Node): boolean => {\n if (root.tabs != null) return root.tabs.length === 0;\n return root.first == null && root.last == null;\n};\n\n/** Finds the node with the given key or its closest ancestor. */\nconst findNodeOrAncestor = (root: Node, key: number): Node => {\n const node = findMosaicNode(root, key);\n if (node != null) return node;\n const next = Math.floor(key / 2);\n return next === 0 ? root : findNodeOrAncestor(root, next);\n};\n\nconst gc = (root: Node): Node => {\n let gced = true;\n while (gced) [root, gced] = _gc(root);\n if (root.first == null && root.last == null) root.key = 1;\n return root;\n};\n\nconst _gc = (node: Node): [Node, boolean] => {\n if (node.first == null || node.last == null) return [node, false];\n if (shouldGc(node.first)) return [liftUp(node.last, true), true];\n if (shouldGc(node.last)) return [liftUp(node.first, false), true];\n let [sGC, eGC] = [false, false];\n [node.first, sGC] = _gc(node.first);\n [node.last, eGC] = _gc(node.last);\n return [node, sGC || eGC];\n};\n\nconst liftUp = (node: Node, isLast: boolean): Node => {\n node.size = undefined;\n node.key = (node.key - Number(isLast)) / 2;\n return node;\n};\n\nconst shouldGc = (node: Node): boolean =>\n node.first == null &&\n node.last == null &&\n (node.tabs == null || node.tabs.length === 0);\n\nconst findMosaicTab = (\n node: Node,\n tabKey: string,\n): [Tabs.Tab | undefined, Node | undefined] => {\n if (node.tabs != null) {\n const tab = node.tabs.find((t) => t.tabKey === tabKey);\n if (tab != null) return [tab, node];\n }\n if (node.first == null || node.last == null) return [undefined, undefined];\n const [t1Tab, t2Tree] = findMosaicTab(node.first, tabKey);\n if (t1Tab != null && t2Tree != null) return [t1Tab, t2Tree];\n const [t2Tab, t2Tree2] = findMosaicTab(node.last, tabKey);\n return [t2Tab, t2Tree2];\n};\n\nconst findMosaicNode = (node: Node, key: number): Node | undefined => {\n if (node.key === key) return node;\n if (node.first == null || node.last == null) return undefined;\n const n1 = findMosaicNode(node.first, key);\n if (n1 != null) return n1;\n return findMosaicNode(node.last, key);\n};\n\nconst splitArrangement = (\n insertPosition: location.Location,\n): [spatial.Order, spatial.Order, direction.Direction] => {\n switch (insertPosition) {\n case \"top\":\n return [\"first\", \"last\", \"y\"];\n case \"left\":\n return [\"first\", \"last\", \"x\"];\n case \"bottom\":\n return [\"last\", \"first\", \"y\"];\n case \"right\":\n return [\"last\", \"first\", \"x\"];\n case \"center\":\n throw new Error(\"cannot split a center placed tab\");\n }\n};\n\nconst shallowCopyNode = (node: Node): Node => deep.copy(node);\n\nexport const mapNodes = <O>(root: Node, fn: (node: Node) => O, acc: O[] = []): O[] => {\n acc.push(fn(root));\n if (root.first != null) mapNodes(root.first, fn, acc);\n if (root.last != null) mapNodes(root.last, fn, acc);\n return acc;\n};\n","import { createRef, useEffect, useRef } from \"react\";\n\nimport { createPortal } from \"react-dom\";\n\ntype NodeProps = Record<string, string>;\n\nexport class Node {\n parent: ParentNode | undefined;\n stub: HTMLElement | undefined;\n el: HTMLElement;\n\n constructor(props: NodeProps = {}) {\n this.el = document.createElement(\"div\");\n Object.entries(props).forEach(([k, v]) => this.el.setAttribute(k, v));\n }\n\n mount(to: ParentNode, stub: HTMLElement): void {\n if (stub === this.stub) return;\n this.unmount(null);\n to.replaceChild(this.el, stub);\n this.parent = to;\n this.stub = stub;\n }\n\n unmount(stub: HTMLElement | null): void {\n // Skip unmounts for placeholders that aren't currently mounted\n // They will have been automatically unmounted already by a subsequent mount()\n if (\n (stub != null && stub !== this.stub) ||\n this.parent == null ||\n this.stub == null\n )\n return;\n this.parent.replaceChild(this.stub, this.el);\n this.parent = undefined;\n this.stub = undefined;\n }\n}\n\nexport interface OutProps {\n node: Node;\n}\n\nexport const Out = ({ node }: OutProps): React.ReactElement => {\n const stub = createRef<HTMLDivElement>();\n const portal = useRef<Node>(node);\n useEffect(() => {\n const placeholder = stub.current;\n if (placeholder == null) return;\n const parent = placeholder.parentNode;\n if (parent == null) return;\n node.mount(parent, placeholder);\n return () => {\n if (stub.current != null) node.unmount(stub.current);\n };\n }, []);\n useEffect(() => {\n if (portal.current != null && node !== portal.current) {\n portal.current.unmount(stub.current);\n portal.current = node;\n }\n const placeholder = stub.current;\n if (placeholder == null) return;\n const parent = placeholder.parentNode;\n if (parent == null) return;\n node.mount(parent, placeholder);\n }, [node]);\n return <div ref={stub} />;\n};\n\ninterface InProps extends OutProps {\n children: React.ReactNode;\n}\n\nexport const In = ({ node, children }: InProps): React.ReactElement =>\n createPortal(children, node.el);\n","// Copyright 2023 Synnax Lab, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n useState,\n memo,\n useCallback,\n type ReactElement,\n useRef,\n type MutableRefObject,\n} from \"react\";\n\nimport { type box, type location } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Haul } from \"@/haul\";\nimport { type CanDrop } from \"@/haul/Haul\";\nimport { mapNodes } from \"@/mosaic/tree\";\nimport { type Node } from \"@/mosaic/types\";\nimport { Portal } from \"@/portal\";\nimport { Resize } from \"@/resize\";\nimport { Tabs } from \"@/tabs\";\n\nimport \"@/mosaic/Mosaic.css\";\n\n/** Props for the {@link Mosaic} component */\nexport interface MosaicProps\n extends Omit<\n Tabs.TabsProps,\n \"onDrop\" | \"tabs\" | \"onResize\" | \"onCreate\" | \"children\"\n > {\n root: Node;\n onDrop: (key: number, tabKey: string, loc: location.Location) => void;\n onResize: (key: number, size: number) => void;\n onCreate?: (key: number, loc: location.Location, tabKeys?: string[]) => void;\n children: Tabs.TabRenderProp;\n}\n\nexport const Mosaic = memo(({ children, ...props }: MosaicProps): ReactElement => {\n const ref = useRef<Map<string, Portal.Node>>(new Map());\n const existing = new Set<string>();\n const portaledNodes = mapNodes(props.root, (node) => {\n if (node.selected == null) return null;\n let pNode: Portal.Node | undefined = ref.current.get(node.selected);\n const tab = node.tabs?.find((t) => t.tabKey === node.selected);\n if (tab == null) return null;\n if (pNode == null) {\n pNode = new Portal.Node({\n style: \"width: 100%; height: 100%; position: relative;\",\n });\n // Events don't propagate upward from the portaled node, so we need to bind\n // the onsSelect handler here.\n pNode.el.addEventListener(\"click\", () => props.onSelect?.(tab.tabKey));\n ref.current.set(node.selected, pNode);\n }\n existing.add(node.selected);\n return (\n <Portal.In key={tab.tabKey} node={pNode}>\n {children(tab)}\n </Portal.In>\n );\n });\n ref.current.forEach((_, key) => !existing.has(key) && ref.current.delete(key));\n\n return (\n <>\n {portaledNodes}\n <MosaicInternal portalNodes={ref} {...props} />\n </>\n );\n});\n\ninterface MosaicInternalProps extends Omit<MosaicProps, \"children\"> {\n portalNodes: MutableRefObject<Map<string, Portal.Node>>;\n}\n\n/***\n * Mosaic renders a tree of tab panes, with the ability to drag and drop tabs to\n * different locations in the tree as well as resize the panes (think of your typical\n * code editor). This component should be used in conjunction with the Mosaic.use hook\n * to implement the mosaic logic and maintain the state.\n *\n * @param props - The props for the Mosaic component. All props not listed below are\n * passed to the Tabs component of each set of tabs in the mosaic.\n * @param props.root - The root of the mosaic tree. This prop is provided by the\n * Mosaic.use hook.\n * @param props.onDrop - The callback executed when a tab is dropped in a new location.\n * This prop is provided by the Mosaic.use hook.\n * @param props.onResize - The callback executed when a pane is resized. This prop is\n * provided by the Mosaic.use hook.\n */\nconst MosaicInternal = memo((props: MosaicInternalProps): ReactElement | null => {\n const { onResize, ...tabsProps } = props;\n const {\n root: { tabs, direction, first, last, key, size },\n emptyContent,\n ...childProps\n } = tabsProps;\n\n const handleResize = useCallback(\n ([size]: number[]) => onResize(key, size),\n [onResize],\n );\n\n const { props: resizeProps } = Resize.useMultiple({\n direction,\n onResize: handleResize,\n count: 2,\n initialSizes: size != null ? [size] : undefined,\n });\n\n let content: ReactElement | null;\n if (tabs !== undefined)\n content = <TabLeaf emptyContent={emptyContent} {...tabsProps} />;\n else if (first != null && last != null)\n content = (\n <Resize.Multiple\n align=\"stretch\"\n className={CSS.BE(\"mosaic\", \"resize\")}\n {...resizeProps}\n >\n <MosaicInternal\n key={first.key}\n {...childProps}\n root={first}\n onResize={onResize}\n />\n <MosaicInternal\n key={last.key}\n {...childProps}\n root={last}\n onResize={onResize}\n />\n </Resize.Multiple>\n );\n else {\n content = null;\n console.warn(\"Mosaic tree is malformed\");\n }\n\n return key === 1 ? <Haul.Provider>{content}</Haul.Provider> : content;\n});\nMosaic.displayName = \"Mosaic\";\nMosaicInternal.displayName = \"Mosaic\";\n\ninterface TabLeafProps extends Omit<MosaicInternalProps, \"onResize\"> {}\n\n/**\n * This type should be used when the user wants to drop a tab in the mosaic.\n * Dropping an item with this signature will call the {@link Mosaic} onDrop handler.\n */\nexport const HAUL_DROP_TYPE = \"pluto-mosaic-tab-drop\";\n/** This type should be used when the user wants to create a new tab in the mosaic. \nDropping an item with this signature will call the {@link Mosaic} onCreate handler. */\nexport const HAUL_CREATE_TYPE = \"pluto-mosaic-tab-create\";\n\n/** Checks whether the tab can actually be dropped in this location or not */\nconst validDrop = (tabs: Tabs.Tab[], dragging: Haul.Item[]): boolean => {\n const drop = Haul.filterByType(HAUL_DROP_TYPE, dragging).map((t) => t.key);\n const willHaveTabRemaining = tabs.filter((t) => !drop.includes(t.tabKey)).length > 0;\n const create = Haul.filterByType(HAUL_CREATE_TYPE, dragging);\n return (\n create.length > 0 ||\n (drop.length > 0 && (willHaveTabRemaining || tabs.length === 0))\n );\n};\n\nconst TabLeaf = memo(\n ({\n root: node,\n onDrop,\n onCreate,\n portalNodes,\n ...props\n }: TabLeafProps): ReactElement => {\n const { key, tabs } = node as Omit<Node, \"tabs\"> & { tabs: Tabs.Tab[] };\n\n const [dragMask, setDragMask] = useState<location.Location | null>(null);\n\n const canDrop: CanDrop = useCallback(({ items }) => validDrop(tabs, items), [tabs]);\n\n const handleDrop = useCallback(\n ({ items, event }: Haul.OnDropProps): Haul.Item[] => {\n setDragMask(null);\n const dropped = Haul.filterByType(HAUL_DROP_TYPE, items);\n const loc =\n tabs.length === 0 ? \"center\" : insertLocation(getDragLocationPercents(event));\n if (dropped.length > 0) {\n const tabKey = dropped.map(({ key }) => key)[0];\n onDrop(key, tabKey as string, loc);\n }\n const created = Haul.filterByType(HAUL_CREATE_TYPE, items);\n if (created.length > 0) {\n const tabKey = created.map(({ key }) => key);\n onCreate?.(key, loc, tabKey as string[]);\n }\n return dropped;\n },\n [onDrop, tabs.length],\n );\n\n const handleDragOver = useCallback(\n ({ event }: Haul.OnDragOverProps): void => {\n const location: location.Location =\n tabs.length === 0 ? \"center\" : insertLocation(getDragLocationPercents(event));\n setDragMask(location);\n },\n [tabs.length],\n );\n\n const { startDrag, ...haulProps } = Haul.useDragAndDrop({\n type: \"Mosaic\",\n canDrop,\n onDrop: handleDrop,\n onDragOver: handleDragOver,\n });\n\n const dragging = canDrop(Haul.useDraggingState());\n\n const handleDragLeave = useCallback((): void => setDragMask(null), []);\n\n const handleDragStart = useCallback(\n (_: unknown, { tabKey }: Tabs.Tab): void =>\n startDrag([{ key: tabKey, type: HAUL_DROP_TYPE }]),\n [startDrag],\n );\n\n const handleTabCreate = useCallback((): void => onCreate?.(key, \"center\"), [key]);\n\n return (\n <div className={CSS.BE(\"mosaic\", \"leaf\")}>\n <Tabs.Tabs\n id={`tab-${key}`}\n tabs={tabs}\n onDragLeave={handleDragLeave}\n selected={node.selected}\n onDragStart={handleDragStart}\n onCreate={handleTabCreate}\n {...props}\n {...haulProps}\n >\n <Portal.Out\n node={portalNodes.current.get(node.selected as string) as Portal.Node}\n />\n {dragging && (\n <div\n style={{\n zIndex: 1000,\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n }}\n />\n )}\n </Tabs.Tabs>\n {dragMask != null && (\n <div className={CSS.BE(\"mosaic\", \"mask\")} style={maskStyle[dragMask]} />\n )}\n </div>\n );\n },\n);\n\nTabLeaf.displayName = \"MosaicTabLeaf\";\n\nconst maskStyle: Record<location.Location, box.CSS> = {\n top: { left: \"0%\", top: \"0%\", width: \"100%\", height: \"50%\" },\n bottom: { left: \"0%\", top: \"50%\", width: \"100%\", height: \"50%\" },\n left: { left: \"0%\", top: \"0%\", width: \"50%\", height: \"100%\" },\n right: { left: \"50%\", top: \"0%\", width: \"50%\", height: \"100%\" },\n center: { left: \"0%\", top: \"0%\", width: \"100%\", height: \"100%\" },\n};\n\nconst getDragLocationPercents = (\n e: React.DragEvent<Element>,\n): { px: number; py: number } => {\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n // This means we're in the selector.\n // TODO: This size depends on the theme and the size of the tabs,\n // we need to handle this better in the future.\n if (y < 24) return { px: 0.5, py: 0.5 };\n return { px: x / rect.width, py: y / rect.height };\n};\n\nconst crossHairA = (px: number): number => px;\n\nconst crossHairB = (px: number): number => 1 - px;\n\nconst insertLocation = ({ px, py }: { px: number; py: number }): location.Location => {\n if (px > 0.33 && px < 0.66 && py > 0.33 && py < 0.66) return \"center\";\n const [aY, bY] = [crossHairA(px), crossHairB(px)];\n if (py > aY && py > bY) return \"bottom\";\n if (py < aY && py < bY) return \"top\";\n if (py > aY && py < bY) return \"left\";\n if (py < aY && py > bY) return \"right\";\n throw new Error(\"[bug] - invalid insert position\");\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useEffect, useState } from \"react\";\n\nimport { type location } from \"@synnaxlabs/x\";\n\nimport {\n moveTab,\n removeTab,\n resizeNode,\n selectTab,\n renameTab,\n autoSelectTabs,\n} from \"@/mosaic/tree\";\nimport { type Node } from \"@/mosaic/types\";\n\nexport interface UseProps {\n allowRename?: boolean;\n initialTree: Node;\n}\n\nexport interface UseReturn {\n root: Node;\n onDrop: (key: number, tabKey: string, loc: location.Location) => void;\n onClose: (tabKey: string) => void;\n onSelect: (tabKey: string) => void;\n onResize: (key: number, sizes: number) => void;\n onRename?: (tabKey: string, name: string) => void;\n}\n\n/**\n * The Mosaic.use hook implements the state management and logic for the Mosaic\n * component. This hook should be used in conjunction with the Mosaic component.\n *\n * @param props - The props for the Mosaic.use hook.\n * @param props.initialValue - The initial root node of the mosaic tree. For\n * information on what this node should look like, see the {@link Node}\n * type.\n */\nexport const use = ({ allowRename = false, initialTree }: UseProps): UseReturn => {\n const [root, setRoot] = useState(initialTree);\n\n useEffect(() => setRoot(autoSelectTabs(initialTree)[0]), [initialTree]);\n\n const handleDrop = (key: number, tabKey: string, loc: location.Location): void =>\n setRoot((r) => moveTab(r, tabKey, loc, key)[0]);\n\n const handleClose = (tabKey: string): void => setRoot((r) => removeTab(r, tabKey)[0]);\n\n const handleSelect = (tabKey: string): void => setRoot((r) => selectTab(r, tabKey));\n\n const handleResize = (key: number, size: number): void =>\n setRoot((r) => resizeNode(r, key, size));\n\n const handleRename = (tabKey: string, title: string): void =>\n setRoot((r) => renameTab(r, tabKey, title));\n\n return {\n root,\n onDrop: handleDrop,\n onClose: handleClose,\n onSelect: handleSelect,\n onResize: handleResize,\n onRename: allowRename ? handleRename : undefined,\n };\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type PropsWithChildren, useCallback } from \"react\";\n\nimport { box } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { CSS } from \"@/css\";\nimport { useResize, useSyncedRef } from \"@/hooks\";\nimport { eraser } from \"@/vis/eraser/aether\";\n\nexport interface UseProps {\n aetherKey: string;\n}\n\nexport interface UseReturn {\n setEnabled: (enabled: boolean) => void;\n erase: (region: box.Box) => void;\n}\n\nexport const use = ({ aetherKey }: UseProps): UseReturn => {\n const [, { region }, setState] = Aether.use({\n aetherKey,\n type: eraser.Eraser.TYPE,\n schema: eraser.eraserStateZ,\n initialState: { region: box.ZERO, enabled: true },\n });\n const regionRef = useSyncedRef(region);\n const erase = useCallback(\n (b: box.Box) => {\n if (box.equals(b, regionRef.current)) return;\n setState((p) => ({ ...p, region: b }));\n },\n [setState],\n );\n const setEnabled = useCallback(\n (enabled: boolean) => setState((p) => ({ ...p, enabled })),\n [setState],\n );\n\n return { setEnabled, erase };\n};\n\nexport interface EraserProps extends PropsWithChildren {}\n\nexport const Eraser = Aether.wrap<EraserProps>(\n eraser.Eraser.TYPE,\n ({ aetherKey, children }) => {\n const { erase } = use({ aetherKey });\n const ref = useResize(erase);\n return (\n <div ref={ref} className={CSS(CSS.inheritDims())}>\n {children}\n </div>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useCallback, useState, useLayoutEffect } from \"react\";\n\nimport { type box, location } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { CSS } from \"@/css\";\nimport { type BarProps } from \"@/nav/Bar\";\nimport { Resize } from \"@/resize\";\nimport { Eraser } from \"@/vis/eraser\";\n\nimport \"@/nav/Drawer.css\";\n\nexport interface DrawerItem {\n key: string;\n content: ReactElement;\n minSize?: number;\n maxSize?: number;\n initialSize?: number;\n}\n\nexport interface UseDrawerProps {\n initialKey?: string;\n items: DrawerItem[];\n}\n\nexport interface UseDrawerReturn {\n activeItem?: DrawerItem;\n onSelect?: (key: string) => void;\n}\n\nexport interface DrawerProps\n extends Omit<BarProps, \"onSelect\" | \"onResize\">,\n UseDrawerReturn,\n Partial<Pick<Resize.SingleProps, \"onResize\" | \"collapseThreshold\">> {}\n\nexport const useDrawer = ({ items, initialKey }: UseDrawerProps): UseDrawerReturn => {\n const [activeKey, setActiveKey] = useState<string | undefined>(initialKey);\n const handleSelect = (key: string): void =>\n setActiveKey(key === activeKey ? undefined : key);\n const activeItem = items.find((item) => item.key === activeKey);\n return { onSelect: handleSelect, activeItem };\n};\n\nexport const Drawer = Aether.wrap<DrawerProps>(\n \"Nav.Drawer\",\n ({\n aetherKey,\n activeItem,\n children,\n onSelect,\n location: loc_ = \"left\",\n collapseThreshold = 0.65,\n className,\n onResize,\n ...props\n }): ReactElement | null => {\n const dir = location.direction(loc_);\n const handleCollapse = useCallback(\n () => activeItem != null && onSelect?.(activeItem.key),\n [onSelect, activeItem?.key],\n );\n const { erase, setEnabled } = Eraser.use({ aetherKey });\n const handleResize = useCallback(\n (size: number, box: box.Box) => {\n onResize?.(size, box);\n erase(box);\n },\n [onResize, erase],\n );\n useLayoutEffect(() => {\n setEnabled(activeItem != null);\n }, [activeItem, setEnabled]);\n if (activeItem == null) return null;\n const { content, key, ...rest } = activeItem;\n return (\n <Resize.Single\n key={key}\n className={CSS(CSS.BE(\"navdrawer\", \"content\"), CSS.dir(dir), className)}\n collapseThreshold={collapseThreshold}\n onCollapse={handleCollapse}\n location={loc_}\n onResize={handleResize}\n {...rest}\n {...props}\n >\n {activeItem.content}\n </Resize.Single>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type FunctionComponent, type ReactElement } from \"react\";\n\nimport { direction, location, type spatial } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\n\nimport \"@/nav/Bar.css\";\n\nexport interface BarProps extends Omit<Align.SpaceProps, \"direction\" | \"size\" | \"ref\"> {\n location?: location.Crude;\n size?: string | number;\n}\n\nconst CoreBar = ({\n location: location_ = \"left\",\n size = \"9rem\",\n className,\n style,\n ...props\n}: BarProps): ReactElement => {\n const loc = location.construct(location_);\n const dir = location.direction(loc);\n const oppositeDir = direction.swap(dir);\n return (\n <Align.Space\n className={CSS(\n CSS.B(\"navbar\"),\n CSS.bordered(location.swap(loc)),\n CSS.dir(oppositeDir),\n CSS.loc(loc),\n className,\n )}\n direction={oppositeDir}\n style={{\n [direction.dimension(dir)]: size,\n ...style,\n }}\n align=\"center\"\n empty\n {...props}\n />\n );\n};\n\nexport interface BarContentProps extends Omit<Align.SpaceProps<\"div\">, \"ref\"> {\n bordered?: boolean;\n className?: string;\n}\n\nconst contentFactory =\n (\n pos: spatial.Alignment | \"\" | \"absolute-center\",\n ): FunctionComponent<BarContentProps> =>\n // eslint-disable-next-line react/display-name\n ({ bordered = false, className, ...props }: BarContentProps): ReactElement => (\n <Align.Space\n className={CSS(\n CSS.BE(\"navbar\", \"content\"),\n pos === \"absolute-center\" ? CSS.M(pos) : CSS.align(pos),\n pos !== \"\" && bordered && CSS.bordered(pos),\n className,\n )}\n align=\"center\"\n {...props}\n />\n );\n\ntype CoreBarType = typeof CoreBar;\n\nconst Start = contentFactory(\"start\");\nStart.displayName = \"NavbarStart\";\nconst End = contentFactory(\"end\");\nEnd.displayName = \"NavbarEnd\";\nconst Center = contentFactory(\"center\");\nCenter.displayName = \"NavbarCenter\";\nconst Content = contentFactory(\"\");\nContent.displayName = \"NavbarContent\";\nconst AbsoluteCenter = contentFactory(\"absolute-center\");\nAbsoluteCenter.displayName = \"NavbarAbsoluteCenter\";\n\nexport interface BarType extends CoreBarType {\n Start: typeof Start;\n Center: typeof Center;\n End: typeof End;\n AbsoluteCenter: typeof AbsoluteCenter;\n Content: typeof Content;\n}\n\nexport const Bar = CoreBar as BarType;\n\nBar.Start = Start;\nBar.Center = Center;\nBar.End = End;\nBar.AbsoluteCenter = AbsoluteCenter;\nBar.Content = Content;\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Align } from \"@/align\";\nimport { type Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { type InternalControlsProps } from \"@/os/Controls/types\";\nimport { type ComponentSize } from \"@/util/component\";\n\nimport \"@/os/Controls/Mac.css\";\n\nexport const Icon = {\n Close: (\n <svg\n width=\"124\"\n height=\"124\"\n viewBox=\"0 0 124 124\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"26.8701\"\n y=\"88.3883\"\n width=\"87\"\n height=\"11\"\n transform=\"rotate(-45 26.8701 88.3883)\"\n fill=\"#7E0508\"\n />\n <rect\n x=\"26.8701\"\n y=\"34.6482\"\n width=\"11\"\n height=\"87\"\n transform=\"rotate(-45 26.8701 34.6482)\"\n fill=\"#7E0508\"\n />\n </svg>\n ),\n Minimize: (\n <svg\n width=\"87\"\n height=\"11\"\n viewBox=\"0 0 87 11\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\"15\" width=\"60\" height=\"11\" fill=\"#985712\" />\n </svg>\n ),\n Maximize: (\n <svg\n width=\"143\"\n height=\"143\"\n viewBox=\"0 0 143 143\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M108.242 32.8833C108.797 32.8817 109.247 33.3317 109.245 33.8862L109.092 87.5891C109.09 88.4786 108.014 88.9223 107.385 88.2933L53.8351 34.7432C53.2061 34.1142 53.6499 33.0387 54.5394 33.0361L108.242 32.8833Z\"\n fill=\"#0B650D\"\n />\n <path\n d=\"M33.8862 109.245C33.3317 109.247 32.8818 108.797 32.8833 108.242L33.0361 54.5394C33.0387 53.6499 34.1142 53.2061 34.7432 53.8351L88.2934 107.385C88.9223 108.014 88.4786 109.09 87.5891 109.092L33.8862 109.245Z\"\n fill=\"#0B650D\"\n />\n </svg>\n ),\n};\n\nexport const MacOS = ({\n disabled = [],\n className,\n focused = true,\n onMinimize,\n onMaximize,\n onFullscreen,\n onClose,\n ...props\n}: InternalControlsProps): ReactElement => (\n <Align.Space\n size={1.5}\n direction=\"x\"\n className={CSS(\n CSS.B(\"macos-controls\"),\n !focused && CSS.BM(\"macos-controls\", \"blurred\"),\n className,\n )}\n {...props}\n >\n <TrafficLight\n onClick={onClose}\n className={CSS.BM(\"macos-control\", \"close\")}\n disabled={disabled.includes(\"close\")}\n >\n {Icon.Close}\n </TrafficLight>\n <TrafficLight\n onClick={onMinimize}\n className={CSS.BM(\"macos-control\", \"minimize\")}\n disabled={disabled.includes(\"minimize\")}\n >\n {Icon.Minimize}\n </TrafficLight>\n <TrafficLight\n onClick={onFullscreen}\n className={CSS.BM(\"macos-control\", \"maximize\")}\n disabled={disabled.includes(\"maximize\")}\n >\n {Icon.Maximize}\n </TrafficLight>\n </Align.Space>\n);\n\ninterface TrafficLightProps extends Button.IconProps {}\n\nconst TrafficLight = ({\n className,\n disabled,\n ...props\n}: TrafficLightProps): ReactElement => (\n <button\n className={CSS(CSS.B(\"macos-control\"), CSS.disabled(disabled), className)}\n tabIndex={-1}\n disabled={disabled}\n size={\"\" as ComponentSize}\n {...props}\n />\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Align } from \"@/align\";\nimport { Button as CoreButton } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { type InternalControlsProps } from \"@/os/Controls/types\";\n\nimport \"@/os/Controls/Windows.css\";\n\nexport const Windows = ({\n disabled = [],\n onMinimize,\n onMaximize,\n onClose,\n // no-op on windows\n onFullscreen: _,\n ...props\n}: InternalControlsProps): ReactElement => (\n <Align.Pack {...props}>\n <Button\n className={CSS.BM(\"windows-control\", \"minimize\")}\n onClick={onMinimize}\n disabled={disabled.includes(\"minimize\")}\n >\n <Icon.Subtract />\n </Button>\n <Button\n className={CSS.BM(\"windows-control\", \"maximize\")}\n onClick={onMaximize}\n disabled={disabled.includes(\"maximize\")}\n >\n <Icon.Box />\n </Button>\n <Button\n onClick={onClose}\n className={CSS.BM(\"windows-control\", \"close\")}\n disabled={disabled.includes(\"close\")}\n >\n <Icon.Close />\n </Button>\n </Align.Pack>\n);\n\nconst Button = ({\n disabled = false,\n className,\n ...props\n}: CoreButton.IconProps): ReactElement | null =>\n !disabled ? (\n <CoreButton.Icon\n className={CSS(CSS.B(\"windows-control\"), className)}\n tabIndex={-1}\n {...props}\n />\n ) : null;\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { runtime } from \"@synnaxlabs/x\";\n\nexport const use = (props?: runtime.GetOSProps): runtime.OS | undefined =>\n runtime.getOS(props);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { type runtime } from \"@synnaxlabs/x\";\n\nimport { MacOS } from \"@/os/Controls/Mac\";\nimport { type InternalControlsProps } from \"@/os/Controls/types\";\nimport { Windows } from \"@/os/Controls/Windows\";\nimport { use } from \"@/os/use\";\n\nconst Variants: Record<runtime.OS, React.FC<InternalControlsProps>> = {\n MacOS,\n Windows,\n Linux: Windows,\n Docker: Windows,\n};\n\nconst DEFAULT_OS = \"Windows\";\n\nexport interface ControlsProps extends InternalControlsProps {\n visibleIfOS?: runtime.OS;\n}\n\nexport const Controls = ({\n forceOS,\n visibleIfOS,\n ...props\n}: ControlsProps): ReactElement | null => {\n const os = use({ force: forceOS, default: DEFAULT_OS }) as runtime.OS;\n const C = Variants[os];\n if (visibleIfOS != null && visibleIfOS !== os) return null;\n return <C {...props} />;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { xy, location, box, direction } from \"@synnaxlabs/x\";\n\nexport interface CheckIntegrityProps {\n sourcePos: xy.XY;\n targetPos: xy.XY;\n next: Segment[];\n prev: Segment[];\n}\n\nexport const checkIntegrity = ({\n sourcePos,\n targetPos,\n next,\n prev,\n}: CheckIntegrityProps): boolean => {\n const theoTarget = travelSegments(sourcePos, ...next);\n if (xy.distance(theoTarget, targetPos) < 1) return true;\n console.warn(\"Connector is out of sync with target\");\n console.log(\"Theoretical target\", theoTarget);\n console.log(\"Actual target\", targetPos);\n console.log(\"Segments\", next);\n console.log(\"Prev segments\", prev);\n return false;\n};\n\nexport interface ChangeOrientationProps {\n orientation: location.Outer;\n segments: Segment[];\n}\n\nexport const changeSourceOrientation = (props: ChangeOrientationProps): Segment[] =>\n compressSegments(internalChangeOrientation(props, false));\n\nexport const changeTargetOrientation = (props: ChangeOrientationProps): Segment[] =>\n compressSegments(internalChangeOrientation(props, true));\n\nconst internalChangeOrientation = (\n { orientation, segments }: ChangeOrientationProps,\n reverse: boolean,\n): Segment[] => {\n const stumschematicx = reverse ? segments.length - 1 : 0;\n let next = [...segments];\n const stump = next[stumschematicx];\n const currOrientation = segmentOrientation(stump);\n if (currOrientation === orientation) return next;\n const dir = direction.construct(orientation);\n const newStumpLength = setOrientationOnLength(orientation, STUMP_LENGTH);\n next = moveNodeInDirection(dir, xy.set(xy.ZERO, dir, -newStumpLength), next, reverse);\n\n const newStump = { direction: dir, length: newStumpLength };\n if (reverse) next.push(newStump);\n else next.unshift(newStump);\n return next;\n};\nexport interface PrepareNodeProps {\n sourceStumpTip: xy.XY;\n sourceOrientation: location.Outer;\n sourceBox: box.Box;\n targetStumpTip: xy.XY;\n targetOrientation: location.Outer;\n targetBox: box.Box;\n}\n\nexport const prepareNode = ({\n sourceStumpTip: sourcePos,\n sourceOrientation,\n sourceBox,\n targetStumpTip: targetPos,\n targetOrientation,\n targetBox,\n}: PrepareNodeProps): Segment | undefined => {\n // This is the case where the final connection line will not overlap with the node,\n // so we don't need to create an extra segment.\n if (!needToGoAround({ sourcePos, sourceOrientation, targetPos })) return;\n\n const sourceDirection = direction.construct(sourceOrientation);\n const swappedSourceDirection = direction.swap(sourceDirection);\n\n // This is the direction we need to travel in\n let orientationToTravelIn = orientationFromLength(\n swappedSourceDirection,\n targetPos[swappedSourceDirection] - sourcePos[swappedSourceDirection],\n );\n\n // We need to grab the edge of the node in this direction\n const nodeEdge = box.loc(sourceBox, orientationToTravelIn);\n\n // If they are pointing in opposite directions, we need to check if we need to\n // go completely around the node if there isn't enough space for a connector\n // between the two nodes.\n if (location.swap(sourceOrientation) === targetOrientation) {\n // In this case we do need to go around the node.\n const targetNodeEdge = box.loc(targetBox, location.swap(orientationToTravelIn));\n if (Math.abs(nodeEdge - targetNodeEdge) < STUMP_LENGTH)\n orientationToTravelIn = location.swap(orientationToTravelIn) as location.Outer;\n }\n // We need to travel from the source to the edge of the node plus MIN_LENGTH\n return {\n direction: swappedSourceDirection,\n length:\n nodeEdge -\n sourcePos[swappedSourceDirection] +\n setOrientationOnLength(orientationToTravelIn, STUMP_LENGTH),\n };\n};\n\nexport interface Segment {\n direction: direction.Direction;\n length: number;\n}\n\nexport const travelSegments = (source: xy.XY, ...segments: Segment[]): xy.XY => {\n let current = source;\n for (const segment of segments) {\n current = xy.translate(current, segment.direction, segment.length);\n }\n return current;\n};\n\nexport const segmentsToPoints = (\n source: xy.XY,\n segments: Segment[],\n zoom: number,\n applyTransform: boolean,\n): xy.XY[] => {\n try {\n let current = source;\n const points: xy.XY[] = [\n source,\n ...segments.map((s) => {\n current = xy.translate(current, s.direction, s.length);\n return current;\n }),\n ];\n if (!applyTransform) return points;\n\n const firstSeg = segments[0];\n const firstSegOrientation = orientationFromLength(\n firstSeg.direction,\n firstSeg.length,\n );\n const firstMag = orientationMagnitude(firstSegOrientation);\n points[0] = xy.translate(points[0], {\n [firstSeg.direction]: -1 * firstMag * 4 * zoom,\n [direction.swap(firstSeg.direction)]: 0,\n } as const as xy.XY);\n const lastSeg = segments[segments.length - 1];\n const lastSegOrientation = orientationFromLength(lastSeg.direction, lastSeg.length);\n const lastMag = orientationMagnitude(lastSegOrientation);\n points[points.length - 1] = xy.translate(points[points.length - 1], {\n [lastSeg.direction]: lastMag * 4 * zoom,\n [direction.swap(lastSeg.direction)]: 0,\n } as const as xy.XY);\n\n return points;\n } catch (e) {\n return [];\n }\n};\n\nexport interface BuildNew {\n sourceBox: box.Box;\n targetBox: box.Box;\n sourcePos: xy.XY;\n targetPos: xy.XY;\n sourceOrientation: location.Outer;\n targetOrientation: location.Outer;\n}\n\nexport const STUMP_LENGTH = 10;\n\nconst orientationMagnitude = (or: location.Outer): number =>\n or === \"top\" || or === \"left\" ? -1 : 1;\n\nconst setOrientationOnLength = (or: location.Outer, length: number): number =>\n or === \"top\" || or === \"left\" ? -length : length;\n\nconst orientationFromLength = (\n direction: direction.Direction,\n length: number,\n): location.Outer => {\n if (direction === \"x\") return length > 0 ? \"right\" : \"left\";\n return length > 0 ? \"bottom\" : \"top\";\n};\n\nconst segmentOrientation = (segment: Segment): location.Outer =>\n orientationFromLength(segment.direction, segment.length);\n\nexport interface NeedToGoAroundSourceProps {\n sourcePos: xy.XY;\n targetPos: xy.XY;\n sourceOrientation: location.Outer;\n}\n\nexport const needToGoAround = ({\n sourcePos,\n targetPos,\n sourceOrientation,\n}: NeedToGoAroundSourceProps): boolean => {\n const sourceDirection = direction.construct(sourceOrientation);\n const delta = targetPos[sourceDirection] - sourcePos[sourceDirection];\n return setOrientationOnLength(sourceOrientation, delta) < 0;\n};\n\nexport const stump = (orientation: location.Outer): Segment => ({\n direction: direction.construct(orientation),\n length: setOrientationOnLength(orientation, STUMP_LENGTH),\n});\n\nconst STUMPS = {\n top: stump(\"top\"),\n bottom: stump(\"bottom\"),\n left: stump(\"left\"),\n right: stump(\"right\"),\n};\n\nconst COMPRESSION_THRESHOLD = 4;\nconst DIRECT_REMOVAL_THRESHOLD = 0.25;\n\nexport const compressSegments = (segments: Segment[]): Segment[] => {\n return removeSameOrientationSegments(\n removeShortSegments(removeSameOrientationSegments(segments)),\n );\n};\n\nconst removeShortSegments = (segments: Segment[]): Segment[] => {\n const next: Segment[] = [...segments];\n const ok = segments.findIndex((seg, i) => {\n // If it's below the compression threshold and the user is making it smaller,\n // then we compress.\n const mag = Math.abs(seg.length);\n if (mag < COMPRESSION_THRESHOLD) {\n if (mag < DIRECT_REMOVAL_THRESHOLD) return true;\n if (i === 0 || i === segments.length - 1) return false;\n if (segments.length <= 3) return false;\n if (i + 2 < segments.length) {\n const toAdjust = next[i + 2];\n if (toAdjust.direction !== seg.direction) return false;\n next[i + 2] = { ...toAdjust, length: toAdjust.length + seg.length };\n } else {\n const toAdjust = next[i - 2];\n if (toAdjust.direction !== seg.direction) return false;\n next[i - 2] = { ...toAdjust, length: toAdjust.length + seg.length };\n }\n return true;\n }\n return false;\n });\n if (ok !== -1) {\n // splice out the short segment\n next.splice(ok, 1);\n return next;\n }\n return next;\n};\n\nconst removeSameOrientationSegments = (segments: Segment[]): Segment[] => {\n const next: Segment[] = [...segments];\n const idx = segments.findIndex((seg, i) => {\n const prevSeg = next[i - 1];\n if (i === 0 || seg.direction !== prevSeg.direction) return false;\n\n if (i === 1) {\n const stumschematicx = i - 1;\n const segIdx = i;\n const stumpOrientation = segmentOrientation(prevSeg);\n const segOrientation = segmentOrientation(seg);\n if (stumpOrientation === segOrientation) {\n next[i - 1] = {\n direction: next[i - 1].direction,\n length: next[i - 1].length + next[i].length,\n };\n next.splice(i, 1);\n return true;\n }\n if (Math.abs(prevSeg.length) === STUMP_LENGTH) return false;\n\n const stumpLength = setOrientationOnLength(stumpOrientation, STUMP_LENGTH);\n const delta = next[stumschematicx].length - stumpLength;\n const nextLength = next[segIdx].length + delta;\n if (Math.abs(nextLength) < STUMP_LENGTH) return false;\n next[stumschematicx] = { ...next[stumschematicx], length: stumpLength };\n next[segIdx] = { ...next[segIdx], length: nextLength };\n return true;\n }\n\n if (i === segments.length - 1) {\n const stumschematicx = i;\n const segIdx = i - 1;\n const stumpOrientation = segmentOrientation(seg);\n const segOrientation = segmentOrientation(prevSeg);\n if (stumpOrientation === segOrientation) {\n next[i - 1] = {\n direction: next[i - 1].direction,\n length: next[i - 1].length + next[i].length,\n };\n next.splice(i, 1);\n return true;\n }\n\n if (Math.abs(seg.length) === STUMP_LENGTH) return false;\n\n const stumpLength = setOrientationOnLength(stumpOrientation, STUMP_LENGTH);\n const delta = next[stumschematicx].length - stumpLength;\n const nextLength = next[segIdx].length + delta;\n if (Math.abs(nextLength) < STUMP_LENGTH) return false;\n next[stumschematicx] = { ...next[stumschematicx], length: stumpLength };\n next[segIdx] = { ...next[segIdx], length: nextLength };\n return true;\n }\n\n // splice out the short segment\n next[i - 1] = {\n direction: next[i - 1].direction,\n length: next[i - 1].length + next[i].length,\n };\n next.splice(i, 1);\n return true;\n });\n if (idx !== -1) return removeSameOrientationSegments(next);\n return next;\n};\n\nexport const buildNew = (props: BuildNew): Segment[] =>\n compressSegments(internalNewConnector(props));\n\nconst internalNewConnector = ({\n sourceBox,\n targetBox,\n sourcePos,\n targetPos,\n targetOrientation,\n sourceOrientation,\n}: BuildNew): Segment[] => {\n let sourceStumpOrientation = sourceOrientation;\n let targetStumpOrientation = targetOrientation;\n\n let sourceStump = { ...STUMPS[sourceOrientation] };\n let sourceStumpTip = travelSegments(sourcePos, sourceStump);\n\n const targetStump = { ...STUMPS[targetOrientation] };\n let targetStumpTip = travelSegments(targetPos, targetStump);\n\n const segments = [sourceStump];\n const extraSourceSeg = prepareNode({\n sourceStumpTip,\n sourceOrientation,\n sourceBox,\n targetStumpTip,\n targetOrientation,\n targetBox,\n });\n if (extraSourceSeg != null) {\n segments.push(extraSourceSeg);\n sourceStumpTip = travelSegments(sourceStumpTip, extraSourceSeg);\n sourceStumpOrientation = segmentOrientation(extraSourceSeg);\n sourceStump = extraSourceSeg;\n }\n\n const extraTargetSeg = prepareNode({\n sourceStumpTip: targetStumpTip,\n sourceOrientation: targetStumpOrientation,\n sourceBox: targetBox,\n targetStumpTip: sourceStumpTip,\n targetOrientation: sourceStumpOrientation,\n targetBox: sourceBox,\n });\n\n if (extraTargetSeg != null) {\n targetStumpTip = travelSegments(targetStumpTip, extraTargetSeg);\n targetStumpOrientation = orientationFromLength(\n extraTargetSeg.direction,\n extraTargetSeg.length,\n );\n }\n\n const addTargetSegments = (): void => {\n // We need to swap the orientations of the target stumps so that\n // they create the correct path when traversing the segments.\n if (extraTargetSeg != null) {\n extraTargetSeg.length *= -1;\n segments.push(extraTargetSeg);\n }\n targetStump.length *= -1;\n segments.push(targetStump);\n };\n\n // Here is where we draw the final connection line.\n // In this case we split the delta in half and draw three lines.\n if (location.swap(sourceStumpOrientation) === targetOrientation) {\n const dir = direction.construct(sourceStumpOrientation);\n // push three segments on\n // first segment is in same direction as source stump orientation and half way to the\n // target stump tip\n const dist = (targetStumpTip[dir] - sourceStumpTip[dir]) / 2;\n segments.push({ direction: dir, length: dist });\n const swappedDir = direction.swap(dir);\n // second segment is in the swapped direction of the source stump orientation and\n // the distance between the source stump tip and the target stump tip\n segments.push({\n direction: swappedDir,\n length: targetStumpTip[swappedDir] - sourceStumpTip[swappedDir],\n });\n // third segment is in the same direction as the source stump orientation and the\n // remaining distance to the target stump tip\n segments.push({ direction: dir, length: dist });\n addTargetSegments();\n return segments;\n }\n\n // In this case we draw two lines.\n // Check the delta in the direction of the source stump\n const delta =\n targetStumpTip[sourceStump.direction] - sourceStumpTip[sourceStump.direction];\n let swapped = direction.swap(sourceStump.direction);\n const swappedDelta = sourceStumpTip[swapped] - targetStumpTip[swapped];\n // Check if the delta is in the same direction as the source stump\n let firstSeg: Segment;\n if (\n orientationFromLength(sourceStump.direction, delta) === sourceStumpOrientation &&\n orientationFromLength(swapped, swappedDelta) === targetStumpOrientation\n ) {\n // This means we're good to go in this direction\n firstSeg = {\n direction: sourceStump.direction,\n length: delta,\n };\n } else {\n // This means we need to go orthogonally\n firstSeg = {\n direction: swapped,\n length: targetStumpTip[swapped] - sourceStumpTip[swapped],\n };\n swapped = direction.swap(swapped);\n }\n\n segments.push(firstSeg);\n // All we need to do next is draw a line\n const secondSeg = {\n direction: swapped,\n length: targetStumpTip[swapped] - sourceStumpTip[swapped],\n };\n segments.push(secondSeg);\n addTargetSegments();\n return segments;\n};\n\nexport interface MoveConnectorProps {\n segments: Segment[];\n index: number;\n magnitude: number;\n}\n\nexport const dragSegment = (props: MoveConnectorProps): Segment[] =>\n compressSegments(internalDragSegment(props));\n\nconst internalDragSegment = ({\n segments,\n index,\n magnitude,\n}: MoveConnectorProps): Segment[] => {\n const next = [...segments];\n const seg = next[index];\n const dir = direction.swap(seg.direction);\n const orientation = segmentOrientation(seg);\n\n // If we're dragging on a stump, we need to add two new segments.\n if (index === 0) {\n next.unshift({ direction: dir, length: magnitude });\n const stumpLength = setOrientationOnLength(orientation, STUMP_LENGTH);\n next.unshift({ direction: seg.direction, length: stumpLength });\n // Move the index up by two since we added two segments\n index += 2;\n // Since we added a new stump in the same direction as the old one, we need to\n // subtract the stump length from the segment.\n next[index] = { ...next[index], length: next[index].length - stumpLength };\n }\n // If it's not the stump just move it directly.\n else\n next[index - 1] = {\n direction: next[index - 1].direction,\n length: next[index - 1].length + magnitude,\n };\n\n // If we're dragging on the target stump, we need to add two new segments.\n if (index === next.length - 1) {\n next.push({ direction: dir, length: -magnitude });\n const stumpLength = setOrientationOnLength(orientation, STUMP_LENGTH);\n next.push({ direction: seg.direction, length: stumpLength });\n next[index] = { ...next[index], length: next[index].length - stumpLength };\n } else {\n next[index + 1] = {\n direction: next[index + 1].direction,\n length: next[index + 1].length - magnitude,\n };\n }\n\n return next;\n};\n\nconst findIndexBackwards = (\n segments: Segment[],\n cb: (seg: Segment, i: number) => boolean,\n): number => {\n for (let i = segments.length - 1; i >= 0; i--) {\n if (cb(segments[i], i)) return i;\n }\n return -1;\n};\n\nconst findNonTargetIdx = (\n segments: Segment[],\n cb: (seg: Segment, i: number) => boolean,\n reverse = false,\n ...exclude: number[]\n): number => {\n const internalCB = (seg: Segment, i: number): boolean =>\n !exclude.includes(i) && cb(seg, i);\n return reverse\n ? findIndexBackwards(segments, internalCB)\n : segments.findIndex(internalCB);\n};\n\nexport interface MoveNodeProps {\n delta: xy.XY;\n segments: Segment[];\n}\n\nexport const moveSourceNode = ({ delta, segments }: MoveNodeProps): Segment[] =>\n compressSegments(moveNodeInternal(delta, segments, false));\n\nexport const moveTargetNode = ({ delta, segments }: MoveNodeProps): Segment[] =>\n compressSegments(moveNodeInternal(delta, segments, true));\n\nconst moveNodeInternal = (\n delta: xy.XY,\n segments: Segment[],\n reverse: boolean,\n): Segment[] => {\n let next = [...segments];\n if (delta.x !== 0) next = moveNodeInDirection(\"x\", delta, next, reverse);\n if (delta.y !== 0) next = moveNodeInDirection(\"y\", delta, next, reverse);\n return next;\n};\n\nconst canAdjustStump = (\n dir: direction.Direction,\n seg: Segment,\n delta: xy.XY,\n): boolean => {\n if (seg.direction !== dir) return false;\n const next = { ...seg, length: seg.length - delta[dir] };\n const firstSegOrientation = segmentOrientation(seg);\n const nextFirstSegOrientation = segmentOrientation(next);\n const isAboveMinLength = Math.abs(next.length) > STUMP_LENGTH;\n const isSameOrientation = firstSegOrientation === nextFirstSegOrientation;\n return isAboveMinLength && isSameOrientation;\n};\n\nconst moveNodeInDirection = (\n dir: direction.Direction,\n delta: xy.XY,\n segments: Segment[],\n reverse: boolean,\n): Segment[] => {\n const swappedDirection = direction.swap(dir);\n // We'd always like to adjust the stump closest to the node if possible, but only\n // if compressing it won't make it too small OR cause it to reverse its orientation.\n const stumschematicx = reverse ? segments.length - 1 : 0;\n const stump = segments[stumschematicx];\n if (canAdjustStump(dir, stump, delta)) {\n segments[stumschematicx] = { ...stump, length: stump.length - delta[dir] };\n return segments;\n }\n\n const oppositeStumschematicx = reverse ? 0 : segments.length - 1;\n const isX = (seg: Segment): boolean => seg.direction === dir;\n const idxToAdjust = findNonTargetIdx(segments, isX, reverse, stumschematicx);\n if (idxToAdjust === oppositeStumschematicx) {\n const oppositeStump = segments[oppositeStumschematicx];\n if (canAdjustStump(dir, oppositeStump, delta)) {\n segments[oppositeStumschematicx] = {\n ...oppositeStump,\n length: oppositeStump.length - delta[dir],\n };\n return segments;\n } else {\n if (stump.direction === dir)\n segments[stumschematicx] = { ...stump, length: stump.length - delta[dir] };\n else\n segments[oppositeStumschematicx] = {\n ...oppositeStump,\n length: oppositeStump.length - delta[dir],\n };\n return segments;\n }\n }\n // This means that there is only one segment in the 'swappedDirection' direction in the whole\n // connector, so we split it in half and add a new segment.\n if (idxToAdjust === -1)\n if (segments.length === 1) {\n if (segments[0].direction === dir)\n return [{ direction: dir, length: segments[0].length - delta[dir] }];\n return [\n { direction: swappedDirection, length: segments[0].length / 2 },\n { direction: dir, length: -delta[dir] },\n { direction: swappedDirection, length: segments[0].length / 2 },\n ];\n } else {\n if (stump.direction === dir) {\n // just adjust the stump\n segments[stumschematicx] = { ...stump, length: stump.length - delta[dir] };\n return segments;\n } else {\n return [\n { direction: swappedDirection, length: segments[0].length },\n { direction: dir, length: -delta[dir] },\n ...segments.slice(1),\n ];\n }\n }\n\n const prev = segments[idxToAdjust];\n segments[idxToAdjust] = { ...prev, length: prev.length - delta[dir] };\n return segments;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { xy, box, location } from \"@synnaxlabs/x\";\nimport { type ReactFlowInstance } from \"reactflow\";\n\nexport const selectNode = (key: string): HTMLDivElement => {\n const el = document.querySelector(`[data-id=\"${key}\"]`);\n if (el == null) throw new Error(`[diagram] - cannot find node with key: ${key}`);\n return el as HTMLDivElement;\n};\n\nexport const selectNodeBox = (flow: ReactFlowInstance, key: string): box.Box => {\n const n = selectNode(key);\n const flowN = flow.getNodes().find((n) => n.id === key);\n if (flowN == null) throw new Error(`[diagram] - cannot find node with key: ${key}`);\n return box.construct(flowN.position, box.dims(box.construct(n)));\n};\n\nexport const selectNodeLayout = (key: string, flow: ReactFlowInstance): NodeLayout => {\n return NodeLayout.fromFlow(key, flow);\n};\n\nexport class HandleLayout {\n node_: NodeLayout | null = null;\n position: xy.XY;\n orientation: location.Outer;\n\n constructor(position: xy.XY, orientation: location.Outer) {\n this.position = position;\n this.orientation = orientation;\n }\n\n set node(node: NodeLayout) {\n this.node_ = node;\n }\n\n get node(): NodeLayout {\n if (this.node_ == null) throw new Error(`[schematic] - handle has no node`);\n return this.node_;\n }\n\n get absolutePosition(): xy.XY {\n return xy.translate(box.topLeft(this.node.box), this.position);\n }\n}\n\nexport class NodeLayout {\n key: string;\n box: box.Box;\n\n handles: HandleLayout[];\n\n constructor(key: string, box: box.Box, handles: HandleLayout[]) {\n this.key = key;\n this.box = box;\n this.handles = handles;\n handles.forEach((h) => (h.node = this));\n }\n\n static fromFlow(key: string, flow: ReactFlowInstance): NodeLayout {\n const nodeBox = selectNodeBox(flow, key);\n // grab all child elements with the class 'react-flow__handle'\n const nodeEl = selectNode(key);\n const handleEls = nodeEl.getElementsByClassName(\"react-flow__handle\");\n const nodeElBox = box.construct(nodeEl);\n const handles = Array.from(handleEls).map((el) => {\n const pos = box.center(box.construct(el));\n const dist = xy.translation(box.topLeft(nodeElBox), pos);\n const match = el.className.match(/react-flow__handle-(\\w+)/);\n if (match == null)\n throw new Error(`[schematic] - cannot find handle orientation`);\n const orientation = location.construct(match[0]) as location.Outer;\n return new HandleLayout(dist, orientation);\n });\n return new NodeLayout(key, nodeBox, handles);\n }\n}\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type DragEvent,\n Fragment,\n type ReactElement,\n useCallback,\n useRef,\n} from \"react\";\n\nimport { box, direction, location, xy } from \"@synnaxlabs/x\";\nimport {\n BaseEdge,\n type EdgeProps as RFEdgeProps,\n useReactFlow,\n type ConnectionLineComponentProps,\n type Position,\n} from \"reactflow\";\n\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { useCombinedStateAndRef, useDebouncedCallback } from \"@/hooks\";\nimport { useCursorDrag } from \"@/hooks/useCursorDrag\";\nimport { type Key } from \"@/triggers/triggers\";\nimport { connector } from \"@/vis/diagram/edge/connector\";\nimport { selectNodeBox } from \"@/vis/diagram/util\";\n\nimport \"@/vis/diagram/edge/Edge.css\";\n\ninterface CurrentlyDragging {\n segments: connector.Segment[];\n index: number;\n}\n\nexport interface EdgeProps extends RFEdgeProps {\n segments: connector.Segment[];\n onSegmentsChange: (segments: connector.Segment[]) => void;\n color?: Color.Crude;\n}\n\nexport const CustomConnectionLine = ({\n fromX,\n fromY,\n toX,\n toY,\n fromPosition,\n toPosition,\n fromNode,\n connectionLineStyle,\n connectionStatus,\n}: ConnectionLineComponentProps): ReactElement => {\n // select an element with 'react-flow__handle-connecting' class\n const connectedHandle = document.querySelector(\".react-flow__handle-connecting\");\n const toNodeHandle = connectedHandle?.className.match(/react-flow__handle-(\\w+)/);\n if (toNodeHandle != null) {\n const res = location.outer.safeParse(toNodeHandle[1]);\n if (res.success) toPosition = res.data as Position;\n }\n const conn = connector.buildNew({\n sourcePos: xy.construct(fromX, fromY),\n targetPos: xy.construct(toX, toY),\n sourceOrientation: fromPosition,\n targetOrientation: toPosition,\n sourceBox: selectNodeBox(useReactFlow(), fromNode?.id ?? \"\"),\n targetBox: selectNodeBox(useReactFlow(), fromNode?.id ?? \"\"),\n });\n const flow = useReactFlow();\n const points = connector.segmentsToPoints(\n xy.construct(fromX, fromY),\n conn,\n flow.getZoom(),\n false,\n );\n\n return (\n <BaseEdge\n path={calcPath(points)}\n style={{\n ...connectionLineStyle,\n stroke: Color.cssString(\n connectionStatus === \"invalid\"\n ? \"var(--pluto-error-z)\"\n : \"var(--pluto-gray-l9)\",\n ),\n strokeWidth: 2,\n fill: \"none\",\n }}\n />\n );\n};\n\nexport const Edge = ({\n id,\n source,\n target,\n sourcePosition: sourceOrientation,\n targetHandleId,\n targetPosition: targetOrientation,\n style,\n segments: propsSegments = [],\n onSegmentsChange,\n color = \"var(--pluto-gray-l9)\",\n selected = false,\n ...props\n}: EdgeProps): ReactElement => {\n const sourcePos = xy.construct(props.sourceX, props.sourceY);\n const sourcePosRef = useRef(sourcePos);\n const sourcePosEq = xy.equals(sourcePos, sourcePosRef.current);\n\n const targetPos = xy.construct(props.targetX, props.targetY);\n const targetPosRef = useRef(targetPos);\n const targetPosEq = xy.equals(targetPos, targetPosRef.current);\n\n const flow = useReactFlow();\n const [segments, setSegments, segRef] = useCombinedStateAndRef<connector.Segment[]>(\n () =>\n propsSegments.length > 0\n ? propsSegments\n : connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n }),\n );\n\n const targetOrientationRef = useRef(targetOrientation);\n const sourceOrientationRef = useRef(sourceOrientation);\n\n const debouncedOnSegmentsChange = useDebouncedCallback(onSegmentsChange, 100, [\n onSegmentsChange,\n ]);\n\n if (!sourcePosEq || !targetPosEq) {\n let next: connector.Segment[] = segments;\n const sourceDelta = xy.translation(sourcePosRef.current, sourcePos);\n const targetDelta = xy.translation(targetPos, targetPosRef.current);\n if (xy.equals(sourceDelta, xy.scale(targetDelta, -1), 0.001)) {\n sourcePosRef.current = sourcePos;\n targetPosRef.current = targetPos;\n } else {\n if (!sourcePosEq) {\n next = connector.moveSourceNode({ delta: sourceDelta, segments: next });\n if (sourceOrientationRef.current !== sourceOrientation) {\n sourceOrientationRef.current = sourceOrientation;\n next = connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n });\n }\n if (!connector.checkIntegrity({ sourcePos, targetPos, next, prev: segments })) {\n next = connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n });\n }\n sourcePosRef.current = sourcePos;\n } else if (!targetPosEq) {\n next = connector.moveTargetNode({ delta: targetDelta, segments: next });\n if (targetOrientationRef.current !== targetOrientation) {\n targetOrientationRef.current = targetOrientation;\n next = connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n });\n }\n if (!connector.checkIntegrity({ sourcePos, targetPos, next, prev: segments })) {\n next = connector.buildNew({\n sourcePos,\n targetPos,\n sourceOrientation,\n targetOrientation,\n sourceBox: selectNodeBox(flow, source),\n targetBox: selectNodeBox(flow, target),\n });\n }\n targetPosRef.current = targetPos;\n }\n debouncedOnSegmentsChange(next);\n setSegments(next);\n }\n }\n\n const dragRef = useRef<CurrentlyDragging | null>(null);\n\n const dragStart = useCursorDrag({\n onStart: useCallback((_: xy.XY, __: Key, e: DragEvent) => {\n dragRef.current = {\n index: Number(e.currentTarget.id.split(\"-\")[1]),\n segments: [...segRef.current],\n };\n }, []),\n onMove: useCallback((b: box.Box) => {\n if (dragRef.current == null) return;\n const next = connector.dragSegment({\n segments: dragRef.current.segments,\n index: dragRef.current.index,\n magnitude:\n box.dim(\n b,\n direction.swap(dragRef.current.segments[dragRef.current.index].direction),\n true,\n ) / flow.getZoom(),\n });\n setSegments(next);\n }, []),\n onEnd: useCallback(() => onSegmentsChange(segRef.current), [onSegmentsChange]),\n });\n\n const points = connector.segmentsToPoints(sourcePos, segments, flow.getZoom(), true);\n\n return (\n <>\n <BaseEdge\n path={calcPath(points)}\n style={{ ...style, stroke: Color.cssString(color) }}\n {...props}\n />\n {selected &&\n calcMidPoints(points).map((p, i) => {\n const dir = segments[i].direction;\n const swapped = direction.swap(dir);\n const dims = {\n [direction.dimension(dir)]: \"18px\",\n [direction.dimension(swapped)]: \"4px\",\n };\n const pos = {\n [dir]: p[dir] - 9,\n [swapped]: p[swapped] - 2,\n };\n return (\n <Fragment key={i}>\n <rect\n className={CSS.BE(\"diagram-edge-handle\", \"background\")}\n fill=\"var(--pluto-gray-l0)\"\n stroke=\"var(--pluto-primary-z)\"\n {...dims}\n {...pos}\n rx=\"2px\"\n ry=\"2px\"\n />\n <foreignObject x={p.x - 9} y={p.y - 9} width=\"18px\" height=\"18px\">\n <div\n id={`handle-${i}`}\n className={CSS(\n CSS.BE(\"diagram-edge-handle\", \"dragger\"),\n CSS.dir(dir),\n )}\n draggable\n onDragStart={dragStart}\n />\n </foreignObject>\n </Fragment>\n );\n })}\n </>\n );\n};\n\nexport const calcPath = (coords: xy.XY[]): string => {\n let path = \"\";\n const close = false;\n const radius = 6;\n const length = coords.length + (close ? 1 : -1);\n for (let i = 0; i < length; i++) {\n const a = coords[i % coords.length];\n const b = coords[(i + 1) % coords.length];\n const t = Math.min(radius / Math.hypot(b.x - a.x, b.y - a.y), 0.5);\n\n if (i > 0)\n path += `Q${a.x},${a.y} ${a.x * (1 - t) + b.x * t},${a.y * (1 - t) + b.y * t}`;\n\n if (!close && i === 0) path += `M${a.x},${a.y}`;\n else if (i === 0) path += `M${a.x * (1 - t) + b.x * t},${a.y * (1 - t) + b.y * t}`;\n\n if (!close && i === length - 1) path += `L${b.x},${b.y}`;\n else if (i < length - 1)\n path += `L${a.x * t + b.x * (1 - t)},${a.y * t + b.y * (1 - t)}`;\n }\n if (close) path += \"Z\";\n return path;\n};\n\nexport const calcMidPoints = (points: xy.XY[]): xy.XY[] => {\n return points.slice(1).map((p, i) => {\n const prev = points[i];\n return xy.construct((p.x + prev.x) / 2, (p.y + prev.y) / 2);\n });\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type ReactElement,\n createContext,\n useCallback,\n useMemo,\n useRef,\n useState,\n useContext as reactUseContext,\n type ComponentPropsWithoutRef,\n useEffect,\n memo,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { box, location, xy } from \"@synnaxlabs/x\";\nimport ReactFlow, {\n ReactFlowProvider,\n type Viewport as RFViewport,\n useOnViewportChange as useRFOnViewportChange,\n applyEdgeChanges as rfApplyEdgeChanges,\n applyNodeChanges as rfApplyNodeChanges,\n addEdge as rfAddEdge,\n Background as RFBackground,\n type Edge as RFEdge,\n type NodeProps as RFNodeProps,\n type NodeChange as RFNodeChange,\n type EdgeChange as RFEdgeChange,\n type Connection as RFConnection,\n type ReactFlowProps,\n useReactFlow,\n ConnectionMode,\n updateEdge,\n type EdgeProps as RFEdgeProps,\n SelectionMode,\n type FitViewOptions,\n type ProOptions,\n} from \"reactflow\";\n\nimport { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { useCombinedRefs } from \"@/hooks\";\nimport { useMemoCompare } from \"@/memo\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\nimport { Triggers } from \"@/triggers\";\nimport { type RenderProp } from \"@/util/renderProp\";\nimport { Viewport as CoreViewport } from \"@/viewport\";\nimport { Canvas } from \"@/vis/canvas\";\nimport { diagram } from \"@/vis/diagram/aether\";\nimport { Edge as EdgeComponent } from \"@/vis/diagram/edge\";\nimport { type connector } from \"@/vis/diagram/edge/connector\";\nimport { CustomConnectionLine } from \"@/vis/diagram/edge/Edge\";\nimport {\n type Edge,\n type Node,\n type Viewport,\n edgeConverter,\n nodeConverter,\n translateEdgesForward,\n translateNodesForward,\n translateViewportBackward,\n translateViewportForward,\n} from \"@/vis/diagram/types\";\n\nimport \"@/vis/diagram/Diagram.css\";\nimport \"reactflow/dist/style.css\";\n\nexport interface SymbolProps {\n symbolKey: string;\n position: xy.XY;\n selected: boolean;\n}\n\nexport interface UseProps {\n allowEdit?: boolean;\n initialEdges: Edge[];\n initialNodes: Node[];\n initialViewport?: Viewport;\n}\n\nexport const use = ({\n initialNodes,\n initialEdges,\n allowEdit = true,\n initialViewport = { position: xy.ZERO, zoom: 1 },\n}: UseProps): UseReturn => {\n const [editable, onEditableChange] = useState(allowEdit);\n const [nodes, onNodesChange] = useState<Node[]>(initialNodes);\n const [edges, onEdgesChange] = useState<Edge[]>(initialEdges);\n const [viewport, onViewportChange] = useState<Viewport>(initialViewport);\n const [fitViewOnResize, setFitViewOnResize] = useState(false);\n\n return {\n viewport,\n onViewportChange,\n edges,\n nodes,\n onNodesChange,\n onEdgesChange,\n editable,\n onEditableChange,\n fitViewOnResize,\n setFitViewOnResize,\n };\n};\n\nconst isValidConnection = (connection: RFConnection): boolean =>\n connection.source !== connection.target;\n\nexport interface UseReturn {\n edges: Edge[];\n nodes: Node[];\n onNodesChange: (nodes: Node[]) => void;\n onEdgesChange: (edges: Edge[]) => void;\n editable: boolean;\n onEditableChange: (v: boolean) => void;\n onViewportChange: (vp: Viewport) => void;\n viewport: Viewport;\n fitViewOnResize: boolean;\n setFitViewOnResize: (v: boolean) => void;\n}\n\nconst EDITABLE_PROPS: ReactFlowProps = {\n nodesDraggable: true,\n nodesConnectable: true,\n elementsSelectable: true,\n zoomOnDoubleClick: false,\n};\n\nconst NOT_EDITABLE_PROPS: ReactFlowProps = {\n connectionRadius: 0,\n nodesDraggable: false,\n nodesConnectable: false,\n elementsSelectable: false,\n panOnDrag: false,\n panOnScroll: false,\n zoomOnScroll: false,\n zoomOnDoubleClick: false,\n zoomOnPinch: false,\n edgesFocusable: false,\n edgesUpdatable: false,\n nodesFocusable: false,\n edgeUpdaterRadius: 0,\n};\n\nconst FIT_VIEW_OPTIONS: FitViewOptions = {\n padding: 0,\n maxZoom: 1,\n minZoom: 0.5,\n};\n\nconst PRO_OPTIONS: ProOptions = {\n hideAttribution: true,\n};\n\nexport interface DiagramProps\n extends UseReturn,\n Omit<ComponentPropsWithoutRef<\"div\">, \"onError\"> {\n triggers?: CoreViewport.UseTriggers;\n}\n\ninterface ContextValue {\n editable: boolean;\n onEditableChange: (v: boolean) => void;\n registerNodeRenderer: (renderer: RenderProp<SymbolProps>) => void;\n fitViewOnResize: boolean;\n setFitViewOnResize: (v: boolean) => void;\n}\n\nconst Context = createContext<ContextValue>({\n editable: true,\n onEditableChange: () => {},\n registerNodeRenderer: () => {},\n fitViewOnResize: false,\n setFitViewOnResize: () => {},\n});\n\nexport const useContext = (): ContextValue => reactUseContext(Context);\n\nexport interface NodeRendererProps {\n children: RenderProp<SymbolProps>;\n}\n\nexport const NodeRenderer = memo(\n ({ children }: NodeRendererProps): ReactElement | null => {\n const { registerNodeRenderer } = useContext();\n useEffect(() => registerNodeRenderer(children), [registerNodeRenderer, children]);\n return null;\n },\n);\nNodeRenderer.displayName = \"NodeRenderer\";\n\nconst DELETE_KEY_CODES: Triggers.Trigger = [\"Backspace\", \"Delete\"];\n\nconst Core = Aether.wrap<DiagramProps>(\n diagram.Diagram.TYPE,\n // eslint-disable-next-line react/display-name\n ({\n aetherKey,\n children,\n onNodesChange,\n onEdgesChange,\n nodes,\n edges,\n onEditableChange,\n editable,\n viewport,\n triggers: pTriggers,\n onViewportChange,\n fitViewOnResize,\n setFitViewOnResize,\n ...props\n }): ReactElement => {\n const [{ path }, , setState] = Aether.use({\n aetherKey,\n type: diagram.Diagram.TYPE,\n schema: diagram.diagramStateZ,\n initialState: {\n position: viewport.position,\n region: box.ZERO,\n zoom: viewport.zoom,\n },\n });\n\n const defaultEdgeColor = Theming.use().colors.gray.l9.hex;\n\n const triggers = useMemoCompare(\n () => pTriggers ?? CoreViewport.DEFAULT_TRIGGERS.zoom,\n Triggers.compareModeConfigs,\n [pTriggers],\n );\n\n const { fitView } = useReactFlow();\n const resizeRef = Canvas.useRegion(\n useCallback(\n (b) => {\n if (fitViewOnResize) fitView({ maxZoom: 1 });\n setState((prev) => ({ ...prev, region: b }));\n },\n [setState, fitView, fitViewOnResize],\n ),\n );\n\n // For some reason, react flow repeatedly calls onViewportChange with the same\n // parameters, so we do a need equality check to prevent unnecessary re-renders.\n const viewportRef = useRef<RFViewport | null>(null);\n const handleViewport = useCallback(\n (vp: RFViewport): void => {\n const prev = viewportRef.current;\n if (prev != null && prev.x === vp.x && prev.y === vp.y && prev.zoom === vp.zoom)\n return;\n viewportRef.current = vp;\n setState((prev) => ({ ...prev, position: vp, zoom: vp.zoom }));\n onViewportChange(translateViewportBackward(vp));\n },\n [setState, onViewportChange],\n );\n\n useRFOnViewportChange({\n onStart: handleViewport,\n onChange: handleViewport,\n onEnd: handleViewport,\n });\n\n const [renderer, setRenderer] = useState<RenderProp<SymbolProps>>(() => () => null);\n\n const registerNodeRenderer = useCallback(\n (renderer: RenderProp<SymbolProps>) => setRenderer(() => renderer),\n [],\n );\n\n const nodeTypes = useMemo(\n () => ({\n custom: ({ id, xPos, yPos, selected }: RFNodeProps) => {\n return renderer({\n symbolKey: id,\n position: { x: xPos, y: yPos },\n selected,\n });\n },\n }),\n [renderer],\n );\n\n const edgesRef = useRef(edges);\n const edges_ = useMemo(() => {\n edgesRef.current = edges;\n return translateEdgesForward(edges);\n }, [edges]);\n const nodesRef = useRef(nodes);\n const nodes_ = useMemo(() => {\n nodesRef.current = nodes;\n return translateNodesForward(nodes);\n }, [nodes]);\n\n const handleNodesChange = useCallback(\n (changes: RFNodeChange[]) =>\n onNodesChange(\n nodeConverter(nodesRef.current, (n) => rfApplyNodeChanges(changes, n)),\n ),\n [onNodesChange],\n );\n\n const handleEdgesChange = useCallback(\n (changes: RFEdgeChange[]) =>\n onEdgesChange(\n edgeConverter(\n edgesRef.current,\n (e) => rfApplyEdgeChanges(changes, e),\n defaultEdgeColor,\n ),\n ),\n [onEdgesChange, defaultEdgeColor],\n );\n\n const handleEdgeUpdate = useCallback(\n (oldEdge: RFEdge, newConnection: RFConnection) =>\n onEdgesChange(\n edgeConverter(\n edgesRef.current,\n (e) => updateEdge(oldEdge, newConnection, e),\n defaultEdgeColor,\n ),\n ),\n [],\n );\n\n const handleConnect = useCallback(\n (conn: RFConnection) => {\n onEdgesChange(\n edgeConverter(edgesRef.current, (e) => rfAddEdge(conn, e), defaultEdgeColor),\n );\n },\n [onEdgesChange, defaultEdgeColor],\n );\n\n const handleEdgeSegmentsChange = useCallback(\n (id: string, segments: connector.Segment[]) => {\n const next = [...edgesRef.current];\n const index = next.findIndex((e) => e.key === id);\n if (index === -1) return;\n next[index] = { ...next[index], segments };\n edgesRef.current = next;\n onEdgesChange(next);\n },\n [onEdgesChange],\n );\n\n const editableProps = editable ? EDITABLE_PROPS : NOT_EDITABLE_PROPS;\n\n const EDGE_TYPES = useMemo(\n () => ({\n default: (props: RFEdgeProps) => (\n <EdgeComponent\n key={props.id}\n {...props}\n segments={props.data.segments}\n color={props.data.color}\n onSegmentsChange={useCallback(\n (segment) => handleEdgeSegmentsChange(props.id, segment),\n [props.id],\n )}\n />\n ),\n }),\n [handleEdgeSegmentsChange],\n );\n\n const triggerRef = useRef<HTMLElement>(null);\n Triggers.use({\n triggers: triggers.zoomReset,\n callback: useCallback(\n ({ stage, cursor }: Triggers.UseEvent) => {\n const reg = triggerRef.current;\n if (reg == null || stage !== \"start\" || !box.contains(reg, cursor)) return;\n fitView();\n },\n [fitView],\n ),\n });\n\n const selectTriggers = Triggers.purgeMouse(triggers.select)[0] ?? null;\n const panTriggers = Triggers.purgeMouse(triggers.pan)[0] ?? null;\n const zoomTriggers = Triggers.purgeMouse(triggers.zoom)[0] ?? null;\n const triggerProps: Partial<ReactFlowProps> = {\n selectionOnDrag: selectTriggers == null,\n panOnDrag: panTriggers == null,\n selectionKeyCode: selectTriggers,\n panActivationKeyCode: panTriggers,\n zoomActivationKeyCode: zoomTriggers,\n };\n\n const combinedRefs = useCombinedRefs(triggerRef, resizeRef);\n\n const ctxValue = useMemo(\n () => ({\n editable,\n onEditableChange,\n registerNodeRenderer,\n fitViewOnResize,\n setFitViewOnResize,\n }),\n [editable, onEditableChange, registerNodeRenderer, fitViewOnResize],\n );\n\n return (\n <Context.Provider value={ctxValue}>\n <Aether.Composite path={path}>\n <ReactFlow\n {...triggerProps}\n className={CSS(CSS.B(\"diagram\"), CSS.editable(editable))}\n nodes={nodes_}\n edges={edges_}\n nodeTypes={nodeTypes}\n edgeTypes={EDGE_TYPES}\n ref={combinedRefs}\n fitView\n onNodesChange={handleNodesChange}\n onEdgesChange={handleEdgesChange}\n onConnect={handleConnect}\n onEdgeUpdate={handleEdgeUpdate}\n defaultViewport={translateViewportForward(viewport)}\n connectionLineComponent={CustomConnectionLine}\n elevateEdgesOnSelect\n minZoom={0.5}\n maxZoom={1.2}\n isValidConnection={isValidConnection}\n connectionMode={ConnectionMode.Loose}\n snapGrid={[3, 3]}\n fitViewOptions={FIT_VIEW_OPTIONS}\n selectionMode={SelectionMode.Partial}\n proOptions={PRO_OPTIONS}\n deleteKeyCode={DELETE_KEY_CODES}\n {...props}\n style={{\n [CSS.var(\"diagram-zoom\")]: viewport.zoom,\n ...props.style,\n }}\n {...editableProps}\n >\n {children}\n </ReactFlow>\n </Aether.Composite>\n </Context.Provider>\n );\n },\n);\n\nexport const Background = (): ReactElement | null => {\n const { editable } = useContext();\n return editable ? <RFBackground /> : null;\n};\n\nexport interface ControlsProps extends Align.PackProps {}\n\nexport const Controls = ({ children, ...props }: ControlsProps): ReactElement => (\n <Align.Pack direction=\"y\" className={CSS.BE(\"diagram\", \"controls\")} {...props}>\n {children}\n </Align.Pack>\n);\n\nexport type ToggleEditControlProps = Omit<\n Button.ToggleIconProps,\n \"value\" | \"onChange\" | \"children\"\n>;\n\nexport const ToggleEditControl = ({\n onClick,\n ...props\n}: ToggleEditControlProps): ReactElement => {\n const { editable, onEditableChange } = useContext();\n return (\n <Button.ToggleIcon\n onChange={() => onEditableChange(!editable)}\n value={editable}\n uncheckedVariant=\"outlined\"\n checkedVariant=\"filled\"\n tooltipLocation={location.RIGHT_CENTER}\n tooltip={\n editable ? (\n <Text.Text level=\"small\">Disable edit mode</Text.Text>\n ) : (\n <Text.Text level=\"small\">Enable edit mode</Text.Text>\n )\n }\n {...props}\n >\n {editable ? <Icon.EditOff /> : <Icon.Edit />}\n </Button.ToggleIcon>\n );\n};\n\nexport type FitViewControlProps = Omit<Button.IconProps, \"children\">;\n\nexport const FitViewControl = ({\n onClick,\n ...props\n}: FitViewControlProps): ReactElement => {\n const { fitView } = useReactFlow();\n const { fitViewOnResize, setFitViewOnResize } = useContext();\n return (\n <Button.ToggleIcon\n onClick={(e) => {\n fitView(FIT_VIEW_OPTIONS);\n onClick?.(e);\n }}\n // @ts-expect-error\n value={fitViewOnResize}\n // @ts-expect-error\n onChange={(v) => setFitViewOnResize(v)}\n rightClickToggle\n tooltip={<Text.Text level=\"small\">Fit view to contents</Text.Text>}\n tooltipLocation={location.RIGHT_CENTER}\n variant=\"outlined\"\n {...props}\n >\n <Icon.Expand />\n </Button.ToggleIcon>\n );\n};\n\nexport const Diagram = (props: DiagramProps): ReactElement => (\n <ReactFlowProvider>\n <Core {...props} />\n </ReactFlowProvider>\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { box, xy, type direction, location } from \"@synnaxlabs/x\";\n\nimport { type NodeLayout } from \"@/vis/diagram/util\";\n\nexport const alignNodes = (\n layouts: NodeLayout[],\n dir: direction.Direction = \"x\",\n): NodeLayout[] => {\n if (layouts.length === 0) return [];\n const loc = location.construct(dir);\n const oppositeLoc = location.swap(loc);\n // sort the layouts in order of their x position, lowest to highest\n layouts.sort((a, b) => box.loc(a.box, loc) - box.loc(b.box, loc));\n // grab the first node\n layouts.forEach((layout, i) => {\n if (i === 0) return;\n const prev = layouts[i - 1];\n const prevRightHandle = prev.handles.find((h) => h.orientation === oppositeLoc);\n const leftHandle = layout.handles.find((h) => h.orientation === loc);\n if (prevRightHandle == null || leftHandle == null) return;\n // We want to align the left handle of the current node with the right handle of the previous node\n const prevHandleAbsPos = prevRightHandle.absolutePosition;\n const leftHandleAbsPos = leftHandle.absolutePosition;\n const dist = xy.set(xy.translation(leftHandleAbsPos, prevHandleAbsPos), dir, 0);\n const newPos = xy.translate(box.topLeft(layout.box), dist);\n layout.box = box.construct(newPos, box.dims(layout.box));\n });\n return layouts;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useLayoutEffect } from \"react\";\n\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { text } from \"@/text/core\";\nimport { Value } from \"@/vis/value/aether/value\";\n\nexport const corePropsZ = Value.z\n .omit({ font: true })\n .partial({ color: true })\n .extend({ level: text.levelZ.optional() });\n\nexport interface UseProps extends z.input<typeof corePropsZ> {\n aetherKey: string;\n}\n\nexport interface UseReturn {\n width: number;\n}\n\nexport const use = ({\n aetherKey,\n box,\n telem,\n color,\n precision,\n minWidth,\n level = \"small\",\n}: UseProps): UseReturn => {\n const memoProps = useMemoDeepEqualProps({\n box,\n telem,\n color,\n precision,\n level,\n minWidth,\n });\n\n const [, state, setState] = Aether.use({\n aetherKey,\n type: Value.TYPE,\n schema: Value.z,\n initialState: memoProps,\n });\n\n useLayoutEffect(() => setState((prev) => ({ ...prev, ...memoProps })), [memoProps]);\n return { width: state.width ?? state.minWidth };\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n createContext,\n type PropsWithChildren,\n useEffect,\n useContext as reactUseContext,\n} from \"react\";\n\nimport { type channel } from \"@synnaxlabs/client\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { control } from \"@/telem/control/aether\";\n\nexport interface ControllerProps\n extends Omit<z.input<typeof control.controllerStateZ>, \"needsControlOf\">,\n PropsWithChildren {\n onStatusChange?: (status: control.Status) => void;\n name: string;\n}\n\nexport interface ContextValue {\n needsControlOf: channel.Keys;\n}\n\nconst Context = createContext<ContextValue>({ needsControlOf: [] });\n\nexport const useContext = (): ContextValue => reactUseContext(Context);\n\nexport const Controller = Aether.wrap<ControllerProps>(\n control.Controller.TYPE,\n ({ aetherKey, children, onStatusChange, ...props }) => {\n const memoProps = useMemoDeepEqualProps(props);\n const [{ path }, { status, needsControlOf }, setState] = Aether.use({\n aetherKey,\n type: control.Controller.TYPE,\n schema: control.controllerStateZ,\n initialState: memoProps,\n });\n useEffect(() => {\n if (status != null) onStatusChange?.(status);\n }, [status, onStatusChange]);\n useEffect(() => {\n setState((state) => ({ ...state, ...memoProps }));\n }, [memoProps, setState]);\n useEffect(() => {\n return () => onStatusChange?.(\"released\");\n }, []);\n\n return (\n <Context.Provider value={{ needsControlOf }}>\n <Aether.Composite path={path}>{children}</Aether.Composite>;\n </Context.Provider>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type PropsWithChildren } from \"react\";\n\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { control } from \"@/telem/control/aether\";\n\nexport interface StateProviderProps\n extends z.input<typeof control.stateProviderStateZ>,\n PropsWithChildren {}\n\nexport const StateProvider = Aether.wrap<StateProviderProps>(\n control.StateProvider.TYPE,\n ({ aetherKey, children }) => {\n const [{ path }] = Aether.use({\n aetherKey,\n type: control.StateProvider.TYPE,\n schema: control.stateProviderStateZ,\n initialState: {},\n });\n return <Aether.Composite path={path}>{children}</Aether.Composite>;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useEffect, type PropsWithChildren } from \"react\";\n\nimport { TimeStamp } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { control } from \"@/telem/control/aether\";\nimport { Text } from \"@/text\";\nimport { Tooltip } from \"@/tooltip\";\n\nimport \"@/telem/control/Indicator.css\";\n\nexport interface IndicatorProps\n extends Omit<z.input<typeof control.indicatorStateZ>, \"status\" | \"color\">,\n PropsWithChildren {}\n\nexport const Indicator = Aether.wrap<IndicatorProps>(\n control.Indicator.TYPE,\n ({ aetherKey, colorSource, statusSource }): ReactElement => {\n const memoProps = useMemoDeepEqualProps({ colorSource, statusSource });\n\n const [, { color, status }, setState] = Aether.use({\n aetherKey,\n type: control.Indicator.TYPE,\n initialState: {\n ...memoProps,\n status: {\n key: \"no_chip\",\n variant: \"warning\",\n message: \"No chip connected.\",\n time: TimeStamp.now(),\n },\n },\n schema: control.indicatorStateZ,\n });\n\n useEffect(() => {\n setState((p) => ({ ...p, ...memoProps }));\n }, [memoProps, setState]);\n\n let parsedColor: Color.Crude;\n if (status.data?.color != null)\n parsedColor = Color.Color.z.parse(status.data.color);\n else if (color != null && !color.isZero) parsedColor = color;\n else parsedColor = \"var(--pluto-gray-l8)\";\n\n return (\n <Tooltip.Dialog location={{ x: \"center\", y: \"bottom\" }}>\n <Text.Text level=\"p\">{status.message}</Text.Text>\n <div\n className={CSS.B(\"indicator\")}\n style={{\n backgroundColor: Color.cssString(parsedColor),\n flexGrow: 1,\n }}\n />\n </Tooltip.Dialog>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type CSSProperties, type ReactElement, useCallback, useEffect } from \"react\";\n\nimport { control as clientControl } from \"@synnaxlabs/client\";\nimport { Icon } from \"@synnaxlabs/media\";\nimport { TimeStamp } from \"@synnaxlabs/x\";\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { type Status } from \"@/status\";\nimport { control } from \"@/telem/control/aether\";\nimport { Text } from \"@/text\";\n\nexport interface ChipProps\n extends Pick<z.input<typeof control.chipStateZ>, \"source\" | \"sink\">,\n Omit<Button.IconProps, \"onClick\" | \"children\"> {}\n\ninterface ChipStyle {\n message: string;\n chipColor: string;\n buttonStyle?: CSSProperties;\n disabled?: boolean;\n}\n\nconst tooltipMessage = (status: Status.Spec): ChipStyle => {\n switch (status.variant) {\n case \"disabled\":\n if (status.data?.valid === true)\n return {\n message: \"Uncontrolled. Click to take control.\",\n chipColor: \"var(--pluto-gray-l10)\",\n };\n return {\n message: \"No channel connected\",\n chipColor: \"var(--pluto-gray-l5)\",\n disabled: true,\n };\n\n case \"error\":\n return {\n message: \"Not controlled by you. Click to take absolute control.\",\n chipColor: \"var(--pluto-error-z)\",\n };\n case \"success\":\n if (status.data?.authority === clientControl.Authority.Absolute.valueOf())\n return {\n message: \"You have absolute control. Click to release.\",\n chipColor: \"var(--pluto-secondary-z)\",\n buttonStyle: {\n background: \"var(--pluto-secondary-z-30)\",\n },\n };\n return {\n message: \"You're in control. Release P&ID to release control.\",\n chipColor: \"var(--pluto-primary-z)\",\n };\n default:\n return {\n message: \"Unexpected status.\",\n chipColor: \"var(--pluto-error-z)\",\n };\n }\n};\n\nexport const Chip = Aether.wrap<ChipProps>(\n \"Chip\",\n ({ aetherKey, source, sink, className, ...props }): ReactElement => {\n const memoProps = useMemoDeepEqualProps({ source, sink });\n const [, { status }, setState] = Aether.use({\n aetherKey,\n type: control.Chip.TYPE,\n schema: control.chipStateZ,\n initialState: {\n triggered: false,\n ...memoProps,\n status: {\n key: \"no_chip\",\n variant: \"disabled\",\n message: \"No chip connected.\",\n time: TimeStamp.now(),\n },\n },\n });\n\n useEffect(() => {\n setState((state) => ({ ...state, ...memoProps }));\n }, [memoProps, setState]);\n\n const handleToggle = useCallback(\n () =>\n setState((state) => ({\n ...state,\n triggered: !state.triggered,\n })),\n [setState],\n );\n\n const { message, chipColor, buttonStyle, disabled } = tooltipMessage(status);\n\n return (\n <Button.Icon\n variant=\"text\"\n className={CSS(CSS.B(\"control-chip\"), className)}\n disabled={disabled}\n onClick={handleToggle}\n tooltip={<Text.Text level=\"small\">{message}</Text.Text>}\n style={buttonStyle}\n {...props}\n >\n <Icon.Circle color={chipColor} />\n </Button.Icon>\n );\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement, useEffect } from \"react\";\n\nimport { UnexpectedError } from \"@synnaxlabs/client\";\nimport { unique } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { control } from \"@/telem/control/aether\";\nimport { useContext } from \"@/telem/control/Controller\";\nimport { Legend as Core } from \"@/vis/legend\";\n\nexport interface LegendProps extends Core.SimpleProps {}\n\nexport const Legend = Aether.wrap<LegendProps>(\n control.Legend.TYPE,\n ({ aetherKey, ...props }): ReactElement => {\n const { needsControlOf } = useContext();\n const [, { states }, setState] = Aether.use({\n aetherKey,\n type: control.Legend.TYPE,\n schema: control.legendStateZ,\n initialState: {\n states: [],\n needsControlOf,\n },\n });\n\n useEffect(() => {\n setState((state) => ({ ...state, needsControlOf }));\n }, [needsControlOf]);\n\n // Filter out the unique subjects\n const subjects = unique(states.map((s) => s.subject.key));\n const data = subjects.map((s) => {\n const d = states.find((s2) => s2.subject.key === s);\n if (d == null) {\n throw new UnexpectedError(\"Legend subject not found\");\n }\n return { key: d.subject.key, label: d.subject.name, color: d.subjectColor };\n });\n\n return <Core.Simple data={data} {...props} />;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, useEffect } from \"react\";\n\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { button } from \"@/vis/button/aether\";\n\nexport interface UseProps extends Omit<z.input<typeof button.buttonStateZ>, \"trigger\"> {\n aetherKey: string;\n}\n\nexport interface UseReturn {\n click: () => void;\n}\n\nexport const use = ({ aetherKey, sink }: UseProps): UseReturn => {\n const memoProps = useMemoDeepEqualProps({ sink });\n const [, , setState] = Aether.use({\n aetherKey,\n type: button.Button.TYPE,\n schema: button.buttonStateZ,\n initialState: {\n trigger: 0,\n sink,\n },\n });\n\n useEffect(() => {\n setState((p) => ({ ...p, ...memoProps }));\n }, [memoProps]);\n\n const click = useCallback(() => {\n setState((p) => ({ ...p, trigger: p.trigger + 1 }));\n }, [setState]);\n\n return { click };\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, forwardRef } from \"react\";\n\nimport { type location } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { Text } from \"@/text\";\n\nexport interface LabelExtensionProps {\n label?: string;\n level?: Text.Level;\n orientation?: location.Outer;\n}\n\nexport interface LabeledProps\n extends Omit<Align.SpaceProps, \"value\" | \"onChange\" | \"direction\">,\n LabelExtensionProps {\n onChange: ({ label }: { label: LabelExtensionProps }) => void;\n}\n\nexport const Labeled = forwardRef<HTMLDivElement, LabeledProps>(\n (\n {\n label: value = \"\",\n onChange,\n level = \"p\",\n children,\n orientation = \"top\",\n style,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <Align.Space\n style={{\n // You may be wondering, why do we do this here? Well it's because react flow\n // uses a ResizeObserver to determine when to re-render edges. When we switch\n // from 'left' to 'right' or 'top' to 'bottom', the width and height of the\n // node remains the same, so the ResizeObserver doesn't fire. We need to redraw\n // the edges, so we add a margin to trigger it.\n marginRight: orientation === \"right\" ? 1 : 0,\n marginTop: orientation === \"top\" ? 1 : 0,\n ...style,\n }}\n size={2 / 3}\n direction={orientation}\n ref={ref}\n className={CSS(CSS.B(\"symbol\"), className)}\n align=\"center\"\n justify=\"center\"\n {...props}\n >\n {value.length > 0 && (\n <Text.Editable\n className={CSS.BE(\"symbol\", \"label\")}\n value={value}\n onChange={useCallback(\n (label) =>\n onChange({\n label: { label, level, orientation },\n }),\n [onChange, level],\n )}\n level={level}\n />\n )}\n {children}\n </Align.Space>\n );\n },\n);\nLabeled.displayName = \"Labeled\";\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n useEffect,\n type ComponentPropsWithoutRef,\n type ReactElement,\n useRef,\n type PropsWithChildren,\n type MouseEventHandler,\n} from \"react\";\n\nimport { dimensions, type location, direction, xy } from \"@synnaxlabs/x\";\nimport {\n type HandleProps as RFHandleProps,\n Handle as RFHandle,\n Position as RFPosition,\n useUpdateNodeInternals,\n} from \"reactflow\";\n\nimport { Button as CoreButton } from \"@/button\";\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Input } from \"@/input\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\n\nimport \"@/vis/schematic/primitives/Primitives.css\";\n\ninterface PathProps extends ComponentPropsWithoutRef<\"path\"> {}\n\nconst Path = (props: PathProps): ReactElement => (\n <path vectorEffect=\"non-scaling-stroke\" {...props} />\n);\n\ninterface RectProps extends ComponentPropsWithoutRef<\"rect\"> {}\n\nconst Rect = (props: RectProps): ReactElement => (\n <rect vectorEffect=\"non-scaling-stroke\" {...props} />\n);\n\ninterface CircleProps extends ComponentPropsWithoutRef<\"circle\"> {}\n\nconst Circle = (props: CircleProps): ReactElement => (\n <circle vectorEffect=\"non-scaling-stroke\" {...props} />\n);\n\ninterface LineProps extends ComponentPropsWithoutRef<\"line\"> {}\n\nconst Line = (props: LineProps): ReactElement => (\n <line vectorEffect=\"non-scaling-stroke\" {...props} />\n);\n\nexport interface OrientableProps {\n orientation?: location.Outer;\n}\n\nexport interface SVGBasedPrimitiveProps extends OrientableProps {\n color?: Color.Crude;\n scale?: number;\n}\n\nexport interface DivProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"color\" | \"onResize\">,\n OrientableProps {}\n\ninterface ToggleProps\n extends Omit<ComponentPropsWithoutRef<\"button\">, \"color\" | \"value\"> {\n triggered?: boolean;\n enabled?: boolean;\n color?: Color.Crude;\n}\n\ninterface HandleProps extends Omit<RFHandleProps, \"type\" | \"position\"> {\n orientation: location.Outer;\n location: location.Outer;\n left: number;\n top: number;\n id: string;\n}\n\nconst ORIENTATION_RF_POSITIONS: Record<\n location.Outer,\n Record<location.Outer, RFPosition>\n> = {\n left: {\n left: RFPosition.Left,\n right: RFPosition.Right,\n top: RFPosition.Top,\n bottom: RFPosition.Bottom,\n },\n right: {\n left: RFPosition.Right,\n right: RFPosition.Left,\n top: RFPosition.Bottom,\n bottom: RFPosition.Top,\n },\n top: {\n left: RFPosition.Bottom,\n right: RFPosition.Top,\n top: RFPosition.Left,\n bottom: RFPosition.Right,\n },\n bottom: {\n left: RFPosition.Top,\n right: RFPosition.Bottom,\n top: RFPosition.Right,\n bottom: RFPosition.Left,\n },\n};\n\nconst smartPosition = (\n position: location.Outer,\n orientation: location.Outer,\n): RFPosition => ORIENTATION_RF_POSITIONS[orientation][position];\n\nconst adjustHandle = (\n top: number,\n left: number,\n orientation: location.Outer,\n): { left: number; top: number } => {\n if (orientation === \"left\") return { top, left };\n if (orientation === \"right\") return { top: 100 - top, left: 100 - left };\n if (orientation === \"top\") return { top: 100 - left, left: top };\n return { top: left, left: 100 - top };\n};\n\nexport interface SmartHandlesProps extends PropsWithChildren<{}>, OrientableProps {}\n\nconst HandleBoundary = ({ children, orientation }: SmartHandlesProps): ReactElement => {\n let updateInternals: ReturnType<typeof useUpdateNodeInternals> | undefined;\n try {\n updateInternals = useUpdateNodeInternals();\n } catch (e) {\n return <></>;\n }\n const ref = useRef<HTMLDivElement & HTMLButtonElement>(null);\n const first = useRef<boolean>(true);\n useEffect(() => {\n if (ref.current == null) return;\n if (first.current) {\n first.current = false;\n return;\n }\n const node = ref.current.closest(\".react-flow__node\");\n const id = node?.getAttribute(\"data-id\");\n if (id == null) return;\n updateInternals?.(id);\n }, [orientation]);\n return (\n <>\n <span ref={ref} />\n {children}\n </>\n );\n};\n\nconst Handle = ({\n location,\n orientation,\n left,\n top,\n ...props\n}: HandleProps): ReactElement => {\n const adjusted = adjustHandle(top, left, orientation);\n return (\n <RFHandle\n position={smartPosition(location, orientation)}\n {...props}\n type=\"source\"\n onClick={(e) => e.stopPropagation()}\n className={(CSS.B(\"handle\"), CSS.BE(\"handle\", props.id))}\n style={{\n left: `${adjusted.left}%`,\n top: `${adjusted.top}%`,\n }}\n />\n );\n};\n\ninterface ToggleValveButtonProps extends ToggleProps {\n orientation?: location.Outer;\n}\n\nconst Toggle = ({\n className,\n enabled = false,\n triggered = false,\n color,\n orientation = \"left\",\n ...props\n}: ToggleValveButtonProps): ReactElement => (\n <button\n className={CSS(\n CSS.B(\"symbol-primitive\"),\n CSS.B(\"symbol-primitive-toggle\"),\n orientation != null && CSS.loc(orientation),\n enabled && CSS.M(\"enabled\"),\n triggered && CSS.M(\"triggered\"),\n className,\n )}\n {...props}\n />\n);\n\nconst Div = ({ className, orientation = \"left\", ...props }: DivProps): ReactElement => (\n <div className={CSS(CSS.B(\"symbol-primitive\"), className)} {...props} />\n);\n\nexport interface InternalSVGProps\n extends SVGBasedPrimitiveProps,\n Omit<ComponentPropsWithoutRef<\"svg\">, \"direction\" | \"color\" | \"orientation\"> {\n dimensions: dimensions.Dimensions;\n color?: Color.Crude;\n scale?: number;\n}\n\nconst BASE_SCALE = 0.8;\n\nconst InternalSVG = ({\n dimensions: dims,\n orientation = \"left\",\n children,\n className,\n color,\n style = {},\n scale = 1,\n ...props\n}: InternalSVGProps): ReactElement => {\n const dir = direction.construct(orientation);\n dims = dir === \"y\" ? dimensions.swap(dims) : dims;\n const colorStr = Color.cssString(color);\n // @ts-expect-error - css variables\n if (color != null) style[CSS.var(\"symbol-color\")] = new Color.Color(color).rgbString;\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={dimensions.svgViewBox(dims)}\n className={CSS(CSS.loc(orientation), className)}\n fill={colorStr}\n stroke={colorStr}\n {...props}\n style={{\n aspectRatio: `${dims.width} / ${dims.height}`,\n width: dimensions.scale(dims, scale * BASE_SCALE).width,\n ...style,\n }}\n >\n <g>{children}</g>\n </svg>\n );\n};\n\nexport interface FourWayValveProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const FourWayValve = ({\n className,\n orientation,\n scale,\n color,\n ...props\n}: FourWayValveProps): ReactElement => (\n <Toggle\n {...props}\n orientation={orientation}\n className={CSS(CSS.B(\"four-way-valve\"), className)}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation=\"left\" left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation=\"left\" left={100} top={50} id=\"2\" />\n <Handle location=\"top\" orientation=\"left\" left={50} top={0} id=\"3\" />\n <Handle location=\"bottom\" orientation=\"left\" left={50} top={100} id=\"4\" />\n </HandleBoundary>\n <InternalSVG dimensions={{ width: 87, height: 87 }} color={color} scale={scale}>\n <Path d=\"M43.5 43.5L6.35453 24.7035C4.35901 23.6937 2 25.1438 2 27.3803V59.6197C2 61.8562 4.35901 63.3063 6.35453 62.2965L43.5 43.5ZM43.5 43.5L80.6455 24.7035C82.641 23.6937 85 25.1438 85 27.3803V59.6197C85 61.8562 82.641 63.3063 80.6455 62.2965L43.5 43.5Z\" />\n <Path d=\"M43.5 43.5L24.7035 80.6455C23.6937 82.641 25.1438 85 27.3803 85H59.6197C61.8562 85 63.3063 82.641 62.2965 80.6455L43.5 43.5ZM43.5 43.5L24.7035 6.35453C23.6937 4.35901 25.1438 2 27.3803 2H59.6197C61.8562 2 63.3063 4.35901 62.2965 6.35453L43.5 43.5Z\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface ThreeWayValveProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const ThreeWayValve = ({\n color,\n orientation = \"left\",\n scale,\n ...props\n}: ThreeWayValveProps): ReactElement => (\n <Toggle\n {...props}\n className={CSS(CSS.B(\"three-way-valve\"))}\n orientation={orientation}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"bottom\" orientation={orientation} left={50} top={100} id=\"1\" />\n <Handle location=\"left\" orientation={orientation} left={0} top={33} id=\"2\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={33} id=\"3\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 64 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M43.5 21L6.35453 2.20349C4.35901 1.19372 2 2.64384 2 4.88029V37.1197C2 39.3562 4.35901 40.8063 6.35453 39.7965L43.5 21ZM43.5 21L80.6455 2.20349C82.641 1.19372 85 2.64384 85 4.8803V37.1197C85 39.3562 82.641 40.8063 80.6455 39.7965L43.5 21Z\" />\n <Path d=\"M44.3923 22.3611C44.0222 21.6298 42.9778 21.6298 42.6077 22.3611L24.7035 57.7433C23.6937 59.7388 25.1438 62.0978 27.3803 62.0978L59.6197 62.0978C61.8562 62.0978 63.3063 59.7388 62.2965 57.7433L44.3923 22.3611Z\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface ValveProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const Valve = ({\n orientation = \"left\",\n color,\n scale,\n ...props\n}: ValveProps): ReactElement => (\n <Toggle {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 42 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M43.5 21L6.35453 2.20349C4.35901 1.19372 2 2.64384 2 4.88029V37.1197C2 39.3562 4.35901 40.8063 6.35453 39.7965L43.5 21ZM43.5 21L80.6455 2.20349C82.641 1.19372 85 2.64384 85 4.8803V37.1197C85 39.3562 82.641 40.8063 80.6455 39.7965L43.5 21Z\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface SolenoidValveProps extends ToggleProps, SVGBasedPrimitiveProps {\n normallyOpen?: boolean;\n}\n\nexport const SolenoidValve = ({\n className,\n color,\n orientation = \"left\",\n normallyOpen = false,\n scale,\n ...props\n}: SolenoidValveProps): ReactElement => (\n <Toggle\n className={CSS(\n CSS.B(\"solenoid-valve\"),\n normallyOpen && CSS.M(\"normally-open\"),\n className,\n )}\n {...props}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={69} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={69} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 69 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path\n className={CSS.B(\"body\")}\n d=\"M43.5 48L6.35453 29.2035C4.35901 28.1937 2 29.6438 2 31.8803V64.1197C2 66.3562 4.35901 67.8063 6.35453 66.7965L43.5 48ZM43.5 48L80.6455 29.2035C82.641 28.1937 85 29.6438 85 31.8803V64.1197C85 66.3562 82.641 67.8063 80.6455 66.7965L43.5 48Z\"\n />\n <Path d=\"M43.5 47L43.5 24.6177\" />\n <Rect x=\"29\" y=\"2\" width=\"29\" height=\"22.5333\" rx=\"1\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface ReliefValveProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const ReliefValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: ReliefValveProps): ReactElement => (\n <Div\n orientation={orientation}\n className={CSS(CSS.B(\"relief-valve\"), className)}\n {...props}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={66} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={66} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 58 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M43.5 37L6.35453 18.2035C4.35901 17.1937 2 18.6438 2 20.8803V53.1197C2 55.3562 4.35901 56.8063 6.35453 55.7965L43.5 37ZM43.5 37L80.6455 18.2035C82.641 17.1937 85 18.6438 85 20.8803V53.1197C85 55.3562 82.641 56.8063 80.6455 55.7965L43.5 37Z\" />\n <Path d=\"M43.5 2L43.5 38\" strokeLinecap=\"round\" />\n <Path d=\"M31.8011 14.0802L55.1773 4.29611\" strokeLinecap=\"round\" />\n <Path d=\"M31.8011 20.0802L55.1773 10.2961\" strokeLinecap=\"round\" />\n <Path d=\"M31.8011 26.0802L55.1773 16.2961\" strokeLinecap=\"round\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface CheckValveProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const CheckValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: CheckValveProps): ReactElement => (\n <Div\n orientation={orientation}\n className={CSS(CSS.B(\"check-valve\"), className)}\n {...props}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 45, height: 43 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M43 2L43 40\" strokeLinecap=\"round\" />\n <Path d=\"M41.6607 21.8946C42.3917 21.5238 42.3906 20.4794 41.6589 20.1101L6.25889 2.2412C4.26237 1.23341 1.90481 2.68589 1.90704 4.92235L1.93925 37.1617C1.94148 39.3982 4.30194 40.846 6.29644 39.8342L41.6607 21.8946Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface AngledValveProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const AngledValve = ({\n color,\n className,\n orientation = \"left\",\n scale,\n ...props\n}: AngledValveProps): ReactElement => (\n <Toggle\n {...props}\n orientation={orientation}\n className={CSS(CSS.B(\"angled-valve\"), className)}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"bottom\" orientation={orientation} left={33} top={100} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={35} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 64, height: 64 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M22.3611 20.1077C21.6298 20.4778 21.6298 21.5222 22.3611 21.8923L57.7433 39.7965C59.7388 40.8063 62.0978 39.3562 62.0978 37.1197L62.0978 4.88029C62.0978 2.64384 59.7388 1.19372 57.7433 2.2035L22.3611 20.1077Z\" />\n <Path d=\"M21.8923 22.3611C21.5222 21.6298 20.4778 21.6298 20.1077 22.3611L2.20349 57.7433C1.19372 59.7388 2.64384 62.0978 4.8803 62.0978L37.1197 62.0978C39.3562 62.0978 40.8063 59.7388 39.7965 57.7433L21.8923 22.3611Z\" />\n <Path d=\"M24.3461 18.5709L21.7484 19.88C20.9998 20.2572 20.3887 20.8601 20.0012 21.6035L19.3383 22.8756\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport const Tag = (): ReactElement => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 66 25\">\n <Path d=\"M57.0945 1.83334H4.04767C2.39087 1.83334 1.45252 3.73241 2.45908 5.0484L7.42509 11.5411C7.96869 12.2518 7.97408 13.2371 7.43828 13.9538L2.94078 19.9691C1.95471 21.2879 2.89585 23.1667 4.54256 23.1667H57.2344C57.9298 23.1667 58.5752 22.8055 58.939 22.2128L64.2505 13.5584C64.6483 12.9102 64.644 12.0925 64.2395 11.4484L58.7881 2.76955C58.4222 2.18696 57.7825 1.83334 57.0945 1.83334Z\" />\n </svg>\n);\n\nexport interface ReduceFittingProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const ReduceFitting = ({\n className,\n orientation,\n color,\n scale,\n ...props\n}: ReduceFittingProps): ReactElement => (\n <Div\n orientation={orientation}\n className={CSS(CSS.B(\"reduce-fitting\"), className)}\n {...props}\n >\n <InternalSVG\n dimensions={{ width: 42, height: 43 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M38.862 31.1414L4.86205 41.3414C2.93721 41.9189 1 40.4775 1 38.4679V21.8707V4.53209C1 2.5225 2.93721 1.08116 4.86204 1.65861L38.862 11.8586C40.131 12.2393 41 13.4073 41 14.7321V21.5V28.2679C41 29.5927 40.131 30.7607 38.862 31.1414Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface PumpProps extends ToggleProps, SVGBasedPrimitiveProps {}\n\nexport const Pump = ({\n color,\n className,\n orientation = \"left\",\n scale,\n ...props\n}: PumpProps): ReactElement => (\n <Toggle\n {...props}\n className={CSS(CSS.B(\"pump\"), className)}\n orientation={orientation}\n >\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={39} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={95} top={3} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 68, height: 61 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Circle cx=\"35\" cy=\"25\" r=\"23\" />\n <Path d=\"M50 41.5L56.7186 50.8314C57.6711 52.1544 56.7257 54 55.0955 54H14.9045C13.2743 54 12.3289 52.1544 13.2814 50.8314L20 41.5\" />\n <Line x1=\"35\" y1=\"2\" x2=\"65.0167\" y2=\"2\" />\n <Line x1=\"1\" y1=\"24\" x2=\"35\" y2=\"24\" />\n </InternalSVG>\n </Toggle>\n);\n\nexport interface BurstDiscProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const BurstDisc = ({\n className,\n color,\n orientation = \"left\",\n scale,\n ...props\n}: BurstDiscProps): ReactElement => {\n const colorStr = Color.cssString(color);\n return (\n <Div {...props} className={CSS(CSS.B(\"symbol\"), className)}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={2} top={50} id=\"1\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 40, height: 48 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M24 24C24 35.1852 15.2546 44.4725 3.87626 45.8297C2.90571 45.9455 2 45.1407 2 44V4C2 2.85926 2.90571 2.0545 3.87626 2.17027C15.2546 3.52755 24 12.8148 24 24Z\" />\n <Path\n d=\"M37.9706 23.2076C38.4906 23.6079 38.4906 24.3921 37.9706 24.7924L33.86 27.9568C33.2024 28.463 32.25 27.9942 32.25 27.1644V20.8356C32.25 20.0058 33.2024 19.537 33.86 20.0432L37.9706 23.2076Z\"\n fill={colorStr}\n />\n <Path d=\"M33 24H3\" strokeLinecap=\"round\" />\n </InternalSVG>\n </Div>\n );\n};\n\nexport interface CapProps extends SVGBasedPrimitiveProps, DivProps {}\n\nexport const Cap = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: CapProps): ReactElement => (\n <Div className={CSS(CSS.B(\"cap\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n </HandleBoundary>\n <InternalSVG\n color={color}\n dimensions={{ width: 26, height: 48 }}\n orientation={orientation}\n scale={scale}\n >\n <Path d=\"M24 24C24 35.1852 15.2546 44.4725 3.87626 45.8297C2.90571 45.9455 2 45.1407 2 44V4C2 2.85926 2.90571 2.0545 3.87626 2.17027C15.2546 3.52755 24 12.8148 24 24Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface ManualValveProps extends SVGBasedPrimitiveProps, DivProps {}\n\nexport const ManualValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: ManualValveProps): ReactElement => (\n <Div className={CSS(CSS.B(\"manual-valve\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={58} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={58} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 48 }}\n color={color}\n orientation={orientation}\n scale={scale}\n >\n <Line x1=\"43.5\" y1=\"27\" x2=\"43.5\" y2=\"1\" />\n <Path d=\"M19.64 2L66.68 2\" strokeLinecap=\"round\" />\n <Path d=\"M43.5 27L6.35453 8.20349C4.35901 7.19372 2 8.64384 2 10.8803V43.1197C2 45.3562 4.35901 46.8063 6.35453 45.7965L43.5 27ZM43.5 27L80.6455 8.20349C82.641 7.19372 85 8.64384 85 10.8803V43.1197C85 45.3562 82.641 46.8063 80.6455 45.7965L43.5 27Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface FilterProps extends SVGBasedPrimitiveProps, DivProps {}\n\nexport const Filter = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: FilterProps): ReactElement => (\n <Div className={CSS(CSS.B(\"filter\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={2} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={98} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 52, height: 34 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path d=\"M6 17L24.8 2.9C25.5111 2.36667 26.4889 2.36667 27.2 2.9L46 17M6 17L24.8 31.1C25.5111 31.6333 26.4889 31.6333 27.2 31.1L46 17M6 17H1M46 17H51\" />\n </InternalSVG>\n </Div>\n);\n\ntype DetailedBorderRadius = Record<location.CornerXYString, xy.XY>;\ntype BorderRadius =\n | number\n | Record<direction.Direction, number>\n | Record<location.CornerXYString, number>\n | DetailedBorderRadius;\n\nconst parseBorderRadius = (radius: BorderRadius): DetailedBorderRadius => {\n if (typeof radius === \"number\")\n return {\n topLeft: xy.construct(radius),\n topRight: xy.construct(radius),\n bottomLeft: xy.construct(radius),\n bottomRight: xy.construct(radius),\n };\n if (\"x\" in radius)\n return {\n topLeft: radius,\n topRight: radius,\n bottomLeft: radius,\n bottomRight: radius,\n };\n if (typeof radius.bottomLeft === \"number\")\n return {\n topLeft: xy.construct(radius.topLeft),\n topRight: xy.construct(radius.topRight),\n bottomLeft: xy.construct(radius.bottomLeft),\n bottomRight: xy.construct(radius.bottomRight),\n };\n\n return radius as DetailedBorderRadius;\n};\n\nconst cssBorderRadius = (radius: DetailedBorderRadius): string => {\n const { topLeft, topRight, bottomLeft, bottomRight } = radius;\n return `${topLeft.x}% ${topRight.x}% ${bottomRight.x}% ${bottomLeft.x}% / ${topLeft.y}% ${topRight.y}% ${bottomRight.y}% ${bottomLeft.y}%`;\n};\n\nconst DEFAULT_DIMENSIONS = { width: 40, height: 80 };\nconst DEFAULT_BORDER_RADIUS = { x: 50, y: 10 };\n\nexport interface TankProps extends DivProps {\n dimensions?: dimensions.Dimensions;\n borderRadius?: BorderRadius;\n color?: Color.Crude;\n onResize?: (dimensions: dimensions.Dimensions) => void;\n}\n\nexport const Tank = ({\n className,\n dimensions = DEFAULT_DIMENSIONS,\n borderRadius = DEFAULT_BORDER_RADIUS,\n color,\n onResize,\n ...props\n}: TankProps): ReactElement => {\n const detailedRadius = parseBorderRadius(borderRadius);\n const t = Theming.use();\n return (\n <Div\n className={CSS(className, CSS.B(\"tank\"))}\n style={{\n ...dimensions,\n borderRadius: cssBorderRadius(detailedRadius),\n borderColor: Color.cssString(color ?? t.colors.gray.l9),\n }}\n {...props}\n >\n <HandleBoundary>\n <Handle location=\"top\" orientation=\"left\" left={50} top={0} id=\"1\" />\n <Handle\n location=\"top\"\n orientation=\"left\"\n left={-0.5}\n top={detailedRadius.topLeft.y - 1}\n id=\"2\"\n />\n <Handle\n location=\"top\"\n orientation=\"left\"\n left={101}\n top={detailedRadius.topRight.y - 1}\n id=\"3\"\n />\n <Handle location=\"bottom\" orientation=\"left\" left={50} top={100} id=\"4\" />\n <Handle\n location=\"bottom\"\n orientation=\"left\"\n left={-0.5}\n top={100 - detailedRadius.bottomLeft.y + 1}\n id=\"5\"\n />\n <Handle\n location=\"bottom\"\n orientation=\"left\"\n left={101}\n top={100 - detailedRadius.bottomRight.y + 1}\n id=\"6\"\n />\n <Handle location=\"left\" orientation=\"left\" left={-0.5} top={50} id=\"7\" />\n <Handle location=\"right\" orientation=\"left\" left={101} top={50} id=\"8\" />\n </HandleBoundary>\n </Div>\n );\n};\n\nexport interface RegulatorProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const Regulator = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: RegulatorProps): ReactElement => (\n <Div className={CSS(className, CSS.B(\"regulator\"))} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={66} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={66} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 84, height: 58 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path d=\"M42 36.5L5.41845 16.8709C3.41989 15.7985 1 17.2463 1 19.5144V53.4856C1 55.7537 3.4199 57.2015 5.41846 56.1291L42 36.5ZM42 36.5L78.5815 16.8709C80.5801 15.7985 83 17.2463 83 19.5144V53.4856C83 55.7537 80.5801 57.2015 78.5815 56.1291L42 36.5Z\" />\n <Path d=\"M40 1.5H27.1522C24.8526 1.5 23.4081 3.9809 24.5432 5.98082L41.1303 35.2058C41.6373 36.099 43 35.7392 43 34.7122V4.5C43 2.84315 41.6569 1.5 40 1.5Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface OrificeProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const Orifice = ({\n className,\n orientation = \"left\",\n scale,\n color,\n ...props\n}: OrificeProps): ReactElement => (\n <Div className={CSS(CSS.B(\"orifice\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 70, height: 34 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path d=\"M2 2.5C27.451 21.3469 60.0915 12.0132 68 2.5\" strokeLinecap=\"round\" />\n <Path d=\"M2 32.5C27.451 13.6531 60.0915 22.9868 68 32.5\" strokeLinecap=\"round\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface NeedleValveProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const NeedleValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: NeedleValveProps): ReactElement => (\n <Div className={CSS(CSS.B(\"needle-valve\"), className)} {...props}>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={1} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={99} top={50} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 87, height: 42 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path\n d=\"M43.0152 21.5391L38.237 2.62245C38.1573 2.30658 38.396 2 38.7218 2L48.2782 2C48.604 2 48.8427 2.30658 48.763 2.62245L43.9848 21.5391C43.8576 22.0425 43.1424 22.0425 43.0152 21.5391Z\"\n fill={Color.cssString(color)}\n />\n <Path d=\"M43.5 21.5L6.35453 2.70349C4.35901 1.69372 2 3.14384 2 5.38029V37.6197C2 39.8562 4.35901 41.3063 6.35453 40.2965L43.5 21.5ZM43.5 21.5L80.6455 2.70349C82.641 1.69372 85 3.14384 85 5.3803V37.6197C85 39.8562 82.641 41.3063 80.6455 40.2965L43.5 21.5Z\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface AngledReliefValveProps extends DivProps, SVGBasedPrimitiveProps {}\n\nexport const AngledReliefValve = ({\n className,\n orientation = \"left\",\n color,\n scale,\n ...props\n}: AngledReliefValveProps): ReactElement => (\n <Div\n orientation={orientation}\n className={CSS(CSS.B(\"angled-relief-valve\"), className)}\n {...props}\n >\n <HandleBoundary>\n <Handle location=\"bottom\" orientation={orientation} left={33} top={100} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={45} id=\"2\" />\n </HandleBoundary>\n <InternalSVG\n dimensions={{ width: 64, height: 79 }}\n orientation={orientation}\n color={color}\n scale={scale}\n >\n <Path d=\"M20.75 2L20.75 38\" strokeLinecap=\"round\" />\n <Path d=\"M9.05106 14.0802L32.4273 4.29611\" strokeLinecap=\"round\" />\n <Path d=\"M9.05106 20.0802L32.4273 10.2961\" strokeLinecap=\"round\" />\n <Path d=\"M9.05106 26.0802L32.4273 16.2961\" strokeLinecap=\"round\" />\n <Path d=\"M22.3611 35.1077C21.6298 35.4778 21.6298 36.5222 22.3611 36.8923L57.7433 54.7965C59.7388 55.8063 62.0978 54.3562 62.0978 52.1197L62.0978 19.8803C62.0978 17.6438 59.7388 16.1937 57.7433 17.2035L22.3611 35.1077Z\" />\n <Path d=\"M21.8923 37.3611C21.5222 36.6298 20.4778 36.6298 20.1077 37.3611L2.20349 72.7433C1.19372 74.7388 2.64384 77.0978 4.8803 77.0978H37.1197C39.3562 77.0978 40.8063 74.7388 39.7965 72.7433L21.8923 37.3611Z\" />\n <Path d=\"M24.3461 33.5709L21.7484 34.88C20.9998 35.2572 20.3887 35.8601 20.0012 36.6035L19.3383 37.8756\" />\n </InternalSVG>\n </Div>\n);\n\nexport interface ValueProps extends DivProps {\n dimensions?: dimensions.Dimensions;\n color?: Color.Crude;\n units?: string;\n}\n\nexport const Value = ({\n className,\n color,\n dimensions,\n orientation,\n units = \"psi\",\n children,\n ...props\n}: ValueProps): ReactElement => {\n const borderColor = Color.cssString(color);\n const theme = Theming.use();\n let textColor: string | undefined = \"var(--pluto-gray-l0)\";\n if (color != null)\n textColor = Color.cssString(\n new Color.Color(color).pickByContrast(theme.colors.gray.l0, theme.colors.gray.l9),\n );\n return (\n <Div\n className={CSS(CSS.B(\"value\"), className)}\n {...props}\n style={{\n borderColor,\n height: dimensions?.height,\n width: \"100%\",\n }}\n >\n <div\n className={CSS.BE(\"value\", \"content\")}\n style={{ flexGrow: 1, minWidth: dimensions?.width, inlineSize: 80 }}\n >\n {children}\n </div>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation=\"left\" left={-2} top={50} id=\"1\" />\n <Handle location=\"right\" orientation=\"left\" left={102} top={50} id=\"2\" />\n <Handle location=\"top\" orientation=\"left\" left={50} top={-2} id=\"3\" />\n <Handle location=\"bottom\" orientation=\"left\" left={50} top={102} id=\"4\" />\n </HandleBoundary>\n <div className={CSS.BE(\"value\", \"units\")} style={{ background: borderColor }}>\n <Text.Text level=\"small\" color={textColor}>\n {units}\n </Text.Text>\n </div>\n </Div>\n );\n};\n\nexport interface SwitchProps extends Omit<ToggleProps, \"onClick\">, OrientableProps {\n onClick?: MouseEventHandler<HTMLInputElement>;\n}\n\nexport const Switch = ({\n enabled = false,\n onClick,\n orientation = \"left\",\n}: SwitchProps): ReactElement => {\n return (\n <Div orientation={orientation}>\n <Input.Switch value={enabled} onClick={onClick} onChange={() => {}} />\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={50} id=\"2\" />\n </HandleBoundary>\n </Div>\n );\n};\n\nexport interface ButtonProps extends Omit<DivProps, \"onClick\"> {\n label?: string;\n onClick?: MouseEventHandler<HTMLButtonElement>;\n}\n\nexport const Button = ({\n onClick,\n orientation = \"left\",\n label = \"\",\n}: ButtonProps): ReactElement => {\n return (\n <Div orientation={orientation}>\n <CoreButton.Button onClick={onClick}>{label}</CoreButton.Button>\n <HandleBoundary orientation={orientation}>\n <Handle location=\"left\" orientation={orientation} left={0} top={50} id=\"1\" />\n <Handle location=\"right\" orientation={orientation} left={100} top={50} id=\"2\" />\n <Handle location=\"top\" orientation={orientation} left={50} top={0} id=\"3\" />\n <Handle\n location=\"bottom\"\n orientation={orientation}\n left={50}\n top={100}\n id=\"4\"\n />\n </HandleBoundary>\n </Div>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, useEffect } from \"react\";\n\nimport { type z } from \"zod\";\n\nimport { Aether } from \"@/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\nimport { toggle } from \"@/vis/toggle/aether\";\n\nexport interface UseProps\n extends Pick<z.input<typeof toggle.toggleStateZ>, \"source\" | \"sink\"> {\n aetherKey: string;\n}\n\nexport interface UseReturn\n extends Pick<z.output<typeof toggle.toggleStateZ>, \"triggered\" | \"enabled\"> {\n toggle: () => void;\n}\n\nexport const use = ({ aetherKey, source, sink }: UseProps): UseReturn => {\n const memoProps = useMemoDeepEqualProps({ source, sink });\n const [, { triggered, enabled }, setState] = Aether.use({\n aetherKey,\n type: toggle.Toggle.TYPE,\n schema: toggle.toggleStateZ,\n initialState: {\n triggered: false,\n enabled: false,\n ...memoProps,\n },\n });\n\n useEffect(() => {\n setState((state) => ({ ...state, ...memoProps }));\n }, [memoProps, setState]);\n\n const handleToggle = useCallback(\n () =>\n setState((state) => ({\n ...state,\n triggered: !state.triggered,\n })),\n [setState],\n );\n\n return {\n toggle: handleToggle,\n triggered,\n enabled,\n };\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useState, type ReactElement, useCallback } from \"react\";\n\nimport { box, xy, location, type UnknownRecord, direction } from \"@synnaxlabs/x\";\n\nimport { Aether } from \"@/aether\";\nimport { Align } from \"@/align\";\nimport { type Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { useResize } from \"@/hooks\";\nimport { Control } from \"@/telem/control\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\nimport { Tooltip } from \"@/tooltip\";\nimport { Button as CoreButton } from \"@/vis/button\";\nimport { useInitialViewport } from \"@/vis/diagram/aether/Diagram\";\nimport { Labeled, type LabelExtensionProps } from \"@/vis/schematic/Labeled\";\nimport { Primitives } from \"@/vis/schematic/primitives\";\nimport { Toggle } from \"@/vis/toggle\";\nimport { Value as CoreValue } from \"@/vis/value\";\n\nimport \"@/vis/schematic/Symbols.css\";\n\nexport interface ControlStateProps extends Omit<Align.SpaceProps, \"direction\"> {\n showChip?: boolean;\n showIndicator?: boolean;\n chip?: Control.ChipProps;\n indicator?: Control.IndicatorProps;\n orientation?: location.Outer;\n}\n\nconst swapXLocation = (l: location.Outer): location.Outer =>\n direction.construct(l) === \"x\" ? (location.swap(l) as location.Outer) : l;\nconst swapYLocation = (l: location.Outer): location.Outer =>\n direction.construct(l) === \"y\" ? (location.swap(l) as location.Outer) : l;\n\nexport const ControlState = ({\n showChip = true,\n showIndicator = true,\n indicator,\n orientation = \"left\",\n chip,\n children,\n ...props\n}: ControlStateProps): ReactElement => (\n <Align.Space\n direction={location.rotate90(orientation)}\n align=\"center\"\n justify=\"center\"\n empty\n {...props}\n >\n <Align.Space\n direction={direction.construct(orientation)}\n align=\"center\"\n className={CSS(CSS.B(\"control-state\"))}\n size=\"small\"\n >\n {showChip && <Control.Chip size=\"small\" {...chip} />}\n {showIndicator && <Control.Indicator {...indicator} />}\n </Align.Space>\n {children}\n </Align.Space>\n);\n\nexport type SymbolProps<P extends object = UnknownRecord> = P & {\n symbolKey: string;\n position: xy.XY;\n selected: boolean;\n onChange: (value: P) => void;\n};\n\nexport interface ThreeWayValveProps\n extends Primitives.ThreeWayValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const ThreeWayValve = Aether.wrap<SymbolProps<ThreeWayValveProps>>(\n \"ThreeWayValve\",\n ({\n aetherKey,\n label,\n onChange,\n control,\n source,\n sink,\n orientation = \"left\",\n color,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({\n aetherKey,\n source,\n sink,\n });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={swapXLocation(orientation)}>\n <Primitives.ThreeWayValve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const ThreeWayValvePreview = (props: ThreeWayValveProps): ReactElement => (\n <Primitives.ThreeWayValve {...props} />\n);\n\nexport interface ValveProps\n extends Primitives.ValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const Valve = Aether.wrap<SymbolProps<ValveProps>>(\n \"Valve\",\n ({\n control,\n aetherKey,\n label,\n onChange,\n source,\n sink,\n orientation,\n color,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={orientation}>\n <Primitives.Valve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const ValvePreview = (props: ValveProps): ReactElement => (\n <Primitives.Valve {...props} />\n);\n\nexport interface SolenoidValveProps\n extends Primitives.SolenoidValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const SolenoidValve = Aether.wrap<SymbolProps<SolenoidValveProps>>(\n \"SolenoidValve\",\n ({\n aetherKey,\n label,\n onChange,\n orientation = \"left\",\n normallyOpen,\n color,\n source,\n sink,\n control,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={swapYLocation(orientation)}>\n <Primitives.SolenoidValve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n normallyOpen={normallyOpen}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const SolenoidValvePreview = (props: SolenoidValveProps): ReactElement => (\n <Primitives.SolenoidValve {...props} />\n);\n\nexport interface FourWayValveProps\n extends Primitives.FourWayValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const FourWayValve = Aether.wrap<SymbolProps<FourWayValveProps>>(\n \"FourWayValve\",\n ({\n aetherKey,\n control,\n label,\n onChange,\n orientation,\n color,\n source,\n sink,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={orientation}>\n <Primitives.FourWayValve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const FourWayValvePreview = (props: FourWayValveProps): ReactElement => (\n <Primitives.FourWayValve {...props} />\n);\n\nexport interface AngledValveProps\n extends Primitives.AngledValveProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const AngledValve = Aether.wrap<SymbolProps<AngledValveProps>>(\n \"AngleValve\",\n ({\n aetherKey,\n label,\n control,\n onChange,\n orientation = \"left\",\n color,\n source,\n sink,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={swapXLocation(orientation)}>\n <Primitives.AngledValve\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const AngledValvePreview = (props: AngledValveProps): ReactElement => (\n <Primitives.AngledValve {...props} />\n);\n\nexport interface PumpProps\n extends Primitives.PumpProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const Pump = Aether.wrap<SymbolProps<PumpProps>>(\n \"Pump\",\n ({\n aetherKey,\n label,\n control,\n onChange,\n orientation,\n color,\n source,\n sink,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={orientation}>\n <Primitives.Pump\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const PumpPreview = (props: PumpProps): ReactElement => (\n <Primitives.Pump {...props} />\n);\n\nexport interface TankProps extends Primitives.TankProps {\n label?: LabelExtensionProps;\n}\n\nexport const Tank = Aether.wrap<SymbolProps<TankProps>>(\n \"Tank\",\n ({ label, onChange, orientation, color, dimensions, borderRadius }): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Tank\n onResize={(dims) => onChange({ dimensions: dims })}\n orientation={orientation}\n color={color}\n dimensions={dimensions}\n borderRadius={borderRadius}\n />\n </Labeled>\n );\n },\n);\n\nexport const TankPreview = (props: TankProps): ReactElement => (\n <Primitives.Tank {...props} dimensions={{ width: 25, height: 50 }} />\n);\n\nexport interface ReliefValveProps extends Primitives.ReliefValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const ReliefValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<ReliefValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.ReliefValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const ReliefValvePreview = (props: ReliefValveProps): ReactElement => (\n <Primitives.ReliefValve {...props} />\n);\n\nexport interface RegulatorProps extends Primitives.RegulatorProps {\n label?: LabelExtensionProps;\n}\n\nexport const Regulator = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<RegulatorProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Regulator orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const RegulatorPreview = (props: RegulatorProps): ReactElement => (\n <Primitives.Regulator {...props} />\n);\n\nexport interface BurstDiscProps extends Primitives.BurstDiscProps {\n label?: LabelExtensionProps;\n}\n\nexport const BurstDisc = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<BurstDiscProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.BurstDisc orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const BurstDiscPreview = (props: BurstDiscProps): ReactElement => (\n <Primitives.BurstDisc {...props} />\n);\n\nexport interface CapProps extends Primitives.CapProps {\n label?: LabelExtensionProps;\n}\n\nexport const Cap = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<CapProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Cap orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const CapPreview = (props: CapProps): ReactElement => (\n <Primitives.Cap {...props} />\n);\n\nexport interface ManualValveProps extends Primitives.ManualValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const ManualValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<ManualValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.ManualValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const ManualValvePreview = (props: ManualValveProps): ReactElement => (\n <Primitives.ManualValve {...props} />\n);\n\nexport interface FilterProps extends Primitives.FilterProps {\n label?: LabelExtensionProps;\n}\n\nexport const Filter = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<FilterProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Filter orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const FilterPreview = (props: FilterProps): ReactElement => (\n <Primitives.Filter {...props} />\n);\n\nexport interface NeedleValveProps extends Primitives.NeedleValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const NeedleValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<NeedleValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.NeedleValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const NeedleValvePreview = (props: NeedleValveProps): ReactElement => (\n <Primitives.NeedleValve {...props} />\n);\n\nexport interface CheckValveProps extends Primitives.CheckValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const CheckValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<CheckValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.CheckValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const CheckValvePreview = (props: CheckValveProps): ReactElement => (\n <Primitives.CheckValve {...props} />\n);\n\nexport interface OrificeProps extends Primitives.OrificeProps {\n label?: LabelExtensionProps;\n}\n\nexport const Orifice = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<OrificeProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.Orifice orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const OrificePreview = (props: OrificeProps): ReactElement => (\n <Primitives.Orifice {...props} />\n);\n\nexport interface AngledReliefValveProps extends Primitives.AngledReliefValveProps {\n label?: LabelExtensionProps;\n}\n\nexport const AngledReliefValve = ({\n label,\n onChange,\n orientation,\n color,\n}: SymbolProps<AngledReliefValveProps>): ReactElement => {\n return (\n <Labeled {...label} onChange={onChange}>\n <Primitives.AngledReliefValve orientation={orientation} color={color} />\n </Labeled>\n );\n};\n\nexport const AngledReliefValvePreview = (\n props: Primitives.AngledReliefValveProps,\n): ReactElement => <Primitives.AngledReliefValve {...props} />;\n\nexport interface ValueProps\n extends Omit<CoreValue.UseProps, \"box\" | \"aetherKey\">,\n Primitives.ValueProps {\n position?: xy.XY;\n label?: LabelExtensionProps;\n color?: Color.Crude;\n textColor?: Color.Crude;\n tooltip?: string[];\n}\n\ninterface ValueDimensionsState {\n outerBox: box.Box;\n labelBox: box.Box;\n}\n\nexport const Value = Aether.wrap<SymbolProps<ValueProps>>(\n \"Value\",\n ({\n aetherKey,\n label,\n level = \"p\",\n position,\n className,\n textColor,\n color,\n telem,\n units,\n onChange,\n tooltip,\n }): ReactElement => {\n const font = Theming.useTypography(level);\n const [dimensions, setDimensions] = useState<ValueDimensionsState>({\n outerBox: box.ZERO,\n labelBox: box.ZERO,\n });\n\n const valueBoxHeight = (font.lineHeight + 0.5) * font.baseSize + 2;\n const resizeRef = useResize(\n useCallback((b) => {\n // Find the element with the class pluto-symbol__label that is underneath\n // the 'react-flow__node' with the data-id of aetherKey\n const label = document.querySelector(\n `.react-flow__node[data-id=\"${aetherKey}\"] .pluto-symbol__label`,\n );\n let labelBox = { ...box.ZERO };\n if (label != null) {\n labelBox = box.construct(label);\n labelBox = box.resize(labelBox, {\n width: box.width(labelBox),\n height: box.height(labelBox),\n });\n }\n setDimensions({ outerBox: b, labelBox });\n }, []),\n {},\n );\n\n const { zoom } = useInitialViewport();\n\n const adjustedBox = adjustBox({\n labelOrientation: label?.orientation ?? \"top\",\n hasLabel: label?.label != null && label?.label.length > 0,\n valueBoxHeight,\n position,\n zoom,\n ...dimensions,\n });\n\n const { width: oWidth } = CoreValue.use({\n aetherKey,\n color: textColor,\n level,\n box: adjustedBox,\n telem,\n minWidth: 60,\n });\n\n return (\n <Tooltip.Dialog\n location={{ y: \"top\" }}\n hide={tooltip == null || tooltip.length === 0}\n >\n <Align.Space direction=\"y\">\n {tooltip?.map((t, i) => (\n <Text.Text key={i} level=\"small\">\n {t}\n </Text.Text>\n ))}\n </Align.Space>\n <Labeled\n className={CSS(className, CSS.B(\"value-labeled\"))}\n ref={resizeRef}\n onChange={onChange}\n {...label}\n >\n <Primitives.Value\n color={color}\n dimensions={{\n height: valueBoxHeight,\n width: oWidth,\n }}\n units={units}\n />\n </Labeled>\n </Tooltip.Dialog>\n );\n },\n);\n\ninterface AdjustBoxProps {\n labelOrientation: location.Outer;\n zoom: number;\n outerBox: box.Box;\n labelBox: box.Box;\n valueBoxHeight: number;\n position: xy.XY;\n hasLabel: boolean;\n}\n\nconst LABEL_SCALE = 0.9;\n\nconst adjustBox = ({\n labelOrientation,\n outerBox,\n labelBox,\n valueBoxHeight,\n position,\n hasLabel,\n zoom,\n}: AdjustBoxProps): box.Box => {\n const labelDims = xy.scale(box.dims(labelBox), 1 / (LABEL_SCALE * zoom));\n const dir = direction.construct(labelOrientation);\n if (dir === \"x\")\n position = xy.translate(\n position,\n \"y\",\n Math.max((labelDims.y - valueBoxHeight) / 2 - 1, 0),\n );\n if (hasLabel && labelOrientation === \"left\")\n position = xy.translate(position, \"x\", labelDims.x + 4);\n else if (hasLabel && labelOrientation === \"top\")\n position = xy.translate(position, \"y\", labelDims.y + 4);\n return box.construct(position.x, position.y, box.width(outerBox), valueBoxHeight);\n};\n\nexport const ValuePreview = ({ color }: ValueProps): ReactElement => {\n return (\n <Primitives.Value\n color={color}\n dimensions={{\n width: 60,\n height: 25,\n }}\n units={\"psi\"}\n >\n <Text.Text level=\"p\">50.00</Text.Text>\n </Primitives.Value>\n );\n};\n\nexport interface SwitchProps\n extends Primitives.SwitchProps,\n Omit<Toggle.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const Switch = Aether.wrap<SymbolProps<SwitchProps>>(\n \"Switch\",\n ({\n aetherKey,\n label,\n control,\n onChange,\n orientation,\n color,\n source,\n sink,\n }): ReactElement => {\n const { enabled, triggered, toggle } = Toggle.use({ aetherKey, source, sink });\n return (\n <Labeled {...label} onChange={onChange}>\n <ControlState {...control} orientation={orientation}>\n <Primitives.Switch\n enabled={enabled}\n triggered={triggered}\n onClick={toggle}\n orientation={orientation}\n color={color}\n />\n </ControlState>\n </Labeled>\n );\n },\n);\n\nexport const SwitchPreview = (props: SwitchProps): ReactElement => (\n <Primitives.Switch {...props} />\n);\n\nexport interface ButtonProps\n extends Omit<Primitives.ButtonProps, \"label\" | \"onClick\">,\n Omit<CoreButton.UseProps, \"aetherKey\"> {\n label?: LabelExtensionProps;\n control?: ControlStateProps;\n}\n\nexport const Button = Aether.wrap<SymbolProps<ButtonProps>>(\n \"Button\",\n ({ aetherKey, label, orientation, sink, control }) => {\n const { click } = CoreButton.use({ aetherKey, sink });\n return (\n <ControlState {...control} className={CSS.B(\"symbol\")} orientation={orientation}>\n <Primitives.Button label={label?.label} onClick={click} />\n </ControlState>\n );\n },\n);\n\nexport const ButtonPreview = ({ label: _, ...props }: ButtonProps): ReactElement => (\n <Primitives.Button label=\"Button\" {...props} />\n);\n","import { t as l, g as a } from \"./path-cq-nd1RA.js\";\nconst o = (e) => l(e, (t, r, n) => {\n const c = r === n.length - 1, u = !isNaN(parseInt(t)), i = !isNaN(parseInt(n[r + 1]));\n return u && (t = \"element\"), c || i ? t : [t, \"shape\"];\n}), s = (e, t) => {\n if (e == null)\n return null;\n const r = e[t];\n return r == null && typeof e == \"object\" && \"sourceType\" in e ? e.sourceType()[t] : r;\n}, p = (e, t, r) => a(\n s(e, \"shape\"),\n o(t),\n r,\n { getter: s }\n), m = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n getFieldSchema: p,\n getFieldSchemaPath: o\n}, Symbol.toStringTag, { value: \"Module\" }));\nexport {\n m as zodutil\n};\n//# sourceMappingURL=zodutil.js.map\n","// Copyright 2024 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\n/* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */\nimport {\n type ReactElement,\n type PropsWithChildren,\n createContext,\n useContext as reactUseContext,\n useState,\n useLayoutEffect,\n useRef,\n useMemo,\n useCallback,\n useEffect,\n FC,\n} from \"react\";\n\nimport { shallowCopy, type Destructor, toArray, Key, Keyed } from \"@synnaxlabs/x\";\nimport { caseconv } from \"@synnaxlabs/x/caseconv\";\nimport { deep } from \"@synnaxlabs/x/deep\";\nimport { z } from \"zod\";\n\nimport { useSyncedRef } from \"@/hooks/ref\";\nimport { Input } from \"@/input\";\nimport { type status } from \"@/status/aether\";\nimport { componentRenderProp, type RenderProp } from \"@/util/renderProp\";\nimport { CSS } from \"@/css\";\nimport { zodutil } from \"@synnaxlabs/x/zodutil\";\nimport { Select } from \"@/select\";\n\n/** Props for the @see useField hook */\nexport interface UseFieldProps<I, O = I> {\n path: string;\n optional?: false;\n onChange?: (value: O, extra: ContextValue & { path: string }) => void;\n defaultValue?: O;\n}\n\nexport interface UseNullableFieldProps<I, O = I>\n extends Omit<UseFieldProps<I, O>, \"optional\"> {\n optional: true;\n}\n\n/** Return type for the @see useField hook */\nexport interface UseFieldReturn<I extends Input.Value, O extends Input.Value = I>\n extends FieldState<I> {\n onChange: (value: O) => void;\n status: status.CrudeSpec;\n}\n\ninterface UseField {\n <I extends Input.Value, O extends Input.Value = I>(\n props: UseFieldProps<I, O>,\n ): UseFieldReturn<I, O>;\n <I extends Input.Value, O extends Input.Value = I>(\n props: UseNullableFieldProps<I, O>,\n ): UseFieldReturn<I, O> | null;\n}\n\n/**\n * Hook for managing a particular field in a form.\n *\n * @param props - The props for the hook\n * @param props.path - The path to the field in the form.\n */\nexport const useField = (<I extends Input.Value, O extends Input.Value = I>({\n path,\n optional: propsOptional,\n onChange,\n defaultValue,\n}: UseFieldProps<I, O>): UseFieldReturn<I, O> | null => {\n const ctx = useContext();\n const { get, bind, set } = ctx;\n const optional = defaultValue != null || (propsOptional ?? false);\n\n const [state, setState] = useState<FieldState<I> | null>(get<I>({ path, optional }));\n\n useLayoutEffect(() => {\n setState(get<I>({ path, optional }));\n return bind({ path, onChange: setState, listenToChildren: false });\n }, [path, bind, setState]);\n\n const handleChange = useCallback(\n (value: O) => {\n onChange?.(value, { ...ctx, path });\n set({ path, value });\n },\n [path, set, onChange],\n );\n\n if (state == null) {\n if (defaultValue != null) set({ path, value: defaultValue });\n if (!optional) throw new Error(`Field state is null: ${path}`);\n return null;\n }\n\n return { onChange: handleChange, ...state };\n}) as UseField;\n\nexport type UseFieldValue = (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional?: false,\n ctx?: ContextValue,\n) => O) &\n (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional: true,\n ctx?: ContextValue,\n ) => O | null);\n\nexport type UseFieldState = (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional?: false,\n ctx?: ContextValue,\n) => FieldState<O>) &\n (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional: true,\n ctx?: ContextValue,\n ) => FieldState<O> | null);\n\nexport const useFieldState = <I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional: boolean = false,\n ctx?: ContextValue,\n): FieldState<O> | null => {\n const { get, bind } = useContext(ctx);\n const [, setChangeTrigger] = useState(0);\n useLayoutEffect(() => {\n setChangeTrigger((prev) => prev + 1);\n return bind<O>({ path, onChange: () => setChangeTrigger((p) => p + 1) });\n }, [path, bind]);\n return get<O>({ path, optional }) ?? null;\n};\n\nexport const useFieldValue = (<I extends Input.Value, O extends Input.Value = I>(\n path: string,\n optional: boolean = false,\n ctx?: ContextValue,\n): O | null => {\n const { get, bind } = useContext(ctx);\n const [, setChangeTrigger] = useState(0);\n useLayoutEffect(() => {\n setChangeTrigger((prev) => prev + 1);\n return bind<O>({ path, onChange: () => setChangeTrigger((p) => p + 1) });\n }, [path, bind]);\n return get<O>({ path, optional })?.value ?? null;\n}) as UseFieldValue;\n\nexport const useFieldValid = (path: string): boolean =>\n useFieldState(path, true)?.status?.variant === \"success\";\n\nexport interface UseFieldListenerProps<\n I extends Input.Value,\n Z extends z.ZodTypeAny = z.ZodTypeAny,\n> {\n ctx?: ContextValue<Z>;\n path: string;\n onChange: (state: FieldState<I>, extra: ContextValue) => void;\n}\n\nexport const useFieldListener = <\n I extends Input.Value,\n Z extends z.ZodTypeAny = z.ZodTypeAny,\n>({\n path,\n ctx: override,\n onChange,\n}: UseFieldListenerProps<I, Z>): void => {\n const ctx = useContext(override);\n useLayoutEffect(\n () =>\n ctx.bind<I>({\n path,\n onChange: (fs) => onChange(fs, ctx),\n listenToChildren: false,\n }),\n [path, ctx],\n );\n};\n\nexport interface UseChildFieldValuesProps {\n path: string;\n optional?: false;\n}\n\nexport interface UseNullableChildFieldValuesProps {\n path: string;\n optional: true;\n}\n\nexport interface UseChildFieldValues {\n <V extends unknown = unknown>(props: UseChildFieldValuesProps): V;\n <V extends unknown = unknown>(props: UseNullableChildFieldValuesProps): V | null;\n}\n\nexport const useChildFieldValues = (<V extends unknown = unknown>({\n path,\n optional = false,\n}: UseChildFieldValuesProps): V | null => {\n const { bind, get } = useContext();\n const [state, setState] = useState<FieldState<V> | null>(get<V>({ path, optional }));\n useLayoutEffect(() => {\n setState(get<V>({ path, optional }));\n return bind<V>({\n path,\n onChange: (fs) => setState({ ...fs, value: shallowCopy(fs.value) }),\n listenToChildren: true,\n });\n }, [path, bind, get]);\n if (state == null && !optional) throw new Error(\"Field state is null\");\n return state?.value ?? null;\n}) as UseChildFieldValues;\n\nexport interface UseFieldArrayProps {\n path: string;\n updateOnChildren?: boolean;\n}\n\nexport interface UseFieldArrayReturn<V extends unknown> {\n value: V[];\n push: (value: V | V[]) => void;\n remove: (index: number | number[]) => void;\n keepOnly: (indices: number | number[]) => void;\n}\n\nexport const useFieldArray = <V extends unknown = unknown>({\n path,\n updateOnChildren = false,\n}: UseFieldArrayProps): UseFieldArrayReturn<V> => {\n const { bind, get, set } = useContext();\n const [state, setState] = useState<V[]>(get<V[]>({ path, optional: false }).value);\n\n useLayoutEffect(() => {\n setState(get<V[]>({ path, optional: false }).value);\n return bind<V[]>({\n path,\n onChange: (fs) => setState(shallowCopy<V[]>(fs.value)),\n listenToChildren: updateOnChildren,\n });\n }, [path, bind, get, setState]);\n\n const push = useCallback(\n (value: V | V[]) => {\n const copy = shallowCopy(get<V[]>({ path }).value);\n copy.push(...toArray(value));\n set({ path, value: copy });\n },\n [path, get, set],\n );\n\n const remove = useCallback(\n (index: number | number[]) => {\n const val = get<V[]>({ path, optional: false }).value;\n const indices = new Set(toArray(index));\n set({path, value: val.filter((_, i) => !indices.has(i)) });\n },\n [path, state, get],\n );\n\n const keepOnly = useCallback(\n (index: number | number[]) => {\n const val = get<V[]>({ path, optional: false }).value;\n const indices = new Set(toArray(index));\n set({ path, value: val.filter((_, i) => indices.has(i)) });\n },\n [path, state, get],\n );\n\n return { value: state, push, remove, keepOnly };\n};\n\nexport interface FieldProps<\n I extends Input.Value = string | number,\n O extends Input.Value = I,\n> extends UseFieldProps<I, O>,\n Omit<Input.ItemProps, \"children\" | \"onChange\" | \"defaultValue\"> {\n children?: RenderProp<Input.Control<I, O>>;\n padHelpText?: boolean;\n visible?: boolean | ((state: FieldState<I>, ctx: ContextValue) => boolean);\n hideIfNull?: boolean;\n}\n\nconst defaultInput = componentRenderProp(Input.Text);\n\nexport type FieldT<I extends Input.Value, O extends Input.Value = I> = (\n props: FieldProps<I, O>,\n) => ReactElement | null;\n\nexport const Field = <\n I extends Input.Value = string | number,\n O extends Input.Value = I,\n>({\n path,\n children = defaultInput as unknown as RenderProp<Input.Control<I, O>>,\n label,\n padHelpText = true,\n visible = true,\n hideIfNull = false,\n optional,\n defaultValue,\n onChange,\n className,\n ...props\n}: FieldProps<I, O>): ReactElement | null => {\n const field = useField<I, O>({\n path,\n optional: (optional as true) ?? (hideIfNull as true),\n onChange,\n defaultValue,\n });\n const ctx = useContext();\n if (field == null) return null;\n if (path == null) throw new Error(\"No path provided to Form Field\");\n if (label == null) label = caseconv.capitalize(deep.element(path, -1));\n visible = typeof visible === \"function\" ? visible(field, ctx) : visible;\n if (!visible) return null;\n const helpText = field.touched ? field.status.message : \"\";\n const { onChange: fieldOnChange, value } = field;\n return (\n <Input.Item\n padHelpText={padHelpText}\n helpText={helpText}\n helpTextVariant={field.status.variant}\n label={label}\n required={field.required}\n className={CSS(className, CSS.BE(\"field\", path.split(\".\").join(\"-\")))}\n {...props}\n >\n {children({ onChange: fieldOnChange, value })}\n </Input.Item>\n );\n};\n\nexport interface FieldBuilderProps<\n I extends Input.Value,\n O extends Input.Value,\n P extends {},\n> {\n fieldKey?: string;\n fieldProps?: Partial<FieldProps<I, O>>;\n inputProps?: Partial<P>;\n}\n\nexport interface BuiltFieldProps<\n I extends Input.Value,\n O extends Input.Value,\n P extends {},\n> extends FieldProps<I, O> {\n inputProps?: Partial<P>;\n fieldKey?: string;\n}\n\nexport const fieldBuilder =\n <I extends Input.Value, O extends Input.Value, P extends {}>(\n Component: FC<P & Input.Control<I, O>>,\n ) =>\n ({\n fieldKey: baseFieldKey,\n fieldProps,\n inputProps: baseInputProps,\n }: FieldBuilderProps<I, O, P>): FC<BuiltFieldProps<I, O, P>> =>\n ({\n inputProps,\n path,\n fieldKey = baseFieldKey,\n ...props\n }: BuiltFieldProps<I, O, P>) => (\n <Field<I, O>\n {...fieldProps}\n {...props}\n path={fieldKey ? `${path}.${fieldKey}` : path}\n >\n {(cp) => <Component {...cp} {...baseInputProps} {...(inputProps as P)} />}\n </Field>\n );\n\nexport const buildNumericField = fieldBuilder(Input.Numeric);\nexport const NumericField = buildNumericField({});\nexport const buildTextField = fieldBuilder(Input.Text);\nexport const TextField = buildTextField({});\nexport const buildSwitchField = fieldBuilder(Input.Switch);\nexport const SwitchField = buildSwitchField({});\nexport const buildSelectSingleField = fieldBuilder(Select.Single) as <\n K extends Key,\n E extends Keyed<K>,\n>({\n fieldProps,\n inputProps,\n}: FieldBuilderProps<K, K, Select.SingleProps<K, E>>) => FC<\n BuiltFieldProps<K, K, Select.SingleProps<K, E>>\n>;\n\nexport const buildSelectMultiField = fieldBuilder(Select.Multiple) as <\n K extends Key,\n E extends Keyed<K>,\n>({\n fieldProps,\n inputProps,\n}: FieldBuilderProps<K, K, Select.MultipleProps<K, E>>) => FC<\n BuiltFieldProps<K, K, Select.MultipleProps<K, E>>\n>;\n\nexport const buildButtonSelectField = fieldBuilder(Select.DropdownButton) as <\n K extends Key,\n E extends Keyed<K>,\n>({\n fieldProps,\n inputProps,\n}: FieldBuilderProps<K, K, Select.DropdownButtonProps<K, E>>) => FC<\n BuiltFieldProps<K, K, Select.DropdownButtonProps<K, E>>\n>;\n\nexport type Listener<V = unknown> = (state: FieldState<V>) => void;\n\nexport interface FieldState<V = unknown> {\n value: V;\n status: status.CrudeSpec;\n touched: boolean;\n required: boolean;\n}\n\ninterface RequiredGetProps {\n path: string;\n optional?: boolean;\n}\n\ninterface OptionalGetProps {\n path: string;\n optional: true;\n}\n\ntype GetProps = RequiredGetProps | OptionalGetProps;\n\ninterface GetFunc {\n <V extends Input.Value>(props: RequiredGetProps): FieldState<V>;\n <V extends Input.Value>(props: OptionalGetProps): FieldState<V> | null;\n}\n\ninterface SetProps {\n path: string;\n value: unknown;\n}\n\ntype SetFunc = (props: SetProps) => void;\n\ninterface BindProps<V = unknown> {\n path: string;\n onChange: Listener<V>;\n listenToChildren?: boolean;\n}\n\ntype BindFunc = <V = unknown>(props: BindProps<V>) => Destructor;\n\nexport interface ContextValue<Z extends z.ZodTypeAny = z.ZodTypeAny> {\n bind: BindFunc;\n set: SetFunc;\n get: GetFunc;\n value: () => z.output<Z>;\n validate: (path?: string) => boolean;\n validateAsync: (path?: string) => Promise<boolean>;\n has: (path: string) => boolean;\n}\n\nexport const Context = createContext<ContextValue>({\n bind: () => () => {},\n set: () => {},\n get: <V extends any = unknown>(): FieldState<V> => ({\n value: undefined as unknown as V,\n status: { key: \"\", variant: \"success\", message: \"\" },\n touched: false,\n required: false,\n }),\n validate: () => false,\n validateAsync: () => Promise.resolve(false),\n value: () => ({}),\n has: () => false,\n});\n\nexport const useContext = <Z extends z.ZodTypeAny = z.ZodTypeAny>(\n override?: ContextValue<Z>,\n): ContextValue<Z> => {\n const internal = reactUseContext(Context);\n return override ?? (internal as unknown as ContextValue<Z>);\n};\n\nconst NO_ERROR_STATUS = (path: string): status.CrudeSpec => ({\n key: path,\n variant: \"success\",\n message: \"\",\n});\n\ninterface UseRef<Z extends z.ZodTypeAny> {\n state: z.output<Z>;\n status: Map<string, status.CrudeSpec>;\n touched: Set<string>;\n listeners: Map<string, Set<Listener>>;\n parentListeners: Map<string, Set<Listener>>;\n}\n\nexport interface UseProps<Z extends z.ZodTypeAny> {\n values: z.output<Z>;\n sync?: boolean;\n onChange?: (values: z.output<Z>) => void;\n schema?: Z;\n}\n\nexport type UseReturn<Z extends z.ZodTypeAny> = ContextValue<Z>;\n\nconst isWarning = (issue: z.ZodIssue): boolean => getVariant(issue) === \"warning\";\n\nconst getVariant = (issue: z.ZodIssue): status.Variant =>\n issue.code === z.ZodIssueCode.custom &&\n issue.params != null &&\n \"variant\" in issue.params\n ? issue.params.variant\n : \"error\";\n\nexport const use = <Z extends z.ZodTypeAny>({\n values,\n sync = false,\n schema,\n onChange,\n}: UseProps<Z>): UseReturn<Z> => {\n const ref = useRef<UseRef<Z>>({\n state: values,\n status: new Map(),\n touched: new Set(),\n listeners: new Map(),\n parentListeners: new Map(),\n });\n const schemaRef = useSyncedRef(schema);\n const onChangeRef = useSyncedRef(onChange);\n\n const bind: BindFunc = useCallback(\n <V extends any = unknown>({\n path,\n onChange: callback,\n listenToChildren = false,\n }: BindProps<V>): Destructor => {\n const { parentListeners, listeners } = ref.current;\n const lis = listenToChildren ? parentListeners : listeners;\n if (!lis.has(path)) lis.set(path, new Set());\n lis.get(path)?.add(callback as Listener);\n return () => lis.get(path)?.delete(callback as Listener);\n },\n [],\n );\n\n const get: GetFunc = useCallback(\n <V extends any = unknown>({ path, optional }: GetProps): FieldState<V> | null => {\n const { state, status, touched } = ref.current;\n const value = deep.get(state, path, optional);\n if (value == null) return null;\n const fs = {\n value: value as V,\n status: status.get(path) ?? NO_ERROR_STATUS(path),\n touched: touched.has(path),\n required: false,\n };\n if (schemaRef.current == null) return fs;\n const schema = schemaRef.current;\n const zField = zodutil.getFieldSchema(schema, path, true);\n if (zField == null) return fs;\n fs.required = !zField.isOptional();\n return fs;\n },\n [],\n ) as GetFunc;\n\n const processValidationResult = useCallback(\n (\n result: z.SafeParseReturnType<z.input<Z>, z.output<Z>>,\n path: string = \"\",\n ): boolean => {\n const { status, listeners, touched } = ref.current;\n if (result.success) {\n const keys = Array.from(status.keys());\n status.clear();\n keys.forEach((p) => {\n const fs = get({ path: p });\n if (fs == null) return;\n listeners.get(p)?.forEach((l) => l(fs));\n });\n return true;\n }\n let success = true;\n const issueKeys = new Set(result.error.issues.map((i) => i.path.join(\".\")));\n result.error.issues.forEach((issue) => {\n console.log(\"issue\", issue);\n const issuePath = issue.path.join(\".\");\n if (!deep.pathsMatch(issuePath, path)) return;\n const variant = getVariant(issue);\n if (variant !== \"warning\") success = false;\n status.set(issuePath, {\n key: issuePath,\n variant: getVariant(issue),\n message: issue.message,\n });\n touched.add(issuePath);\n let fs = get({ path: issuePath, optional: true });\n // If we can't find the field value, this means the user never set it, so instead\n // we just to a best effort construction of the field state. This means that if\n // the user has a field rendered for this path, the error will be displayed.\n if (fs == null)\n fs = {\n value: undefined,\n status: status.get(issuePath) ?? NO_ERROR_STATUS(issuePath),\n touched: false,\n required: false,\n };\n listeners.get(issuePath)?.forEach((l) => l(fs));\n });\n status.forEach((_, subPath) => {\n if (!issueKeys.has(subPath)) {\n status.delete(subPath);\n const fs = get({ path: subPath });\n listeners.get(subPath)?.forEach((l) => l(fs));\n }\n });\n return success;\n },\n [],\n );\n\n const validate = useCallback(\n (path?: string): boolean => {\n if (schemaRef.current == null) return true;\n const { state } = ref.current;\n const result = schemaRef.current.safeParse(state);\n return processValidationResult(result, path);\n },\n [processValidationResult],\n );\n\n const validateAsync = useCallback(\n async (path?: string): Promise<boolean> => {\n if (schemaRef.current == null) return true;\n const { state } = ref.current;\n const result = await schemaRef.current.safeParseAsync(state);\n return processValidationResult(result, path);\n },\n [processValidationResult],\n );\n\n const set: SetFunc = useCallback(({ path, value }): void => {\n const { state, touched, listeners, parentListeners } = ref.current;\n touched.add(path);\n if (path.length === 0) ref.current.state = value as z.output<Z>;\n else deep.set(state, path, value);\n try {\n validate();\n } catch {\n validateAsync();\n }\n listeners.get(path)?.forEach((l) => l(get({ path })));\n parentListeners.forEach((lis, lisPath) => {\n if (deep.pathsMatch(path, lisPath)) {\n const v = get({ path: lisPath });\n lis.forEach((l) => l(v));\n }\n });\n onChangeRef.current?.(ref.current.state);\n }, []);\n\n const has = useCallback((path: string): boolean => {\n const { state } = ref.current;\n return deep.has(state, path);\n }, []);\n\n useEffect(() => {\n if (!sync) return;\n const { listeners } = ref.current;\n ref.current.state = values;\n listeners.forEach((lis, p) => {\n const v = get({ path: p });\n if (v == null) return;\n lis.forEach((l) => l(v));\n });\n }, [sync, values]);\n\n return useMemo(\n (): ContextValue<Z> => ({\n bind,\n set,\n get,\n validate,\n validateAsync,\n value: () => ref.current.state,\n has,\n }),\n [bind, set, get, validate],\n );\n};\n\nexport const Form = (props: PropsWithChildren<ContextValue>): ReactElement => {\n return <Context.Provider value={props}>{props.children}</Context.Provider>;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { type location } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Button as CoreButton } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { type Input } from \"@/input\";\n\nimport \"@/vis/schematic/OrientationControl.css\";\n\nexport interface OrientationValue {\n inner: location.Outer;\n outer: location.Outer;\n}\n\nexport interface SelectOrientationProps extends Input.Control<OrientationValue> {}\n\nexport const SelectOrientation = ({\n value,\n onChange,\n}: SelectOrientationProps): ReactElement => {\n const { inner, outer } = value;\n const handleChange = (next: Partial<OrientationValue>) => () =>\n onChange({ ...value, ...next });\n\n return (\n <Align.Space\n className={CSS.B(\"orientation-control\")}\n align=\"center\"\n justify=\"center\"\n size={0.5}\n >\n <Button selected={outer === \"top\"} onClick={handleChange({ outer: \"top\" })} />\n <Align.Space direction=\"x\" align=\"center\" justify=\"center\" size={0.5}>\n <Button selected={outer === \"left\"} onClick={handleChange({ outer: \"left\" })} />\n <Align.Space\n className={CSS.B(\"value\")}\n direction=\"y\"\n align=\"center\"\n justify=\"center\"\n empty\n >\n <Button\n className={CSS(CSS.dir(\"y\"))}\n selected={inner === \"top\"}\n onClick={handleChange({ inner: \"top\" })}\n />\n <Align.Space direction=\"x\" align=\"center\" justify=\"center\">\n <Button\n selected={inner === \"left\"}\n onClick={handleChange({ inner: \"left\" })}\n />\n <Button\n selected={inner === \"right\"}\n onClick={handleChange({ inner: \"right\" })}\n />\n </Align.Space>\n <Button\n className={CSS(CSS.dir(\"y\"))}\n selected={inner === \"bottom\"}\n onClick={handleChange({ inner: \"bottom\" })}\n />\n </Align.Space>\n <Button\n selected={outer === \"right\"}\n onClick={handleChange({ outer: \"right\" })}\n />\n </Align.Space>\n <Button\n selected={outer === \"bottom\"}\n onClick={handleChange({ outer: \"bottom\" })}\n />\n </Align.Space>\n );\n};\n\nexport interface ButtonProps extends Omit<CoreButton.IconProps, \"children\"> {\n selected: boolean;\n}\n\nexport const Button = ({\n selected,\n className,\n ...props\n}: ButtonProps): ReactElement => (\n <CoreButton.Icon\n variant=\"text\"\n className={CSS(className, CSS.selected(selected))}\n {...props}\n >\n <div className=\"symbol\"></div>\n </CoreButton.Icon>\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { useCallback, type ReactElement, type FC, useEffect } from \"react\";\n\nimport { type channel } from \"@synnaxlabs/client\";\nimport { type location, type xy, type bounds } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Channel } from \"@/channel\";\nimport { Color } from \"@/color\";\nimport { CSS } from \"@/css\";\nimport { Form } from \"@/form\";\nimport { Input } from \"@/input\";\nimport { Tabs } from \"@/tabs\";\nimport { type TabRenderProp } from \"@/tabs/Tabs\";\nimport { telem } from \"@/telem/aether\";\nimport { control } from \"@/telem/control/aether\";\nimport { Text } from \"@/text\";\nimport { type Button as CoreButton } from \"@/vis/button\";\nimport { type LabelExtensionProps } from \"@/vis/schematic/Labeled\";\nimport { SelectOrientation } from \"@/vis/schematic/SelectOrientation\";\nimport { type ControlStateProps } from \"@/vis/schematic/Symbols\";\nimport { type Toggle } from \"@/vis/toggle\";\n\nimport \"@/vis/schematic/Forms.css\";\n\nexport interface SymbolFormProps {}\n\nconst COMMON_TOGGLE_FORM_TABS: Tabs.Tab[] = [\n {\n tabKey: \"style\",\n name: \"Style\",\n },\n {\n tabKey: \"control\",\n name: \"Control\",\n },\n];\n\ninterface FormWrapperProps extends Align.SpaceProps {}\n\nconst FormWrapper: FC<FormWrapperProps> = ({\n className,\n direction,\n ...props\n}): ReactElement => (\n <Align.Space\n direction={direction}\n align=\"stretch\"\n className={CSS(CSS.B(\"symbol-form\"), className)}\n size={direction === \"x\" ? \"large\" : \"medium\"}\n {...props}\n />\n);\n\ninterface SymbolOrientation {\n label?: LabelExtensionProps;\n orientation?: location.Outer;\n}\n\nconst OrientationControl: Form.FieldT<SymbolOrientation> = (props): ReactElement => (\n <Form.Field<SymbolOrientation> label=\"Orientation\" padHelpText={false} {...props}>\n {({ value, onChange }) => (\n <SelectOrientation\n value={{\n inner: value.orientation ?? \"top\",\n outer: value.label?.orientation ?? \"top\",\n }}\n onChange={(v) =>\n onChange({\n ...value,\n orientation: v.inner,\n label: {\n ...value.label,\n orientation: v.outer,\n },\n })\n }\n />\n )}\n </Form.Field>\n);\n\nconst LabelControls: Form.FieldT<LabelExtensionProps> = ({ path }): ReactElement => (\n <Align.Space direction=\"x\" align=\"stretch\">\n <Form.Field<string> path={path + \".label\"} label=\"Label\" padHelpText={false} grow>\n {(p) => <Input.Text selectOnFocus {...p} />}\n </Form.Field>\n <Form.Field<Text.Level>\n path={path + \".level\"}\n label=\"Label Size\"\n padHelpText={false}\n >\n {(p) => <Text.SelectLevel {...p} />}\n </Form.Field>\n </Align.Space>\n);\n\nconst ColorControl: Form.FieldT<Color.Crude> = (props): ReactElement => (\n <Form.Field hideIfNull label=\"Color\" align=\"start\" padHelpText={false} {...props}>\n {({ value, onChange, ...props }) => (\n <Color.Swatch\n value={value ?? Color.ZERO.setAlpha(1).rgba255}\n onChange={(v) => onChange(v.rgba255)}\n {...props}\n />\n )}\n </Form.Field>\n);\n\nexport const ToggleControlForm = ({ path }: { path: string }): ReactElement => {\n const { value, onChange } = Form.useField<\n Omit<Toggle.UseProps, \"aetherKey\"> & { control: ControlStateProps }\n >({ path });\n const sourceP = telem.sourcePipelinePropsZ.parse(value.source?.props);\n const sinkP = telem.sinkPipelinePropsZ.parse(value.sink?.props);\n const source = telem.streamChannelValuePropsZ.parse(\n sourceP.segments.valueStream.props,\n );\n const sink = control.setChannelValuePropsZ.parse(sinkP.segments.setter.props);\n\n const handleSourceChange = (v: channel.Key | null): void => {\n v = v ?? 0;\n const t = telem.sourcePipeline(\"boolean\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"threshold\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: v }),\n threshold: telem.withinBounds({ trueBound: { lower: 0.9, upper: 1.1 } }),\n },\n outlet: \"threshold\",\n });\n onChange({ ...value, source: t });\n };\n\n const handleSinkChange = (v: channel.Key | null): void => {\n v = v ?? 0;\n const t = telem.sinkPipeline(\"boolean\", {\n connections: [\n {\n from: \"setpoint\",\n to: \"setter\",\n },\n ],\n segments: {\n setter: control.setChannelValue({ channel: v }),\n setpoint: telem.setpoint({\n truthy: 1,\n falsy: 0,\n }),\n },\n inlet: \"setpoint\",\n });\n\n const authSource = control.authoritySource({ channel: v });\n\n const controlChipSink = control.acquireChannelControl({\n channel: v,\n authority: 255,\n });\n\n onChange({\n ...value,\n sink: t,\n control: {\n ...value.control,\n showChip: true,\n chip: {\n sink: controlChipSink,\n source: authSource,\n },\n showIndicator: true,\n indicator: {\n statusSource: authSource,\n },\n },\n });\n };\n\n return (\n <FormWrapper direction=\"x\" grow align=\"stretch\">\n <Input.Item label=\"Input Channel\" grow>\n <Channel.SelectSingle\n value={source.channel as number}\n onChange={handleSourceChange}\n />\n </Input.Item>\n <Input.Item label=\"Output Channel\" grow>\n <Channel.SelectSingle value={sink.channel} onChange={handleSinkChange} />\n </Input.Item>\n </FormWrapper>\n );\n};\n\nexport const CommonToggleForm = (): ReactElement => {\n const content: TabRenderProp = useCallback(({ tabKey }) => {\n switch (tabKey) {\n case \"control\":\n return <ToggleControlForm path=\"\" />;\n default: {\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <ColorControl path=\"color\" />\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n }\n }\n }, []);\n\n const props = Tabs.useStatic({ tabs: COMMON_TOGGLE_FORM_TABS, content });\n return <Tabs.Tabs {...props} />;\n};\n\nexport const SolenoidValveForm = (): ReactElement => {\n const content: TabRenderProp = useCallback(({ tabKey }) => {\n switch (tabKey) {\n case \"control\":\n return <ToggleControlForm path=\"\" />;\n default: {\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <Align.Space direction=\"x\">\n <ColorControl path=\"color\" />\n <Form.Field<boolean>\n path=\"normallyOpen\"\n label=\"Normally Open\"\n padHelpText={false}\n >\n {(p) => <Input.Switch {...p} />}\n </Form.Field>\n </Align.Space>\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n }\n }\n }, []);\n\n const props = Tabs.useStatic({ tabs: COMMON_TOGGLE_FORM_TABS, content });\n return <Tabs.Tabs {...props} />;\n};\n\nexport const CommonNonToggleForm = (): ReactElement => {\n return (\n <FormWrapper direction=\"x\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <ColorControl path=\"color\" />\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n};\n\nconst DIMENSIONS_DRAG_SCALE: xy.Crude = { y: 2, x: 0.25 };\nconst DIMENSIONS_BOUNDS: bounds.Bounds = { lower: 0, upper: 2000 };\n\nexport const TankForm = (): ReactElement => {\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <Align.Space direction=\"x\">\n <ColorControl path=\"color\" />\n <Form.Field<number> path=\"dimensions.width\" label=\"Width\" grow>\n {({ value, ...props }) => (\n <Input.Numeric\n value={value ?? 200}\n dragScale={DIMENSIONS_DRAG_SCALE}\n bounds={DIMENSIONS_BOUNDS}\n {...props}\n />\n )}\n </Form.Field>\n <Form.Field<number> path=\"dimensions.height\" label=\"Height\" grow>\n {({ value, ...props }) => (\n <Input.Numeric\n value={value ?? 200}\n dragScale={DIMENSIONS_DRAG_SCALE}\n bounds={DIMENSIONS_BOUNDS}\n {...props}\n />\n )}\n </Form.Field>\n </Align.Space>\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n};\n\nconst VALUE_FORM_TABS: Tabs.Tab[] = [\n {\n tabKey: \"style\",\n name: \"Style\",\n },\n {\n tabKey: \"telemetry\",\n name: \"Telemetry\",\n },\n];\ninterface ValueTelemFormT {\n telem: telem.StringSourceSpec;\n tooltip: string[];\n}\nconst ValueTelemForm = ({ path }: { path: string }): ReactElement => {\n const { value, onChange } = Form.useField<ValueTelemFormT>({ path });\n const sourceP = telem.sourcePipelinePropsZ.parse(value.telem?.props);\n const source = telem.streamChannelValuePropsZ.parse(\n sourceP.segments.valueStream.props,\n );\n const stringifier = telem.stringifyNumberProps.parse(\n sourceP.segments.stringifier.props,\n );\n const rollingAverage = telem.rollingAverageProps.parse(\n sourceP.segments.rollingAverage.props,\n );\n const handleSourceChange = (v: channel.Key | null): void => {\n const t = telem.sourcePipeline(\"string\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"rollingAverage\",\n },\n {\n from: \"rollingAverage\",\n to: \"stringifier\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: v ?? 0 }),\n stringifier: telem.stringifyNumber({\n precision: stringifier.precision ?? 2,\n }),\n rollingAverage: telem.rollingAverage({\n windowSize: rollingAverage.windowSize ?? 1,\n }),\n },\n outlet: \"stringifier\",\n });\n onChange({ ...value, telem: t });\n };\n\n const handlePrecisionChange = (precision: number): void => {\n const t = telem.sourcePipeline(\"string\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"rollingAverage\",\n },\n {\n from: \"rollingAverage\",\n to: \"stringifier\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: source.channel }),\n stringifier: telem.stringifyNumber({ precision }),\n rollingAverage: telem.rollingAverage({ windowSize: rollingAverage.windowSize }),\n },\n outlet: \"stringifier\",\n });\n onChange({ ...value, telem: t });\n };\n\n const handleRollingAverageChange = (windowSize: number): void => {\n const t = telem.sourcePipeline(\"string\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"rollingAverage\",\n },\n {\n from: \"rollingAverage\",\n to: \"stringifier\",\n },\n ],\n segments: {\n stringifier: telem.stringifyNumber({ precision: stringifier.precision ?? 2 }),\n valueStream: telem.streamChannelValue({ channel: source.channel }),\n rollingAverage: telem.rollingAverage({ windowSize }),\n },\n outlet: \"stringifier\",\n });\n onChange({ ...value, telem: t });\n };\n\n const c = Channel.useName(source.channel as number);\n useEffect(() => {\n onChange({ ...value, tooltip: [c] });\n }, [c]);\n\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Input.Item label=\"Input Channel\" grow>\n <Channel.SelectSingle\n value={source.channel as number}\n onChange={handleSourceChange}\n />\n </Input.Item>\n <Input.Item label=\"Precision\" align=\"start\">\n <Input.Numeric\n value={stringifier.precision ?? 2}\n bounds={{ lower: 0, upper: 10 }}\n onChange={handlePrecisionChange}\n />\n </Input.Item>\n <Input.Item label=\"Averaging Window\" align=\"start\">\n <Input.Numeric\n value={rollingAverage.windowSize ?? 1}\n bounds={{ lower: 1, upper: 100 }}\n onChange={handleRollingAverageChange}\n />\n </Input.Item>\n </FormWrapper>\n );\n};\n\nexport const ValueForm = (): ReactElement => {\n const content: TabRenderProp = useCallback(({ tabKey }) => {\n switch (tabKey) {\n case \"telemetry\":\n return <ValueTelemForm path=\"\" />;\n default: {\n return (\n <FormWrapper direction=\"x\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n <Align.Space direction=\"x\">\n <ColorControl path=\"color\" />\n <Form.Field<string>\n path=\"units\"\n label=\"Units\"\n align=\"start\"\n padHelpText={false}\n >\n {(p) => <Input.Text {...p} />}\n </Form.Field>\n </Align.Space>\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n }\n }\n }, []);\n const props = Tabs.useStatic({ tabs: VALUE_FORM_TABS, content });\n return <Tabs.Tabs {...props} />;\n};\n\ntype ButtonTelemFormT = Omit<CoreButton.UseProps, \"aetherKey\"> & {\n control: ControlStateProps;\n};\n\nexport const ButtonTelemForm = ({ path }: { path: string }): ReactElement => {\n const { value, onChange } = Form.useField<ButtonTelemFormT>({ path });\n const sinkP = telem.sinkPipelinePropsZ.parse(value.sink?.props);\n const sink = control.setChannelValuePropsZ.parse(sinkP.segments.setter.props);\n\n const handleSinkChange = (v: channel.Key): void => {\n const t = telem.sinkPipeline(\"boolean\", {\n connections: [\n {\n from: \"setpoint\",\n to: \"setter\",\n },\n ],\n segments: {\n setter: control.setChannelValue({ channel: v }),\n setpoint: telem.setpoint({\n truthy: 1,\n falsy: 0,\n }),\n },\n inlet: \"setpoint\",\n });\n\n const authSource = control.authoritySource({ channel: v });\n\n const controlChipSink = control.acquireChannelControl({\n channel: v,\n authority: 255,\n });\n\n onChange({\n ...value,\n sink: t,\n control: {\n ...value.control,\n showChip: true,\n chip: {\n sink: controlChipSink,\n source: authSource,\n },\n showIndicator: true,\n indicator: {\n statusSource: authSource,\n },\n },\n });\n };\n\n return (\n <FormWrapper direction=\"y\">\n <Input.Item label=\"Output Channel\">\n <Channel.SelectSingle value={sink.channel} onChange={handleSinkChange} />\n </Input.Item>\n </FormWrapper>\n );\n};\n\nexport const ButtonForm = (): ReactElement => {\n const content: TabRenderProp = useCallback(({ tabKey }) => {\n switch (tabKey) {\n case \"control\":\n return <ButtonTelemForm path=\"\" />;\n default:\n return (\n <FormWrapper direction=\"x\" align=\"stretch\">\n <Align.Space direction=\"y\" grow>\n <LabelControls path=\"label\" />\n </Align.Space>\n <OrientationControl path=\"\" />\n </FormWrapper>\n );\n }\n }, []);\n\n const props = Tabs.useStatic({ tabs: COMMON_TOGGLE_FORM_TABS, content });\n\n return <Tabs.Tabs {...props} />;\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type FC } from \"react\";\n\nimport { z } from \"zod\";\n\nimport { telem } from \"@/telem/aether\";\nimport { control } from \"@/telem/control/aether\";\nimport { type Theming } from \"@/theming\";\nimport {\n CommonToggleForm,\n type SymbolFormProps,\n SolenoidValveForm,\n TankForm,\n CommonNonToggleForm,\n ValueForm,\n ButtonForm,\n} from \"@/vis/schematic/Forms\";\nimport {\n type ThreeWayValveProps,\n type SymbolProps,\n ThreeWayValve,\n ThreeWayValvePreview,\n type ValveProps,\n Valve,\n ValvePreview,\n type SolenoidValveProps,\n SolenoidValve,\n SolenoidValvePreview,\n FourWayValve,\n FourWayValvePreview,\n type AngledValveProps,\n type PumpProps,\n AngledValve,\n Pump,\n Tank,\n ReliefValve,\n ReliefValvePreview,\n TankPreview,\n type ReliefValveProps,\n type TankProps,\n type RegulatorProps,\n RegulatorPreview,\n Regulator,\n BurstDiscPreview,\n Cap,\n CapPreview,\n ManualValvePreview,\n type FilterProps,\n Filter,\n FilterPreview,\n type NeedleValveProps,\n NeedleValvePreview,\n type CheckValveProps,\n CheckValve,\n CheckValvePreview,\n BurstDisc,\n type ManualValveProps,\n ManualValve,\n NeedleValve,\n type OrificeProps,\n Orifice,\n OrificePreview,\n PumpPreview,\n AngledReliefValve,\n AngledValvePreview,\n AngledReliefValvePreview,\n type ValueProps,\n Value,\n ValuePreview,\n type ButtonProps,\n Button,\n ButtonPreview,\n Switch,\n SwitchPreview,\n type SwitchProps,\n} from \"@/vis/schematic/Symbols\";\n\nexport interface Spec<P extends object> {\n key: Variant;\n name: string;\n Form: FC<SymbolFormProps>;\n Symbol: FC<SymbolProps<P>>;\n defaultProps: (t: Theming.Theme) => P;\n Preview: FC<SymbolProps<P>>;\n zIndex: number;\n}\n\nconst Z_INDEX_UPPER = 4;\nconst Z_INDEX_LOWER = 2;\n\nconst VARIANTS = [\n \"threeWayValve\",\n \"valve\",\n \"solenoidValve\",\n \"fourWayValve\",\n \"angledValve\",\n \"pump\",\n \"tank\",\n \"reliefValve\",\n \"regulator\",\n \"burstDisc\",\n \"cap\",\n \"manualValve\",\n \"filter\",\n \"needleValve\",\n \"checkValve\",\n \"orifice\",\n \"angledReliefValve\",\n \"value\",\n \"button\",\n \"switch\",\n] as const;\n\nconst typeZ = z.enum(VARIANTS);\nexport type Variant = z.infer<typeof typeZ>;\n\nconst ZERO_TOGGLE_PROPS = {\n source: telem.sourcePipeline(\"boolean\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"threshold\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: 0 }),\n threshold: telem.withinBounds({ trueBound: { lower: 0.9, upper: 1.1 } }),\n },\n outlet: \"threshold\",\n }),\n sink: telem.sinkPipeline(\"boolean\", {\n connections: [\n {\n from: \"setpoint\",\n to: \"setter\",\n },\n ],\n segments: {\n setter: control.setChannelValue({ channel: 0 }),\n setpoint: telem.setpoint({ truthy: 1, falsy: 0 }),\n },\n inlet: \"setpoint\",\n }),\n};\n\nconst threeWayValve: Spec<ThreeWayValveProps> = {\n name: \"Three Way Valve\",\n key: \"threeWayValve\",\n Form: CommonToggleForm,\n Symbol: ThreeWayValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Three Way Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n ...ZERO_TOGGLE_PROPS,\n orientation: \"left\",\n }),\n Preview: ThreeWayValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst valve: Spec<ValveProps> = {\n name: \"Valve\",\n key: \"valve\",\n Form: CommonToggleForm,\n Symbol: Valve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: ValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst solenoidValve: Spec<SolenoidValveProps> = {\n name: \"Pneumatic Valve\",\n key: \"solenoidValve\",\n Form: SolenoidValveForm,\n Symbol: SolenoidValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Pneumatic Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n normallyOpen: false,\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: SolenoidValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst fourWayValve: Spec<ValveProps> = {\n name: \"Four Way Valve\",\n key: \"fourWayValve\",\n Form: CommonToggleForm,\n Symbol: FourWayValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Four Way Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: FourWayValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst angledValve: Spec<AngledValveProps> = {\n name: \"Angled Valve\",\n key: \"angledValve\",\n Form: CommonToggleForm,\n Symbol: AngledValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Angled Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: AngledValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst pump: Spec<PumpProps> = {\n name: \"Pump\",\n key: \"pump\",\n Form: CommonToggleForm,\n Symbol: Pump,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Pump\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n Preview: PumpPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst tank: Spec<TankProps> = {\n name: \"Tank\",\n key: \"tank\",\n Form: TankForm,\n Symbol: Tank,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Tank\",\n level: \"p\",\n orientation: \"top\",\n },\n dimensions: {\n width: 100,\n height: 200,\n },\n orientation: \"left\",\n }),\n Preview: TankPreview,\n zIndex: Z_INDEX_LOWER,\n};\n\nconst reliefValve: Spec<ReliefValveProps> = {\n name: \"Relief Valve\",\n key: \"reliefValve\",\n Form: CommonNonToggleForm,\n Symbol: ReliefValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Relief Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: ReliefValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst regulator: Spec<RegulatorProps> = {\n name: \"Regulator\",\n key: \"regulator\",\n Form: CommonNonToggleForm,\n Symbol: Regulator,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Regulator\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: RegulatorPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst burstDisc: Spec<ReliefValveProps> = {\n name: \"Burst Disc\",\n key: \"burstDisc\",\n Form: CommonNonToggleForm,\n Symbol: BurstDisc,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Burst Disc\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: BurstDiscPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst cap: Spec<ReliefValveProps> = {\n name: \"Cap\",\n key: \"cap\",\n Form: CommonNonToggleForm,\n Symbol: Cap,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Cap\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: CapPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst manualValve: Spec<ManualValveProps> = {\n name: \"Manual Valve\",\n key: \"manualValve\",\n Form: CommonNonToggleForm,\n Symbol: ManualValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Manual Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: ManualValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst filter: Spec<FilterProps> = {\n name: \"Filter\",\n key: \"filter\",\n Form: CommonNonToggleForm,\n Symbol: Filter,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Filter\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: FilterPreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst needleValve: Spec<NeedleValveProps> = {\n name: \"Needle Valve\",\n key: \"needleValve\",\n Form: CommonNonToggleForm,\n Symbol: NeedleValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Needle Valve\",\n level: \"p\",\n },\n orientation: \"left\",\n }),\n Preview: NeedleValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst checkValve: Spec<CheckValveProps> = {\n name: \"Check Valve\",\n key: \"checkValve\",\n Form: CommonNonToggleForm,\n Symbol: CheckValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Check Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: CheckValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst orifice: Spec<OrificeProps> = {\n name: \"Orifice\",\n key: \"orifice\",\n Form: CommonNonToggleForm,\n Symbol: Orifice,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Orifice\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: OrificePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst angledReliefValve: Spec<ReliefValveProps> = {\n name: \"Angled Relief Valve\",\n key: \"angledReliefValve\",\n Form: CommonNonToggleForm,\n Symbol: AngledReliefValve,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n label: {\n label: \"Angled Relief Valve\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n }),\n Preview: AngledReliefValvePreview,\n zIndex: Z_INDEX_UPPER,\n};\n\nconst value: Spec<ValueProps> = {\n name: \"Value\",\n key: \"value\",\n Form: ValueForm,\n Symbol: Value,\n Preview: ValuePreview,\n defaultProps: (t) => ({\n color: t.colors.gray.l9.rgba255,\n units: \"psi\",\n level: \"h5\",\n label: {\n label: \"Value\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n telem: telem.sourcePipeline(\"string\", {\n connections: [\n {\n from: \"valueStream\",\n to: \"rollingAverage\",\n },\n {\n from: \"rollingAverage\",\n to: \"stringifier\",\n },\n ],\n segments: {\n valueStream: telem.streamChannelValue({ channel: 0 }),\n stringifier: telem.stringifyNumber({ precision: 2 }),\n rollingAverage: telem.rollingAverage({ windowSize: 1 }),\n },\n outlet: \"stringifier\",\n }),\n }),\n zIndex: Z_INDEX_UPPER,\n};\n\nconst button: Spec<ButtonProps> = {\n name: \"Button\",\n key: \"button\",\n Symbol: Button,\n Form: ButtonForm,\n Preview: ButtonPreview,\n defaultProps: (t) => ({\n label: {\n label: \"Button\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n sink: telem.sinkPipeline(\"boolean\", {\n connections: [\n {\n from: \"setpoint\",\n to: \"setter\",\n },\n ],\n segments: {\n setter: control.setChannelValue({ channel: 0 }),\n setpoint: telem.setpoint({ truthy: 1, falsy: 0 }),\n },\n inlet: \"setpoint\",\n }),\n }),\n zIndex: Z_INDEX_UPPER,\n};\n\nconst switch_: Spec<SwitchProps> = {\n name: \"Switch\",\n key: \"switch\",\n Symbol: Switch,\n Preview: SwitchPreview,\n Form: CommonToggleForm,\n defaultProps: (t) => ({\n label: {\n label: \"Switch\",\n level: \"p\",\n orientation: \"top\",\n },\n orientation: \"left\",\n ...ZERO_TOGGLE_PROPS,\n }),\n zIndex: Z_INDEX_UPPER,\n};\n\nexport const SYMBOLS: Record<Variant, Spec<any>> = {\n value,\n threeWayValve,\n valve,\n solenoidValve,\n fourWayValve,\n angledValve,\n pump,\n tank,\n reliefValve,\n regulator,\n burstDisc,\n cap,\n manualValve,\n filter,\n needleValve,\n checkValve,\n orifice,\n angledReliefValve,\n button,\n switch: switch_,\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useContext,\n useEffect,\n} from \"react\";\n\nimport { Instrumentation } from \"@synnaxlabs/alamos\";\n\nimport { Aether } from \"@/aether\";\nimport { alamos } from \"@/alamos/aether\";\nimport { useMemoDeepEqualProps } from \"@/memo\";\n\nexport interface ContextValue {\n instrumentation: Instrumentation;\n}\n\nconst Context = createContext<ContextValue>({\n instrumentation: Instrumentation.NOOP,\n});\n\nexport interface ProviderProps extends PropsWithChildren, alamos.ProviderState {}\n\nexport const useInstrumentation = (): Instrumentation =>\n useContext(Context).instrumentation;\n\nexport const Provider = Aether.wrap<ProviderProps>(\n alamos.Provider.TYPE,\n ({ aetherKey, children, ...props }): ReactElement => {\n const memoProps = useMemoDeepEqualProps(props);\n const [{ path }, , setState] = Aether.use({\n aetherKey,\n type: alamos.Provider.TYPE,\n schema: alamos.providerStateZ,\n initialState: memoProps,\n });\n\n useEffect(() => {\n setState(memoProps);\n }, [memoProps, setState]);\n\n return <Aether.Composite path={path}>{children}</Aether.Composite>;\n },\n);\n","export default \"data:video/mp2t;base64,Ly8gQ29weXJpZ2h0IDIwMjMgU3lubmF4IExhYnMsIEluYy4KLy8KLy8gVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIGluY2x1ZGVkIGluIHRoZSBmaWxlCi8vIGxpY2Vuc2VzL0JTTC50eHQuCi8vCi8vIEFzIG9mIHRoZSBDaGFuZ2UgRGF0ZSBzcGVjaWZpZWQgaW4gdGhhdCBmaWxlLCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIEJ1c2luZXNzIFNvdXJjZQovLyBMaWNlbnNlLCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSB3aWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsCi8vIGluY2x1ZGVkIGluIHRoZSBmaWxlIGxpY2Vuc2VzL0FQTC50eHQuCgppbXBvcnQgeyBwbHV0byB9IGZyb20gIkAvcGx1dG8vYWV0aGVyIjsKCnBsdXRvLnJlbmRlcigpOwo=\"","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type PropsWithChildren, type ReactElement } from \"react\";\n\nimport { Aether } from \"@/aether\";\nimport { telem } from \"@/telem/aether\";\n\nexport interface ProviderProps extends PropsWithChildren<any> {}\n\nexport const Provider = Aether.wrap<ProviderProps>(\n telem.BaseProvider.TYPE,\n ({ children, aetherKey }): ReactElement | null => {\n const [{ path }] = Aether.use({\n aetherKey,\n type: telem.BaseProvider.TYPE,\n schema: telem.providerStateZ,\n initialState: {},\n });\n return <Aether.Composite path={path}>{children}</Aether.Composite>;\n },\n);\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { FC, type PropsWithChildren, type ReactElement } from \"react\";\n\nimport { Aether } from \"@/aether\";\nimport { Alamos } from \"@/alamos\";\nimport { Channel } from \"@/channel\";\nimport { Haul } from \"@/haul\";\nimport DefaultWorkerURL from \"@/pluto/defaultWorker.ts?url\";\nimport { Status } from \"@/status\";\nimport { Synnax } from \"@/synnax\";\nimport { Telem } from \"@/telem\";\nimport { Control } from \"@/telem/control\";\nimport { Theming } from \"@/theming\";\nimport { Tooltip } from \"@/tooltip\";\nimport { Triggers } from \"@/triggers\";\nimport { Worker } from \"@/worker\";\n\n// // @ts-expect-error - unable to resolve valid vite import\n// // eslint-disable-next-line import/no-unresolved\n\nimport \"@synnaxlabs/media/dist/style.css\";\n\ntype CanDisabledProps<T extends PropsWithChildren> = T & { disabled?: boolean };\n\nconst canDisable =\n <T extends PropsWithChildren>(C: FC<T>): FC<CanDisabledProps<T>> =>\n ({ disabled = false, ...props }) =>\n disabled ? props.children : <C {...(props as T)} />;\n\nconst CanDisableTelem = canDisable<Telem.ProviderProps>(Telem.Provider);\nconst CanDisableAether = canDisable<Aether.ProviderProps>(Aether.Provider);\n\nexport interface ProviderProps\n extends PropsWithChildren, Synnax.ProviderProps {\n theming?: Theming.ProviderProps,\n workerEnabled?: boolean;\n workerURL?: URL | string;\n alamos?: Alamos.ProviderProps;\n tooltip?: Tooltip.ConfigProps;\n triggers?: Triggers.ProviderProps;\n haul?: Haul.ProviderProps;\n channelAlias?: Channel.AliasProviderProps;\n telem?: CanDisabledProps<Telem.ProviderProps>;\n}\n\nexport const Provider = ({\n children,\n connParams,\n workerEnabled = true,\n workerURL,\n theming,\n tooltip,\n triggers,\n alamos,\n haul,\n channelAlias,\n telem,\n}: ProviderProps): ReactElement => {\n return (\n <Triggers.Provider {...triggers}>\n <Tooltip.Config {...tooltip}>\n <Haul.Provider {...haul}>\n <Worker.Provider url={workerURL ?? DefaultWorkerURL} enabled={workerEnabled}>\n <CanDisableAether workerKey=\"vis\">\n <Alamos.Provider {...alamos}>\n <Status.Aggregator>\n <Synnax.Provider connParams={connParams}>\n <Channel.AliasProvider {...channelAlias}>\n <CanDisableTelem {...telem}>\n <Theming.Provider {...theming}>\n <Control.StateProvider>{children}</Control.StateProvider>\n </Theming.Provider>\n </CanDisableTelem>\n </Channel.AliasProvider>\n </Synnax.Provider>\n </Status.Aggregator>\n </Alamos.Provider>\n </CanDisableAether>\n </Worker.Provider>\n </Haul.Provider>\n </Tooltip.Config>\n </Triggers.Provider>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { type CrudeTimeRange, TimeStamp, TimeSpan } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { Text } from \"@/text\";\n\nimport \"@/ranger/TimeRangeChip.css\";\n\nexport interface TimeRangeChipProps {\n timeRange: CrudeTimeRange;\n}\n\nexport const TimeRangeChip = ({ timeRange }: TimeRangeChipProps): ReactElement => {\n const startTS = new TimeStamp(timeRange.start);\n const startFormat = startTS.isToday ? \"time\" : \"dateTime\";\n const endTS = new TimeStamp(timeRange.end);\n const isOpen = endTS.equals(TimeStamp.MAX);\n const endFormat = endTS.span(startTS) < TimeSpan.DAY ? \"time\" : \"dateTime\";\n\n return (\n <Align.Space\n direction=\"x\"\n size=\"small\"\n className={CSS(CSS.B(\"time-range-chip\"))}\n align=\"center\"\n >\n {startTS.isToday && (\n <Text.Text level=\"p\" shade={7} weight={450}>\n Today\n </Text.Text>\n )}\n <Text.DateTime\n level=\"p\"\n displayTZ=\"local\"\n format={startFormat}\n shade={7}\n weight={450}\n >\n {startTS}\n </Text.DateTime>\n <Icon.Arrow.Right color=\"var(--pluto-text-color)\" />\n {isOpen ? (\n <Text.Text level=\"p\">Now</Text.Text>\n ) : (\n <Text.DateTime\n level=\"p\"\n displayTZ=\"local\"\n format={endFormat}\n shade={7}\n weight={450}\n >\n {endTS}\n </Text.DateTime>\n )}\n </Align.Space>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { type label } from \"@synnaxlabs/client\";\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { type List } from \"@/list\";\nimport { Select } from \"@/select\";\nimport { Synnax } from \"@/synnax\";\nimport { Tag } from \"@/tag\";\n\nconst labelColumns: Array<List.ColumnSpec<label.Key, label.Label>> = [\n {\n key: \"color\",\n name: \"Color\",\n width: 50,\n render: (v) => (\n <Icon.Circle\n style={{ fontSize: 10, marginLeft: 10, marginRight: 30 }}\n color={v.entry.color}\n />\n ),\n },\n {\n key: \"name\",\n name: \"Name\",\n },\n];\n\nexport interface SelectLabelsProps\n extends Omit<Select.MultipleProps<label.Key, label.Label>, \"columns\" | \"searcher\"> {}\n\nexport const SelectLabels = (props: SelectLabelsProps): ReactElement => {\n const client = Synnax.use();\n return (\n <Select.Multiple\n {...props}\n searcher={client?.labels}\n columns={labelColumns}\n renderTag={(v) => {\n if (v.entry == null) return <Tag.Tag color=\"gray\">{v.entryKey}</Tag.Tag>;\n return <Tag.Tag color={v.entry.color}>{v.entry.name}</Tag.Tag>;\n }}\n />\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { CSS } from \"@/css\";\n\nimport \"@/progress/Progress.css\";\n\ninterface ProgressProps {\n value: number;\n}\n\nexport const Progress = ({ value }: ProgressProps): ReactElement => {\n return (\n <div className={CSS.B(\"progress\")}>\n <div className={CSS.B(\"progress-bar\")} style={{ width: `${value}%` }} />\n </div>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { Fragment, type ReactElement } from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { type Input } from \"@/input\";\n\nexport interface Step {\n key: string;\n title: string;\n}\n\nexport interface StepsProps\n extends Omit<Align.SpaceProps, \"children\" | \"onChange\">,\n Input.Control<string> {\n steps: Step[];\n}\n\nexport const Steps = ({\n steps,\n value,\n onChange,\n ...props\n}: StepsProps): ReactElement => {\n const selectedIdx = steps.findIndex((step) => step.key === value);\n return (\n <Align.Space direction=\"x\" align=\"center\" className={CSS.B(\"steps\")} {...props}>\n {steps.map((step, i) => (\n <Fragment key={step.key}>\n <Button.Button\n onClick={() => onChange(step.key)}\n key={step.key}\n variant=\"outlined\"\n disabled={i > selectedIdx}\n >\n {i + 1}. {step.title}\n </Button.Button>\n {i !== steps.length - 1 && (\n <Icon.Arrow.Right\n style={{ fontSize: \"15px\", color: \"var(--pluto-gray-l8)\" }}\n />\n )}\n </Fragment>\n ))}\n </Align.Space>\n );\n};\n","// Copyright 2023 Synnax Labs, Inc.\n//\n// Use of this software is governed by the Business Source License included in the file\n// licenses/BSL.txt.\n//\n// As of the Change Date specified in that file, in accordance with the Business Source\n// License, use of this software will be governed by the Apache License, Version 2.0,\n// included in the file licenses/APL.txt.\n\nimport { type ReactElement } from \"react\";\n\nimport { type device } from \"@synnaxlabs/client\";\nimport { type AsyncTermSearcher } from \"@synnaxlabs/x\";\n\nimport { type List } from \"@/list\";\nimport { Select } from \"@/select\";\nimport { Synnax } from \"@/synnax\";\n\nconst deviceColumns: Array<List.ColumnSpec<device.DeviceKey, device.Device>> = [\n {\n key: \"name\",\n name: \"Name\",\n },\n {\n key: \"location\",\n name: \"Location\",\n },\n];\n\nexport interface SelectSingleProps\n extends Omit<Select.SingleProps<device.DeviceKey, device.Device>, \"columns\"> {\n searchOptions?: device.RetrieveOptions;\n}\n\nexport const SelectSingle = ({\n searchOptions,\n ...props\n}: SelectSingleProps): ReactElement => {\n const client = Synnax.use();\n let searcher: AsyncTermSearcher<string, device.DeviceKey, device.Device> | undefined =\n client?.hardware.devices;\n if (searchOptions != null && client != null)\n searcher = client.hardware.devices.newSearcherWithOptions(searchOptions);\n return (\n <Select.Single<device.DeviceKey, device.Device>\n columns={deviceColumns}\n searcher={searcher}\n entryRenderKey={\"name\"}\n {...props}\n />\n );\n};\n"],"names":["Circle","jsx","Icon","jsxs","Align.Space","Text.Text","Text.DateTime","Button.Icon","toArray","a","i","Button.Button","e","Core","location","direction","box","Multiple","v","math","p","f","xy","mouseKey","Triggers.mouseKey","Single","clamp","Resize.useMultiple","Resize.Multiple","Fragment","Header.Header","Header.ButtonTitle","Header.Actions","value","state.usePurePassthrough","s","scale","Color.Swatch","c","Text.MaybeEditable","runtime","Aether.wrap","canvas.Canvas","Aether.use","canvas.canvasStateZ","handleResize","bootstrapped","Aether.Composite","canvas","BackgroundVariant","dimensions","React","Background","shallow","Background$1","Context","useContext","reactUseContext","deep","LinePlot","lineplot.LinePlot","lineplot.linePlotStateZ","_","Canvas.useRegion","grid","k","hold","Legend","Core.Simple","Line","line.Line","line.stateZ","Core.Line","Theming.useTypography","D","use","Triggers.flattenConfig","Triggers.compareModeConfigs","Triggers.determineMode","next","Triggers.useHeldRef","Triggers.useDrag","Triggers.use","Color.cssString","Text.WithIcon","Text.ComponentSizeLevels","Dropdown.use","compare","CoreList.Search","CoreList.Filter","onChange","CoreList.useSelectionUtils","Input.Text","Tag.Tag","convertRenderV","primitiveIsZero","DATA","CoreButton.Icon","Button","TelemDataType","caseconv","Tooltip","Triggers.Text","Select.Button","props","Core.use","Core.Mask","lineplot.XAxis","lineplot.YAxis","useMemoDeepEqual","state","Text.dimensions","labelSize","XAxis","YAxis","tooltip.Tooltip","tooltip.tooltipStateZ","measure.Measure","measure.measureStateZ","LinePlot.useViewport","rule.Rule","rule.ruleStateZ","bounds","Text.Editable","range.Annotation","range.annotationStateZ","Provider","range.Provider","range.providerStateZ","Menu.useContextMenu","Menu.ContextMenu","canDrop","Haul.canDropOfType","loc","Core.LinePlot","Core.Legend","Core.Title","Core.Viewport","Tooltip.Tooltip","Measure.Measure","Haul.useDrop","Haul.filterByType","key","Core.XAxis","Haul.useDraggingState","Rule.Rule","Range.Provider","y","Core.YAxis","telem.streamChannelData","telem.channelData","synnax.ZERO_CONTEXT_VALUE","synnax.Provider","Status.useAggregator","Synnax","TimeSpan","n","Synnax.use","aliases","h","filter","Status.Text","Haul.useDragAndDrop","unique","Select.Multiple","SelectSingle","nullToArr","Select.Single","Tabs.resetSelection","Tabs.rename","Portal.Node","_a","Portal.In","size","Haul.Provider","Tabs.Tabs","Portal.Out","eraser.Eraser","eraser.eraserStateZ","Eraser.use","Resize.Single","Align.Pack","Controls","stump","connector.buildNew","connector.segmentsToPoints","connector.moveSourceNode","connector.checkIntegrity","connector.moveTargetNode","connector.dragSegment","diagram.Diagram","diagram.diagramStateZ","Theming.use","CoreViewport.DEFAULT_TRIGGERS","prev","useRFOnViewportChange","renderer","rfApplyNodeChanges","rfApplyEdgeChanges","rfAddEdge","EdgeComponent","Triggers.purgeMouse","RFBackground","Button.ToggleIcon","Value","text.levelZ","control.Controller","control.controllerStateZ","control.StateProvider","control.stateProviderStateZ","control.Indicator","TimeStamp","control.indicatorStateZ","Color.Color","Tooltip.Dialog","_b","clientControl","control.Chip","control.chipStateZ","control.Legend","control.legendStateZ","s2","UnexpectedError","button.Button","button.buttonStateZ","RFPosition","RFHandle","FourWayValve","ThreeWayValve","Valve","SolenoidValve","ReliefValve","CheckValve","AngledValve","Pump","BurstDisc","Cap","ManualValve","Filter","Tank","Regulator","Orifice","NeedleValve","AngledReliefValve","Switch","Input.Switch","CoreButton.Button","toggle.Toggle","toggle.toggleStateZ","Control.Chip","Control.Indicator","Toggle.use","Primitives.ThreeWayValve","Primitives.Valve","Primitives.SolenoidValve","Primitives.FourWayValve","Primitives.AngledValve","Primitives.Pump","Primitives.Tank","Primitives.ReliefValve","Primitives.Regulator","Primitives.BurstDisc","Primitives.Cap","Primitives.ManualValve","Primitives.Filter","Primitives.NeedleValve","Primitives.CheckValve","Primitives.Orifice","Primitives.AngledReliefValve","label","CoreValue.use","Primitives.Value","Primitives.Switch","CoreButton.use","Primitives.Button","l","u","shallowCopy","Input.Item","Input.Numeric","Select.DropdownButton","schema","zodutil","Form.Field","Text.SelectLevel","Color.ZERO","Form.useField","telem.sourcePipelinePropsZ","telem.sinkPipelinePropsZ","telem.streamChannelValuePropsZ","control.setChannelValuePropsZ","telem.sourcePipeline","telem.streamChannelValue","telem.withinBounds","telem.sinkPipeline","control.setChannelValue","telem.setpoint","control.authoritySource","control.acquireChannelControl","Channel.SelectSingle","Tabs.useStatic","telem.stringifyNumberProps","rollingAverage","telem.rollingAverageProps","telem.stringifyNumber","telem.rollingAverage","Channel.useName","Instrumentation","alamos.Provider","alamos.providerStateZ","telem.BaseProvider","telem.providerStateZ","Telem.Provider","Aether.Provider","Triggers.Provider","Tooltip.Config","Worker.Provider","Alamos.Provider","Status.Aggregator","Synnax.Provider","Channel.AliasProvider","Theming.Provider","Control.StateProvider"],"mappings":"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","x_google_ignoreList":[12]}