@synnaxlabs/pluto 0.21.8 → 0.21.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Center-hbwH7rg9.js → Center-BK9Rcaa0.js} +2 -2
- package/dist/{Center-hbwH7rg9.js.map → Center-BK9Rcaa0.js.map} +1 -1
- package/dist/{Center-5NJ61qfA.cjs → Center-Cc_rR5pQ.cjs} +2 -2
- package/dist/{Center-5NJ61qfA.cjs.map → Center-Cc_rR5pQ.cjs.map} +1 -1
- package/dist/{Keyboard-DaFraUsQ.cjs → Keyboard-Byx8rGZt.cjs} +3 -3
- package/dist/{Keyboard-DaFraUsQ.cjs.map → Keyboard-Byx8rGZt.cjs.map} +1 -1
- package/dist/{Keyboard-nDIAR7Rj.js → Keyboard-D31SwhYT.js} +3 -3
- package/dist/{Keyboard-nDIAR7Rj.js.map → Keyboard-D31SwhYT.js.map} +1 -1
- package/dist/{LinePlot-BZDm4uxJ.cjs → LinePlot-Bnb8Ufob.cjs} +96 -65
- package/dist/LinePlot-Bnb8Ufob.cjs.map +1 -0
- package/dist/{LinePlot-tOiSUMjC.js → LinePlot-KYwy1D7H.js} +281 -250
- package/dist/LinePlot-KYwy1D7H.js.map +1 -0
- package/dist/{Link-BdWFvK8v.cjs → Link-Bq38h1dw.cjs} +2 -2
- package/dist/{Link-BdWFvK8v.cjs.map → Link-Bq38h1dw.cjs.map} +1 -1
- package/dist/{Link-d3CXVSaO.js → Link-DQKdkwWL.js} +2 -2
- package/dist/{Link-d3CXVSaO.js.map → Link-DQKdkwWL.js.map} +1 -1
- package/dist/{List-DcsWFiLT.js → List-BmP_se57.js} +3 -3
- package/dist/{List-DcsWFiLT.js.map → List-BmP_se57.js.map} +1 -1
- package/dist/{List-PlMTfEHi.cjs → List-BnB-C5vQ.cjs} +3 -3
- package/dist/{List-PlMTfEHi.cjs.map → List-BnB-C5vQ.cjs.map} +1 -1
- package/dist/{Toggle-C6Z8WPT3.cjs → Toggle-D3iCEbO1.cjs} +46 -46
- package/dist/{Toggle-C6Z8WPT3.cjs.map → Toggle-D3iCEbO1.cjs.map} +1 -1
- package/dist/{Toggle-DGLgYCOX.js → Toggle-bT5RpwfA.js} +399 -399
- package/dist/{Toggle-DGLgYCOX.js.map → Toggle-bT5RpwfA.js.map} +1 -1
- package/dist/{Video-DFtnAOYY.cjs → Video-B4sma9fk.cjs} +2 -2
- package/dist/{Video-DFtnAOYY.cjs.map → Video-B4sma9fk.cjs.map} +1 -1
- package/dist/{Video-SGhKphYR.js → Video-Cp6XjjOK.js} +2 -2
- package/dist/{Video-SGhKphYR.js.map → Video-Cp6XjjOK.js.map} +1 -1
- package/dist/{aggregator-BgImZc4o.js → aggregator-B8fg7W2s.js} +106 -106
- package/dist/aggregator-B8fg7W2s.js.map +1 -0
- package/dist/{aggregator-BpfMBUD1.cjs → aggregator-Bh2Kyzkg.cjs} +100 -100
- package/dist/aggregator-Bh2Kyzkg.cjs.map +1 -0
- package/dist/align.cjs +1 -1
- package/dist/align.js +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.js +1 -1
- package/dist/{color-DV-YGUvp.js → color-CjdRh-aN.js} +2 -2
- package/dist/{color-DV-YGUvp.js.map → color-CjdRh-aN.js.map} +1 -1
- package/dist/{color-BVVyrgRF.cjs → color-DBNbbjJy.cjs} +2 -2
- package/dist/{color-BVVyrgRF.cjs.map → color-DBNbbjJy.cjs.map} +1 -1
- package/dist/color.cjs +1 -1
- package/dist/color.js +1 -1
- package/dist/{css-Pf9qxhQ4.cjs → css-Ci8WUD5E.cjs} +112 -108
- package/dist/css-Ci8WUD5E.cjs.map +1 -0
- package/dist/{css-DoalWJF6.js → css-DKKmdhSr.js} +114 -110
- package/dist/css-DKKmdhSr.js.map +1 -0
- package/dist/css.cjs +2 -2
- package/dist/css.js +2 -2
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +1 -1
- package/dist/ether.cjs +3 -3
- package/dist/ether.js +5 -5
- package/dist/{external-Cu6T11fi.cjs → external-9_cqFQy3.cjs} +6 -6
- package/dist/{external-Cu6T11fi.cjs.map → external-9_cqFQy3.cjs.map} +1 -1
- package/dist/{external-Blx0rtt2.cjs → external-B-zN2e5z.cjs} +6 -6
- package/dist/{external-Blx0rtt2.cjs.map → external-B-zN2e5z.cjs.map} +1 -1
- package/dist/{external-DeheWVb-.js → external-BM82B8W2.js} +6 -6
- package/dist/{external-DeheWVb-.js.map → external-BM82B8W2.js.map} +1 -1
- package/dist/{external-96EinZfY.js → external-BYqTC99W.js} +3 -3
- package/dist/external-BYqTC99W.js.map +1 -0
- package/dist/{external-5przQjJD.js → external-BfZYUV3z.js} +11 -11
- package/dist/{external-5przQjJD.js.map → external-BfZYUV3z.js.map} +1 -1
- package/dist/{external-SxB9IH0p.js → external-BpqCp_M1.js} +2 -2
- package/dist/external-BpqCp_M1.js.map +1 -0
- package/dist/{external-C6GmnG49.js → external-BrW40HJx.js} +6 -6
- package/dist/{external-C6GmnG49.js.map → external-BrW40HJx.js.map} +1 -1
- package/dist/{external-1osPryUV.js → external-CAOQcoqL.js} +5 -5
- package/dist/{external-1osPryUV.js.map → external-CAOQcoqL.js.map} +1 -1
- package/dist/{external-D8dWmF4U.cjs → external-CIVsFXOp.cjs} +2 -2
- package/dist/external-CIVsFXOp.cjs.map +1 -0
- package/dist/{external-BAdU6u03.js → external-CnNdgPsB.js} +5 -5
- package/dist/{external-BAdU6u03.js.map → external-CnNdgPsB.js.map} +1 -1
- package/dist/{external-DiFhWWS-.js → external-CwjCCHPi.js} +7 -7
- package/dist/{external-DiFhWWS-.js.map → external-CwjCCHPi.js.map} +1 -1
- package/dist/{external-DarqsFzT.js → external-DNHMAfGi.js} +5 -5
- package/dist/{external-DarqsFzT.js.map → external-DNHMAfGi.js.map} +1 -1
- package/dist/{external-0PM7JrzG.cjs → external-DVQ2SRoH.cjs} +5 -5
- package/dist/{external-0PM7JrzG.cjs.map → external-DVQ2SRoH.cjs.map} +1 -1
- package/dist/{external-16K8slq8.cjs → external-D_yXh8rn.cjs} +11 -11
- package/dist/{external-16K8slq8.cjs.map → external-D_yXh8rn.cjs.map} +1 -1
- package/dist/{external-CPx8XA9-.cjs → external-Df0D1YYb.cjs} +7 -7
- package/dist/{external-CPx8XA9-.cjs.map → external-Df0D1YYb.cjs.map} +1 -1
- package/dist/{external-DvGqQHd8.cjs → external-DhPBdJpR.cjs} +3 -3
- package/dist/external-DhPBdJpR.cjs.map +1 -0
- package/dist/{external-D7XrxOVE.cjs → external-DhiN6pEk.cjs} +4 -4
- package/dist/{external-D7XrxOVE.cjs.map → external-DhiN6pEk.cjs.map} +1 -1
- package/dist/{external-CsO29OsF.cjs → external-DjYXzP7v.cjs} +7 -7
- package/dist/{external-CsO29OsF.cjs.map → external-DjYXzP7v.cjs.map} +1 -1
- package/dist/{external-B3ly2-jy.js → external-FWIwgLzc.js} +7 -7
- package/dist/{external-B3ly2-jy.js.map → external-FWIwgLzc.js.map} +1 -1
- package/dist/{external-B0z7uXZV.cjs → external-Iv2mRce8.cjs} +5 -5
- package/dist/{external-B0z7uXZV.cjs.map → external-Iv2mRce8.cjs.map} +1 -1
- package/dist/{external-CzJYG1hX.cjs → external-P6zP6dBA.cjs} +3 -3
- package/dist/external-P6zP6dBA.cjs.map +1 -0
- package/dist/{external-D4ur_D1S.cjs → external-d-vI8EHK.cjs} +5 -5
- package/dist/{external-D4ur_D1S.cjs.map → external-d-vI8EHK.cjs.map} +1 -1
- package/dist/{external-DQkw1ko0.js → external-giUMrk8w.js} +4 -4
- package/dist/{external-DQkw1ko0.js.map → external-giUMrk8w.js.map} +1 -1
- package/dist/{external-CgMwmBnF.js → external-zG96smqq.js} +3 -3
- package/dist/external-zG96smqq.js.map +1 -0
- package/dist/header.cjs +1 -1
- package/dist/header.js +1 -1
- package/dist/index.cjs +30 -30
- package/dist/index.js +55 -55
- package/dist/index.js.map +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/src/telem/client/cache/cache.d.ts +3 -8
- package/dist/src/telem/client/cache/cache.d.ts.map +1 -1
- package/dist/src/telem/client/cache/dynamic.d.ts +13 -3
- package/dist/src/telem/client/cache/dynamic.d.ts.map +1 -1
- package/dist/src/telem/client/client.d.ts +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/text.cjs +2 -2
- package/dist/text.js +2 -2
- package/dist/theming.cjs +2 -2
- package/dist/theming.js +2 -2
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/triggers.cjs +1 -1
- package/dist/triggers.js +1 -1
- package/dist/video.cjs +1 -1
- package/dist/video.js +1 -1
- package/package.json +2 -2
- package/dist/LinePlot-BZDm4uxJ.cjs.map +0 -1
- package/dist/LinePlot-tOiSUMjC.js.map +0 -1
- package/dist/aggregator-BgImZc4o.js.map +0 -1
- package/dist/aggregator-BpfMBUD1.cjs.map +0 -1
- package/dist/css-DoalWJF6.js.map +0 -1
- package/dist/css-Pf9qxhQ4.cjs.map +0 -1
- package/dist/external-96EinZfY.js.map +0 -1
- package/dist/external-CgMwmBnF.js.map +0 -1
- package/dist/external-CzJYG1hX.cjs.map +0 -1
- package/dist/external-D8dWmF4U.cjs.map +0 -1
- package/dist/external-DvGqQHd8.cjs.map +0 -1
- package/dist/external-SxB9IH0p.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-CPx8XA9-.cjs","sources":["../src/tree/core.ts","../src/tree/Tree.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 { toArray } from \"@synnaxlabs/x\";\n\nimport { type Haul } from \"@/haul\";\n\nexport interface Node {\n key: string;\n name: string;\n renaming?: boolean;\n forcePosition?: number;\n icon?: ReactElement;\n allowRename?: boolean;\n hasChildren?: boolean;\n children?: Node[];\n haulItems?: Haul.Item[];\n canDrop?: (items: Haul.Item[]) => boolean;\n href?: string;\n}\n\nexport interface NodeWithPosition extends Node {\n depth: number;\n position: number;\n}\n\nexport interface FlattenedNode extends Node {\n index: number;\n depth: number;\n expanded: boolean;\n}\n\nexport const shouldExpand = (node: Node, expanded: string[]): boolean =>\n expanded.includes(node.key);\n\nexport interface FlattenProps {\n nodes: Node[];\n expanded: string[];\n depth?: number;\n sort?: boolean;\n}\n\nexport const sortAndSplice = (nodes: Node[], sort: boolean): Node[] => {\n if (sort) {\n nodes.sort((a, b) => a.name.localeCompare(b.name));\n }\n let found = false;\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node.forcePosition != null && i !== node.forcePosition) {\n found = true;\n // remove the node from its current position\n nodes.splice(i, 1);\n // splice it into the forced position\n nodes.splice(node.forcePosition, 0, node);\n }\n }\n if (found) return sortAndSplice(nodes, false);\n return nodes;\n};\n\nexport const flatten = ({\n nodes,\n expanded,\n depth = 0,\n sort = true,\n}: FlattenProps): FlattenedNode[] => {\n // Sort the first level of the tree independently of the rest\n if (depth === 0 && sort) nodes = nodes.sort((a, b) => a.name.localeCompare(b.name));\n const flattened: FlattenedNode[] = [];\n nodes.forEach((node, index) => {\n const expand = shouldExpand(node, expanded);\n flattened.push({ ...node, depth, expanded: expand, index });\n if (expand && node.children != null) {\n node.children = sortAndSplice(node.children, sort);\n flattened.push(\n ...flatten({ nodes: node.children, expanded, depth: depth + 1, sort }),\n );\n }\n });\n return flattened;\n};\n\nexport interface MoveNodeProps {\n tree: Node[];\n destination: string;\n keys: string | string[];\n}\n\nexport const moveNode = ({ tree, destination, keys }: MoveNodeProps): Node[] => {\n keys = toArray(keys);\n keys.forEach((key) => {\n const node = findNode({ tree, key });\n if (node == null) return;\n removeNode({ tree, keys: key });\n setNode({ tree, destination, additions: node });\n });\n return tree;\n};\n\nexport interface RemoveNodeProps {\n tree: Node[];\n keys: string | string[];\n}\n\nexport const removeNode = ({ tree, keys }: RemoveNodeProps): Node[] => {\n keys = toArray(keys);\n const treeKeys = tree.map((node) => node.key);\n keys.forEach((key) => {\n const index = treeKeys.indexOf(key);\n if (index !== -1) tree.splice(index, 1);\n else {\n const parent = findNodeParent({ tree, key });\n if (parent != null)\n parent.children = parent.children?.filter((child) => child.key !== key);\n }\n });\n return tree;\n};\n\nexport interface SetNodeProps {\n tree: Node[];\n destination: string;\n additions: Node | Node[];\n}\n\nexport const setNode = ({ tree, destination, additions }: SetNodeProps): Node[] => {\n additions = toArray(additions);\n const node = findNode({ tree, key: destination });\n if (node == null) throw new Error(`Could not find node with key ${destination}`);\n if (node.children == null) node.children = [];\n const addedKeys = additions.map((node) => node.key);\n node.children = [\n ...additions,\n ...node.children.filter((child) => !addedKeys.includes(child.key)),\n ];\n return tree;\n};\n\nexport interface UpdateNodeProps {\n tree: Node[];\n key: string;\n updater: (node: Node) => Node;\n throwOnMissing?: boolean;\n}\n\nexport const updateNode = ({\n tree,\n key,\n updater,\n throwOnMissing = true,\n}: UpdateNodeProps): Node[] => {\n const node = findNode({ tree, key });\n if (node == null) {\n if (throwOnMissing) throw new Error(`Could not find node with key ${key}`);\n return tree;\n }\n const parent = findNodeParent({ tree, key });\n if (parent != null) {\n // splice the updated node into the parent's children\n const index = parent.children?.findIndex((child) => child.key === key);\n if (index != null && index !== -1) parent.children?.splice(index, 1, updater(node));\n } else {\n // we're in the root, so just update the node\n tree.splice(\n tree.findIndex((node) => node.key === key),\n 1,\n updater(node),\n );\n }\n return tree;\n};\n\nexport interface FindNodeProps {\n tree: Node[];\n key: string;\n depth?: number;\n}\n\nexport const findNode = ({\n tree,\n key,\n depth = 0,\n}: FindNodeProps): NodeWithPosition | null => {\n for (let i = 0; i < tree.length; i++) {\n const node = tree[i];\n if (node.key === key) {\n const n = node as NodeWithPosition;\n n.depth = depth;\n n.position = i;\n return n;\n }\n if (node.children != null) {\n const found = findNode({ tree: node.children, key, depth: depth + 1 });\n if (found != null) return found;\n }\n }\n return null;\n};\n\nexport interface FindNodesProps {\n tree: Node[];\n keys: string[];\n}\n\nexport const findNodes = ({ tree, keys }: FindNodesProps): NodeWithPosition[] => {\n const nodes: NodeWithPosition[] = [];\n for (const key of keys) {\n const node = findNode({ tree, key });\n if (node != null) nodes.push(node);\n }\n return nodes;\n};\n\nexport interface FindNodeParentProps {\n tree: Node[];\n key: string;\n}\n\nexport const findNodeParent = ({ tree, key }: FindNodeParentProps): Node | null => {\n for (const node of tree) {\n if (node.children != null) {\n if (node.children.some((child) => child.key === key)) return node;\n const found = findNodeParent({ tree: node.children, key });\n if (found != null) return found;\n }\n }\n return null;\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 useMemo,\n useState,\n type FC,\n memo,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { Haul } from \"@/haul\";\nimport { useSyncedRef, useCombinedStateAndRef } from \"@/hooks\";\nimport { List } from \"@/list\";\nimport { type UseSelectOnChangeExtra, type UseSelectProps } from \"@/list/useSelect\";\nimport { CONTEXT_SELECTED, CONTEXT_TARGET } from \"@/menu/ContextMenu\";\nimport { state } from \"@/state\";\nimport { Text } from \"@/text\";\nimport { flatten, type Node, type FlattenedNode } from \"@/tree/core\";\nimport { Triggers } from \"@/triggers\";\nimport { type RenderProp, componentRenderProp } from \"@/util/renderProp\";\n\nimport \"@/tree/Tree.css\";\n\nexport const HAUL_TYPE = \"tree-item\";\n\nexport interface HandleExpandProps {\n current: string[];\n action: \"expand\" | \"contract\";\n clicked: string;\n}\n\nexport interface UseProps {\n onExpand?: (props: HandleExpandProps) => void;\n selected?: string[];\n onSelectedChange?: state.Set<string[]>;\n initialExpanded?: string[];\n nodes: Node[];\n sort?: boolean;\n}\n\nexport interface UseReturn {\n selected: string[];\n expanded: string[];\n onSelect: UseSelectProps<string, FlattenedNode>[\"onChange\"];\n nodes: FlattenedNode[];\n}\n\nconst SHIFT_TRIGGERS: Triggers.Trigger[] = [[\"Shift\"]];\n\nexport const use = (props: UseProps): UseReturn => {\n const {\n onExpand,\n nodes,\n initialExpanded = [],\n sort = true,\n selected: propsSelected,\n onSelectedChange,\n } = props ?? {};\n const [expanded, setExpanded, ref] =\n useCombinedStateAndRef<string[]>(initialExpanded);\n const [selected, setSelected] = state.usePassthrough<string[]>({\n initial: [],\n value: propsSelected,\n onChange: onSelectedChange,\n });\n const flat = useMemo(\n () => flatten({ nodes, expanded, sort }),\n [nodes, expanded, sort],\n );\n const flatRef = useSyncedRef(flat);\n\n const shiftRef = Triggers.useHeldRef({ triggers: SHIFT_TRIGGERS });\n\n const handleSelect: UseSelectProps<string, FlattenedNode>[\"onChange\"] = useCallback(\n (\n keys: string[],\n { clicked }: UseSelectOnChangeExtra<string, FlattenedNode>,\n ): void => {\n setSelected(keys);\n const n = flatRef.current.find((node) => node.key === clicked);\n if (n?.hasChildren === false) return;\n if (clicked == null || shiftRef.current.held) return;\n const currentlyExpanded = ref.current;\n const action = currentlyExpanded.some((key) => key === clicked)\n ? \"contract\"\n : \"expand\";\n let nextExpanded = currentlyExpanded;\n if (action === \"contract\")\n nextExpanded = currentlyExpanded.filter((key) => key !== clicked);\n else nextExpanded = [...currentlyExpanded, clicked];\n setExpanded(nextExpanded);\n onExpand?.({ current: nextExpanded, action, clicked });\n },\n [onExpand, flatRef, setExpanded, setSelected],\n );\n\n return {\n onSelect: handleSelect,\n selected,\n expanded,\n nodes: flat,\n };\n};\n\nexport interface ItemProps extends List.ItemProps<string, FlattenedNode> {\n onDrop?: (key: string, props: Haul.OnDropProps) => Haul.Item[];\n onSuccessfulDrop?: (key: string, props: Haul.OnSuccessfulDropProps) => void;\n onRename?: (key: string, name: string) => void;\n onDoubleClick?: (key: string, e: React.MouseEvent) => void;\n loading?: boolean;\n useMargin?: boolean;\n}\n\ntype TreePropsInheritedFromItem = Pick<\n ItemProps,\n \"onDrop\" | \"onRename\" | \"onSuccessfulDrop\" | \"onDoubleClick\" | \"useMargin\"\n>;\n\ntype TreePropsInheritedFromList = Omit<\n List.VirtualCoreProps<string, FlattenedNode>,\n \"onDrop\" | \"onSelect\" | \"children\" | \"onDoubleClick\" | \"itemHeight\"\n> & {\n itemHeight?: number;\n};\n\nexport interface TreeProps\n extends TreePropsInheritedFromItem,\n TreePropsInheritedFromList {\n nodes: FlattenedNode[];\n selected?: string[];\n onSelect: UseSelectProps<string, FlattenedNode>[\"onChange\"];\n children?: RenderProp<ItemProps>;\n virtual?: boolean;\n}\n\nconst expandedCaret = <Icon.Caret.Down className={CSS.B(\"caret\")} />;\nconst collapsedCaret = <Icon.Caret.Right className={CSS.B(\"caret\")} />;\n\nexport type Item = FC<ItemProps>;\n\nexport const DefaultItem = memo(\n ({\n entry,\n selected,\n onSelect,\n onDrop,\n onRename,\n onSuccessfulDrop,\n onDoubleClick,\n loading = false,\n useMargin = false,\n translate,\n }: ItemProps): ReactElement => {\n const {\n key,\n hasChildren = false,\n allowRename = false,\n children,\n icon,\n name,\n depth,\n expanded,\n href,\n haulItems = [],\n } = entry;\n\n const { getSelected } = List.useSelectionUtils<string>();\n const { getSourceData } = List.useDataUtilContext<string, FlattenedNode>();\n\n const actuallyHasChildren =\n hasChildren || (children != null && children.length > 0);\n\n // Expand, contract, and loading items.\n const startIcons: ReactElement[] = [];\n if (actuallyHasChildren) startIcons.push(expanded ? expandedCaret : collapsedCaret);\n if (icon != null) startIcons.push(icon);\n const endIcons: ReactElement[] = [];\n if (loading) endIcons.push(<Icon.Loading className={CSS.B(\"loading-indicator\")} />);\n\n const [draggingOver, setDraggingOver] = useState(false);\n\n // Drag and Drop\n const { startDrag, ...dropProps } = Haul.useDragAndDrop({\n type: \"Tree.Item\",\n key,\n canDrop: useCallback(({ items: entities, source }) => {\n const keys = entities.map((item) => item.key);\n setDraggingOver(false);\n return source.type === \"Tree.Item\" && !keys.includes(key);\n }, []),\n onDrop: useCallback((props) => onDrop?.(key, props) ?? [], [key, onDrop]),\n onDragOver: useCallback(() => setDraggingOver(true), []),\n });\n\n const handleDragStart = (): void => {\n const selectedItemKeys = getSelected();\n const selectedItems = getSourceData().filter((item) =>\n selectedItemKeys.includes(item.key),\n );\n if (selectedItemKeys.includes(key)) {\n const selectedHaulItems = selectedItems\n .map(({ key, haulItems }) => [{ type: HAUL_TYPE, key }, ...(haulItems ?? [])])\n .flat();\n return startDrag(selectedHaulItems, (props) => onSuccessfulDrop?.(key, props));\n }\n startDrag([{ type: HAUL_TYPE, key }, ...haulItems], (props) =>\n onSuccessfulDrop?.(key, props),\n );\n };\n\n const offsetKey = useMargin ? \"marginLeft\" : \"paddingLeft\";\n\n const baseProps: Button.LinkProps | Button.ButtonProps = {\n id: key,\n variant: \"text\",\n draggable: true,\n className: CSS(\n CSS.BE(\"list\", \"item\"),\n CONTEXT_TARGET,\n draggingOver && CSS.M(\"dragging-over\"),\n selected && CONTEXT_SELECTED,\n CSS.selected(selected),\n actuallyHasChildren && CSS.M(\"has-children\"),\n ),\n onDragLeave: () => setDraggingOver(false),\n onDragStart: handleDragStart,\n onClick: () => onSelect?.(key),\n style: {\n position: translate != null ? \"absolute\" : \"relative\",\n transform: `translateY(${translate}px)`,\n [offsetKey]: `${depth * 1.5 + 1}rem`,\n },\n startIcon: startIcons,\n iconSpacing: \"small\",\n noWrap: true,\n endIcon: endIcons,\n onDoubleClick: (e) => onDoubleClick?.(key, e),\n href,\n ...dropProps,\n };\n\n const Base = href != null ? Button.Link : Button.Button;\n\n return (\n <Base className={CSS.BE(\"list\", \"item\")} {...baseProps}>\n <Text.MaybeEditable\n id={`text-${key}`}\n level=\"p\"\n allowDoubleClick={false}\n value={name}\n disabled={!allowRename}\n onChange={(name) => onRename?.(key, name)}\n />\n </Base>\n );\n },\n);\nDefaultItem.displayName = \"Tree.Item\";\n\nconst defaultChild = componentRenderProp(DefaultItem);\n\nexport const Tree = ({\n nodes,\n selected = [],\n onSelect,\n onDrop,\n onRename,\n onSuccessfulDrop,\n onDoubleClick,\n className,\n children = defaultChild,\n itemHeight = 27,\n useMargin = false,\n virtual = true,\n ...props\n}: TreeProps): ReactElement => {\n const Core = virtual ? List.Core.Virtual : List.Core;\n\n return (\n <List.List<string, FlattenedNode> data={nodes}>\n <List.Selector value={selected} onChange={onSelect} allowMultiple replaceOnSingle>\n <Core<string, FlattenedNode>\n itemHeight={itemHeight}\n className={CSS(className, CSS.B(\"tree\"))}\n {...props}\n >\n {(props) =>\n children({\n ...props,\n useMargin,\n onDrop,\n onRename,\n onSuccessfulDrop,\n onDoubleClick,\n })\n }\n </Core>\n </List.Selector>\n </List.List>\n );\n};\n\nexport const startRenaming = (key: string): void => Text.edit(`text-${key}`);\n"],"names":["toArray","node","useCombinedStateAndRef","state.usePassthrough","useMemo","useSyncedRef","Triggers.useHeldRef","useCallback","jsx","Icon","CSS","memo","List.useSelectionUtils","List.useDataUtilContext","useState","Haul.useDragAndDrop","key","haulItems","CONTEXT_TARGET","CONTEXT_SELECTED","Button.Link","Button.Button","Text.MaybeEditable","name","componentRenderProp","List.Core","List.List","List.Selector","props","Text.edit"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"external-Df0D1YYb.cjs","sources":["../src/tree/core.ts","../src/tree/Tree.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 { toArray } from \"@synnaxlabs/x\";\n\nimport { type Haul } from \"@/haul\";\n\nexport interface Node {\n key: string;\n name: string;\n renaming?: boolean;\n forcePosition?: number;\n icon?: ReactElement;\n allowRename?: boolean;\n hasChildren?: boolean;\n children?: Node[];\n haulItems?: Haul.Item[];\n canDrop?: (items: Haul.Item[]) => boolean;\n href?: string;\n}\n\nexport interface NodeWithPosition extends Node {\n depth: number;\n position: number;\n}\n\nexport interface FlattenedNode extends Node {\n index: number;\n depth: number;\n expanded: boolean;\n}\n\nexport const shouldExpand = (node: Node, expanded: string[]): boolean =>\n expanded.includes(node.key);\n\nexport interface FlattenProps {\n nodes: Node[];\n expanded: string[];\n depth?: number;\n sort?: boolean;\n}\n\nexport const sortAndSplice = (nodes: Node[], sort: boolean): Node[] => {\n if (sort) {\n nodes.sort((a, b) => a.name.localeCompare(b.name));\n }\n let found = false;\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node.forcePosition != null && i !== node.forcePosition) {\n found = true;\n // remove the node from its current position\n nodes.splice(i, 1);\n // splice it into the forced position\n nodes.splice(node.forcePosition, 0, node);\n }\n }\n if (found) return sortAndSplice(nodes, false);\n return nodes;\n};\n\nexport const flatten = ({\n nodes,\n expanded,\n depth = 0,\n sort = true,\n}: FlattenProps): FlattenedNode[] => {\n // Sort the first level of the tree independently of the rest\n if (depth === 0 && sort) nodes = nodes.sort((a, b) => a.name.localeCompare(b.name));\n const flattened: FlattenedNode[] = [];\n nodes.forEach((node, index) => {\n const expand = shouldExpand(node, expanded);\n flattened.push({ ...node, depth, expanded: expand, index });\n if (expand && node.children != null) {\n node.children = sortAndSplice(node.children, sort);\n flattened.push(\n ...flatten({ nodes: node.children, expanded, depth: depth + 1, sort }),\n );\n }\n });\n return flattened;\n};\n\nexport interface MoveNodeProps {\n tree: Node[];\n destination: string;\n keys: string | string[];\n}\n\nexport const moveNode = ({ tree, destination, keys }: MoveNodeProps): Node[] => {\n keys = toArray(keys);\n keys.forEach((key) => {\n const node = findNode({ tree, key });\n if (node == null) return;\n removeNode({ tree, keys: key });\n setNode({ tree, destination, additions: node });\n });\n return tree;\n};\n\nexport interface RemoveNodeProps {\n tree: Node[];\n keys: string | string[];\n}\n\nexport const removeNode = ({ tree, keys }: RemoveNodeProps): Node[] => {\n keys = toArray(keys);\n const treeKeys = tree.map((node) => node.key);\n keys.forEach((key) => {\n const index = treeKeys.indexOf(key);\n if (index !== -1) tree.splice(index, 1);\n else {\n const parent = findNodeParent({ tree, key });\n if (parent != null)\n parent.children = parent.children?.filter((child) => child.key !== key);\n }\n });\n return tree;\n};\n\nexport interface SetNodeProps {\n tree: Node[];\n destination: string;\n additions: Node | Node[];\n}\n\nexport const setNode = ({ tree, destination, additions }: SetNodeProps): Node[] => {\n additions = toArray(additions);\n const node = findNode({ tree, key: destination });\n if (node == null) throw new Error(`Could not find node with key ${destination}`);\n if (node.children == null) node.children = [];\n const addedKeys = additions.map((node) => node.key);\n node.children = [\n ...additions,\n ...node.children.filter((child) => !addedKeys.includes(child.key)),\n ];\n return tree;\n};\n\nexport interface UpdateNodeProps {\n tree: Node[];\n key: string;\n updater: (node: Node) => Node;\n throwOnMissing?: boolean;\n}\n\nexport const updateNode = ({\n tree,\n key,\n updater,\n throwOnMissing = true,\n}: UpdateNodeProps): Node[] => {\n const node = findNode({ tree, key });\n if (node == null) {\n if (throwOnMissing) throw new Error(`Could not find node with key ${key}`);\n return tree;\n }\n const parent = findNodeParent({ tree, key });\n if (parent != null) {\n // splice the updated node into the parent's children\n const index = parent.children?.findIndex((child) => child.key === key);\n if (index != null && index !== -1) parent.children?.splice(index, 1, updater(node));\n } else {\n // we're in the root, so just update the node\n tree.splice(\n tree.findIndex((node) => node.key === key),\n 1,\n updater(node),\n );\n }\n return tree;\n};\n\nexport interface FindNodeProps {\n tree: Node[];\n key: string;\n depth?: number;\n}\n\nexport const findNode = ({\n tree,\n key,\n depth = 0,\n}: FindNodeProps): NodeWithPosition | null => {\n for (let i = 0; i < tree.length; i++) {\n const node = tree[i];\n if (node.key === key) {\n const n = node as NodeWithPosition;\n n.depth = depth;\n n.position = i;\n return n;\n }\n if (node.children != null) {\n const found = findNode({ tree: node.children, key, depth: depth + 1 });\n if (found != null) return found;\n }\n }\n return null;\n};\n\nexport interface FindNodesProps {\n tree: Node[];\n keys: string[];\n}\n\nexport const findNodes = ({ tree, keys }: FindNodesProps): NodeWithPosition[] => {\n const nodes: NodeWithPosition[] = [];\n for (const key of keys) {\n const node = findNode({ tree, key });\n if (node != null) nodes.push(node);\n }\n return nodes;\n};\n\nexport interface FindNodeParentProps {\n tree: Node[];\n key: string;\n}\n\nexport const findNodeParent = ({ tree, key }: FindNodeParentProps): Node | null => {\n for (const node of tree) {\n if (node.children != null) {\n if (node.children.some((child) => child.key === key)) return node;\n const found = findNodeParent({ tree: node.children, key });\n if (found != null) return found;\n }\n }\n return null;\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 useMemo,\n useState,\n type FC,\n memo,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { Haul } from \"@/haul\";\nimport { useSyncedRef, useCombinedStateAndRef } from \"@/hooks\";\nimport { List } from \"@/list\";\nimport { type UseSelectOnChangeExtra, type UseSelectProps } from \"@/list/useSelect\";\nimport { CONTEXT_SELECTED, CONTEXT_TARGET } from \"@/menu/ContextMenu\";\nimport { state } from \"@/state\";\nimport { Text } from \"@/text\";\nimport { flatten, type Node, type FlattenedNode } from \"@/tree/core\";\nimport { Triggers } from \"@/triggers\";\nimport { type RenderProp, componentRenderProp } from \"@/util/renderProp\";\n\nimport \"@/tree/Tree.css\";\n\nexport const HAUL_TYPE = \"tree-item\";\n\nexport interface HandleExpandProps {\n current: string[];\n action: \"expand\" | \"contract\";\n clicked: string;\n}\n\nexport interface UseProps {\n onExpand?: (props: HandleExpandProps) => void;\n selected?: string[];\n onSelectedChange?: state.Set<string[]>;\n initialExpanded?: string[];\n nodes: Node[];\n sort?: boolean;\n}\n\nexport interface UseReturn {\n selected: string[];\n expanded: string[];\n onSelect: UseSelectProps<string, FlattenedNode>[\"onChange\"];\n nodes: FlattenedNode[];\n}\n\nconst SHIFT_TRIGGERS: Triggers.Trigger[] = [[\"Shift\"]];\n\nexport const use = (props: UseProps): UseReturn => {\n const {\n onExpand,\n nodes,\n initialExpanded = [],\n sort = true,\n selected: propsSelected,\n onSelectedChange,\n } = props ?? {};\n const [expanded, setExpanded, ref] =\n useCombinedStateAndRef<string[]>(initialExpanded);\n const [selected, setSelected] = state.usePassthrough<string[]>({\n initial: [],\n value: propsSelected,\n onChange: onSelectedChange,\n });\n const flat = useMemo(\n () => flatten({ nodes, expanded, sort }),\n [nodes, expanded, sort],\n );\n const flatRef = useSyncedRef(flat);\n\n const shiftRef = Triggers.useHeldRef({ triggers: SHIFT_TRIGGERS });\n\n const handleSelect: UseSelectProps<string, FlattenedNode>[\"onChange\"] = useCallback(\n (\n keys: string[],\n { clicked }: UseSelectOnChangeExtra<string, FlattenedNode>,\n ): void => {\n setSelected(keys);\n const n = flatRef.current.find((node) => node.key === clicked);\n if (n?.hasChildren === false) return;\n if (clicked == null || shiftRef.current.held) return;\n const currentlyExpanded = ref.current;\n const action = currentlyExpanded.some((key) => key === clicked)\n ? \"contract\"\n : \"expand\";\n let nextExpanded = currentlyExpanded;\n if (action === \"contract\")\n nextExpanded = currentlyExpanded.filter((key) => key !== clicked);\n else nextExpanded = [...currentlyExpanded, clicked];\n setExpanded(nextExpanded);\n onExpand?.({ current: nextExpanded, action, clicked });\n },\n [onExpand, flatRef, setExpanded, setSelected],\n );\n\n return {\n onSelect: handleSelect,\n selected,\n expanded,\n nodes: flat,\n };\n};\n\nexport interface ItemProps extends List.ItemProps<string, FlattenedNode> {\n onDrop?: (key: string, props: Haul.OnDropProps) => Haul.Item[];\n onSuccessfulDrop?: (key: string, props: Haul.OnSuccessfulDropProps) => void;\n onRename?: (key: string, name: string) => void;\n onDoubleClick?: (key: string, e: React.MouseEvent) => void;\n loading?: boolean;\n useMargin?: boolean;\n}\n\ntype TreePropsInheritedFromItem = Pick<\n ItemProps,\n \"onDrop\" | \"onRename\" | \"onSuccessfulDrop\" | \"onDoubleClick\" | \"useMargin\"\n>;\n\ntype TreePropsInheritedFromList = Omit<\n List.VirtualCoreProps<string, FlattenedNode>,\n \"onDrop\" | \"onSelect\" | \"children\" | \"onDoubleClick\" | \"itemHeight\"\n> & {\n itemHeight?: number;\n};\n\nexport interface TreeProps\n extends TreePropsInheritedFromItem,\n TreePropsInheritedFromList {\n nodes: FlattenedNode[];\n selected?: string[];\n onSelect: UseSelectProps<string, FlattenedNode>[\"onChange\"];\n children?: RenderProp<ItemProps>;\n virtual?: boolean;\n}\n\nconst expandedCaret = <Icon.Caret.Down className={CSS.B(\"caret\")} />;\nconst collapsedCaret = <Icon.Caret.Right className={CSS.B(\"caret\")} />;\n\nexport type Item = FC<ItemProps>;\n\nexport const DefaultItem = memo(\n ({\n entry,\n selected,\n onSelect,\n onDrop,\n onRename,\n onSuccessfulDrop,\n onDoubleClick,\n loading = false,\n useMargin = false,\n translate,\n }: ItemProps): ReactElement => {\n const {\n key,\n hasChildren = false,\n allowRename = false,\n children,\n icon,\n name,\n depth,\n expanded,\n href,\n haulItems = [],\n } = entry;\n\n const { getSelected } = List.useSelectionUtils<string>();\n const { getSourceData } = List.useDataUtilContext<string, FlattenedNode>();\n\n const actuallyHasChildren =\n hasChildren || (children != null && children.length > 0);\n\n // Expand, contract, and loading items.\n const startIcons: ReactElement[] = [];\n if (actuallyHasChildren) startIcons.push(expanded ? expandedCaret : collapsedCaret);\n if (icon != null) startIcons.push(icon);\n const endIcons: ReactElement[] = [];\n if (loading) endIcons.push(<Icon.Loading className={CSS.B(\"loading-indicator\")} />);\n\n const [draggingOver, setDraggingOver] = useState(false);\n\n // Drag and Drop\n const { startDrag, ...dropProps } = Haul.useDragAndDrop({\n type: \"Tree.Item\",\n key,\n canDrop: useCallback(({ items: entities, source }) => {\n const keys = entities.map((item) => item.key);\n setDraggingOver(false);\n return source.type === \"Tree.Item\" && !keys.includes(key);\n }, []),\n onDrop: useCallback((props) => onDrop?.(key, props) ?? [], [key, onDrop]),\n onDragOver: useCallback(() => setDraggingOver(true), []),\n });\n\n const handleDragStart = (): void => {\n const selectedItemKeys = getSelected();\n const selectedItems = getSourceData().filter((item) =>\n selectedItemKeys.includes(item.key),\n );\n if (selectedItemKeys.includes(key)) {\n const selectedHaulItems = selectedItems\n .map(({ key, haulItems }) => [{ type: HAUL_TYPE, key }, ...(haulItems ?? [])])\n .flat();\n return startDrag(selectedHaulItems, (props) => onSuccessfulDrop?.(key, props));\n }\n startDrag([{ type: HAUL_TYPE, key }, ...haulItems], (props) =>\n onSuccessfulDrop?.(key, props),\n );\n };\n\n const offsetKey = useMargin ? \"marginLeft\" : \"paddingLeft\";\n\n const baseProps: Button.LinkProps | Button.ButtonProps = {\n id: key,\n variant: \"text\",\n draggable: true,\n className: CSS(\n CSS.BE(\"list\", \"item\"),\n CONTEXT_TARGET,\n draggingOver && CSS.M(\"dragging-over\"),\n selected && CONTEXT_SELECTED,\n CSS.selected(selected),\n actuallyHasChildren && CSS.M(\"has-children\"),\n ),\n onDragLeave: () => setDraggingOver(false),\n onDragStart: handleDragStart,\n onClick: () => onSelect?.(key),\n style: {\n position: translate != null ? \"absolute\" : \"relative\",\n transform: `translateY(${translate}px)`,\n [offsetKey]: `${depth * 1.5 + 1}rem`,\n },\n startIcon: startIcons,\n iconSpacing: \"small\",\n noWrap: true,\n endIcon: endIcons,\n onDoubleClick: (e) => onDoubleClick?.(key, e),\n href,\n ...dropProps,\n };\n\n const Base = href != null ? Button.Link : Button.Button;\n\n return (\n <Base className={CSS.BE(\"list\", \"item\")} {...baseProps}>\n <Text.MaybeEditable\n id={`text-${key}`}\n level=\"p\"\n allowDoubleClick={false}\n value={name}\n disabled={!allowRename}\n onChange={(name) => onRename?.(key, name)}\n />\n </Base>\n );\n },\n);\nDefaultItem.displayName = \"Tree.Item\";\n\nconst defaultChild = componentRenderProp(DefaultItem);\n\nexport const Tree = ({\n nodes,\n selected = [],\n onSelect,\n onDrop,\n onRename,\n onSuccessfulDrop,\n onDoubleClick,\n className,\n children = defaultChild,\n itemHeight = 27,\n useMargin = false,\n virtual = true,\n ...props\n}: TreeProps): ReactElement => {\n const Core = virtual ? List.Core.Virtual : List.Core;\n\n return (\n <List.List<string, FlattenedNode> data={nodes}>\n <List.Selector value={selected} onChange={onSelect} allowMultiple replaceOnSingle>\n <Core<string, FlattenedNode>\n itemHeight={itemHeight}\n className={CSS(className, CSS.B(\"tree\"))}\n {...props}\n >\n {(props) =>\n children({\n ...props,\n useMargin,\n onDrop,\n onRename,\n onSuccessfulDrop,\n onDoubleClick,\n })\n }\n </Core>\n </List.Selector>\n </List.List>\n );\n};\n\nexport const startRenaming = (key: string): void => Text.edit(`text-${key}`);\n"],"names":["toArray","node","useCombinedStateAndRef","state.usePassthrough","useMemo","useSyncedRef","Triggers.useHeldRef","useCallback","jsx","Icon","CSS","memo","List.useSelectionUtils","List.useDataUtilContext","useState","Haul.useDragAndDrop","key","haulItems","CONTEXT_TARGET","CONTEXT_SELECTED","Button.Link","Button.Button","Text.MaybeEditable","name","componentRenderProp","List.Core","List.List","List.Selector","props","Text.edit"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const Toggle = require("./Toggle-
|
|
3
|
-
const aggregator = require("./aggregator-
|
|
2
|
+
const Toggle = require("./Toggle-D3iCEbO1.cjs");
|
|
3
|
+
const aggregator = require("./aggregator-Bh2Kyzkg.cjs");
|
|
4
4
|
const external = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
5
5
|
__proto__: null,
|
|
6
6
|
Provider: Toggle.Provider,
|
|
@@ -19,4 +19,4 @@ const external = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProp
|
|
|
19
19
|
useTypography: Toggle.useTypography
|
|
20
20
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
21
21
|
exports.external = external;
|
|
22
|
-
//# sourceMappingURL=external-
|
|
22
|
+
//# sourceMappingURL=external-DhPBdJpR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-DhPBdJpR.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const jsxRuntime = require("./jsx-runtime-B3vWrP5x.cjs");
|
|
3
|
-
const Toggle = require("./Toggle-
|
|
4
|
-
const Link = require("./Link-
|
|
5
|
-
const css = require("./css-
|
|
3
|
+
const Toggle = require("./Toggle-D3iCEbO1.cjs");
|
|
4
|
+
const Link = require("./Link-Bq38h1dw.cjs");
|
|
5
|
+
const css = require("./css-Ci8WUD5E.cjs");
|
|
6
6
|
const React = require("react");
|
|
7
7
|
const MenuContext = React.createContext({
|
|
8
8
|
onClick: () => {
|
|
@@ -74,4 +74,4 @@ const external = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProp
|
|
|
74
74
|
useMenuContext
|
|
75
75
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
76
76
|
exports.external = external;
|
|
77
|
-
//# sourceMappingURL=external-
|
|
77
|
+
//# sourceMappingURL=external-DhiN6pEk.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-
|
|
1
|
+
{"version":3,"file":"external-DhiN6pEk.cjs","sources":["../src/menu/Menu.tsx","../src/menu/Item.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 {\n createContext,\n type PropsWithChildren,\n type ReactElement,\n useContext,\n} from \"react\";\n\nimport { type Input } from \"@/input\";\nimport { type Text } from \"@/text\";\nimport { type ComponentSize } from \"@/util/component\";\n\ninterface MenuContextValue {\n onClick: (key: string) => void;\n selected: string;\n level?: Text.Level;\n iconSpacing?: ComponentSize;\n}\n\nexport const MenuContext = createContext<MenuContextValue>({\n onClick: () => {},\n selected: \"\",\n});\n\nexport interface MenuProps\n extends Partial<Input.Control<string>>,\n PropsWithChildren,\n Pick<MenuContextValue, \"level\" | \"iconSpacing\"> {}\n\nexport const useMenuContext = (): MenuContextValue => useContext(MenuContext);\n\n/**\n * Menu is a modular component that allows you to create a menu with a list of items.\n * It satisfies the InputControl string interface, so it's selected value can be\n * controlled.\n *\n * @param props - Props for the component. All unlisted props will be spread to the\n * underlying Space component acting as the root element.\n * @param props.onChange - Callback executed when the selected item changes.\n * @param props.value - The selected item.\n */\nexport const Menu = ({\n children,\n onChange,\n level,\n iconSpacing,\n value = \"\",\n}: MenuProps): ReactElement => {\n const handleClick: MenuProps[\"onChange\"] = (key) => onChange?.(key);\n return (\n <MenuContext.Provider\n value={{ onClick: handleClick, selected: value, level, iconSpacing }}\n >\n {children}\n </MenuContext.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 FunctionComponent, type ReactElement } from \"react\";\n\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { useMenuContext } from \"@/menu/Menu\";\n\nimport \"@/menu/Item.css\";\n\nconst menuItemFactory =\n <E extends Pick<Button.ButtonProps, \"className\" | \"onClick\" | \"size\">>(\n Base: FunctionComponent<E>,\n defaultProps?: Partial<E>,\n ): FunctionComponent<E & { itemKey: string }> =>\n // eslint-disable-next-line react/display-name\n (props): ReactElement => {\n const { itemKey, className, onClick, size, ...rest } = {\n ...defaultProps,\n ...props,\n };\n\n const { onClick: ctxOnClick, selected, level, iconSpacing } = useMenuContext();\n\n const handleClick: Button.ButtonProps[\"onClick\"] = (e) => {\n ctxOnClick(itemKey);\n onClick?.(e);\n };\n const _selected = selected === itemKey;\n return (\n // @ts-expect-error\n <Base\n level={level}\n {...rest}\n onClick={handleClick}\n variant=\"text\"\n className={CSS(CSS.B(\"menu-item\"), CSS.selected(_selected), className)}\n size={size ?? iconSpacing}\n />\n );\n };\n\nexport interface ItemProps extends Button.ButtonProps {\n itemKey: string;\n}\nexport const CoreItem = menuItemFactory(Button.Button, { noWrap: true });\n\nexport interface ItemIconProps extends Button.IconProps {\n itemKey: string;\n}\nconst ItemIcon = menuItemFactory(Button.Icon);\n\nconst ItemLink = menuItemFactory(Button.Link, { noWrap: true });\nexport interface MenuItemLinkProps extends Button.LinkProps {\n itemKey: string;\n}\n\ntype CoreItemType = typeof CoreItem;\n\nexport interface ItemType extends CoreItemType {\n Icon: typeof ItemIcon;\n Link: typeof ItemLink;\n}\n\n/**\n * Menu.Item renders a menu item.\n *\n * @param props - Props for the component. Identical props to those of Use except\n * for the ones listed below.\n * @param props.itemKey - The key of the item. This is used to identify the item and\n * is passed to the onChange callback of the Menu.\n */\nexport const Item = CoreItem as ItemType;\nItem.Icon = ItemIcon;\nItem.Link = ItemLink;\n"],"names":["createContext","useContext","jsx","CSS","Button.Button","Button.Icon","Button.Link"],"mappings":";;;;;;AA2BO,MAAM,cAAcA,MAAAA,cAAgC;AAAA,EACzD,SAAS,MAAM;AAAA,EAAC;AAAA,EAChB,UAAU;AACZ,CAAC;AAOY,MAAA,iBAAiB,MAAwBC,iBAAW,WAAW;AAYrE,MAAM,OAAO,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AACV,MAA+B;AAC7B,QAAM,cAAqC,CAAC,QAAQ,qCAAW;AAE7D,SAAAC,2BAAA,kBAAA;AAAA,IAAC,YAAY;AAAA,IAAZ;AAAA,MACC,OAAO,EAAE,SAAS,aAAa,UAAU,OAAO,OAAO,YAAY;AAAA,MAElE;AAAA,IAAA;AAAA,EAAA;AAGP;AC/CA,MAAM,kBACJ,CACE,MACA;AAAA;AAAA,EAGF,CAAC,UAAwB;AACvB,UAAM,EAAE,SAAS,WAAW,SAAS,MAAM,GAAG,SAAS;AAAA,MACrD,GAAG;AAAA,MACH,GAAG;AAAA,IAAA;AAGL,UAAM,EAAE,SAAS,YAAY,UAAU,OAAO,YAAA,IAAgB;AAExD,UAAA,cAA6C,CAAC,MAAM;AACxD,iBAAW,OAAO;AAClB,yCAAU;AAAA,IAAC;AAEb,UAAM,YAAY,aAAa;AAC/B;AAAA;AAAA,MAEEA,2BAAA,kBAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACC,GAAG;AAAA,UACJ,SAAS;AAAA,UACT,SAAQ;AAAA,UACR,WAAWC,IAAAA,IAAIA,IAAA,IAAI,EAAE,WAAW,GAAGA,IAAAA,IAAI,SAAS,SAAS,GAAG,SAAS;AAAA,UACrE,MAAM,QAAQ;AAAA,QAAA;AAAA,MAChB;AAAA;AAAA,EAEJ;AAAA;AAKK,MAAM,WAAW,gBAAgBC,eAAe,EAAE,QAAQ,KAAM,CAAA;AAKvE,MAAM,WAAW,gBAAgBC,OAAAA,IAAW;AAE5C,MAAM,WAAW,gBAAgBC,WAAa,EAAE,QAAQ,KAAM,CAAA;AAoBvD,MAAM,OAAO;AACpB,KAAK,OAAO;AACZ,KAAK,OAAO;;;;;;;;;;;;;;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const Toggle = require("./Toggle-
|
|
3
|
-
const aggregator = require("./aggregator-
|
|
4
|
-
const Keyboard = require("./Keyboard-
|
|
2
|
+
const Toggle = require("./Toggle-D3iCEbO1.cjs");
|
|
3
|
+
const aggregator = require("./aggregator-Bh2Kyzkg.cjs");
|
|
4
|
+
const Keyboard = require("./Keyboard-Byx8rGZt.cjs");
|
|
5
5
|
const jsxRuntime = require("./jsx-runtime-B3vWrP5x.cjs");
|
|
6
6
|
const React = require("react");
|
|
7
|
-
const Center = require("./Center-
|
|
8
|
-
const css = require("./css-
|
|
9
|
-
const List = require("./List-
|
|
7
|
+
const Center = require("./Center-Cc_rR5pQ.cjs");
|
|
8
|
+
const css = require("./css-Ci8WUD5E.cjs");
|
|
9
|
+
const List = require("./List-BnB-C5vQ.cjs");
|
|
10
10
|
const DEFAULT_COLUMNS = [];
|
|
11
11
|
const Core = ({
|
|
12
12
|
data,
|
|
@@ -216,4 +216,4 @@ exports.DropdownButton = DropdownButton;
|
|
|
216
216
|
exports.SelectLevel = SelectLevel;
|
|
217
217
|
exports.defaultButton = defaultButton;
|
|
218
218
|
exports.external = external;
|
|
219
|
-
//# sourceMappingURL=external-
|
|
219
|
+
//# sourceMappingURL=external-DjYXzP7v.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-CsO29OsF.cjs","sources":["../src/select/List.tsx","../src/select/Button.tsx","../src/text/SelectLevel.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 PropsWithChildren, type ReactElement } from \"react\";\n\nimport { type Key, type Keyed } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { List as CoreList } from \"@/list\";\nimport { componentRenderProp } from \"@/util/renderProp\";\n\nexport interface SelectListProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends CoreList.SelectorProps<K, E>,\n Pick<Partial<CoreList.ColumnHeaderProps<K, E>>, \"columns\">,\n Omit<Dropdown.DialogProps, \"onChange\" | \"children\">,\n PropsWithChildren<{}> {\n data?: E[];\n emptyContent?: ReactElement;\n hideColumnHeader?: boolean;\n omit?: K[];\n}\n\nconst DEFAULT_COLUMNS: CoreList.ColumnSpec[] = [];\n\nexport const Core = <K extends Key, E extends Keyed<K>>({\n data,\n emptyContent,\n value,\n onChange,\n allowMultiple,\n allowNone,\n hideColumnHeader = false,\n children,\n columns = DEFAULT_COLUMNS,\n visible,\n replaceOnSingle,\n omit,\n ...props\n}: SelectListProps<K, E>): ReactElement => (\n <CoreList.List data={data} emptyContent={emptyContent} omit={omit}>\n <CoreList.Selector\n value={value}\n onChange={onChange}\n allowMultiple={allowMultiple}\n allowNone={allowNone}\n replaceOnSingle={replaceOnSingle}\n >\n <Dropdown.Dialog visible={visible} className={CSS.B(\"select\")} {...props}>\n {children}\n <CoreList.Hover disabled={!visible}>\n <CoreList.Column.Header hide={hideColumnHeader} columns={columns}>\n <CoreList.Core.Virtual itemHeight={CoreList.Column.itemHeight}>\n {componentRenderProp(CoreList.Column.Item)}\n </CoreList.Core.Virtual>\n </CoreList.Column.Header>\n </CoreList.Hover>\n </Dropdown.Dialog>\n </CoreList.Selector>\n </CoreList.List>\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 useCallback,\n type ReactElement,\n useState,\n useEffect,\n type ReactNode,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { type Keyed, type Key } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Button as CoreButton } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { type Input } from \"@/input\";\nimport { type List as CoreList } from \"@/list\";\nimport {\n type UseSelectProps,\n useSelect,\n type UseSelectOnChangeExtra,\n} from \"@/list/useSelect\";\nimport { Core } from \"@/select/List\";\nimport { componentRenderProp, type RenderProp } from \"@/util/renderProp\";\n\nimport \"@/select/Button.css\";\n\nexport interface ButtonOptionProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends Pick<CoreButton.ButtonProps, \"onClick\"> {\n key: K;\n selected: boolean;\n entry: E;\n title: E[keyof E];\n}\n\nexport type ButtonProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>> = Omit<\n UseSelectProps<K, E>,\n \"data\"\n> &\n Omit<Align.PackProps, \"children\" | \"onChange\"> & {\n data: E[];\n children?: RenderProp<ButtonOptionProps<K, E>>;\n entryRenderKey?: keyof E;\n };\n\nexport const Button = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n children = defaultSelectButtonOption,\n value,\n onChange,\n entryRenderKey = \"key\",\n allowNone = false,\n allowMultiple = false,\n data,\n replaceOnSingle,\n ...props\n}: ButtonProps<K, E>): JSX.Element => {\n const { onSelect } = useSelect<K, E>({\n allowMultiple,\n allowNone,\n replaceOnSingle,\n data,\n value,\n onChange,\n } as const as UseSelectProps<K, E>);\n\n return (\n <Align.Pack {...props}>\n {data.map((e) => {\n return children({\n key: e.key,\n onClick: () => onSelect(e.key),\n selected: e.key === value,\n entry: e,\n title: e[entryRenderKey],\n });\n })}\n </Align.Pack>\n );\n};\n\nconst defaultSelectButtonOption = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n onClick,\n selected,\n title,\n}: ButtonOptionProps<K, E>): JSX.Element => (\n <CoreButton.Button onClick={onClick} variant={selected ? \"filled\" : \"outlined\"}>\n {title as ReactNode}\n </CoreButton.Button>\n);\n\nexport interface DropdownButtonButtonProps<K extends Key, E extends Keyed<K>>\n extends CoreButton.ButtonProps {\n selected: E | null;\n renderKey: keyof E;\n toggle: () => void;\n visible: boolean;\n}\n\nexport interface DropdownButtonProps<K extends Key, E extends Keyed<K>>\n extends Omit<Dropdown.DialogProps, \"onChange\" | \"visible\" | \"children\" | \"close\">,\n Input.Control<K>,\n Omit<CoreList.ListProps<K, E>, \"children\">,\n Pick<CoreButton.ButtonProps, \"disabled\"> {\n columns?: Array<CoreList.ColumnSpec<K, E>>;\n children?: RenderProp<DropdownButtonButtonProps<K, E>>;\n entryRenderKey?: keyof E;\n allowNone?: boolean;\n hideColumnHeader?: boolean;\n disabled?: boolean;\n omit?: K[];\n}\n\nexport const BaseButton = ({\n selected,\n renderKey,\n toggle,\n visible,\n children,\n ...props\n}: DropdownButtonButtonProps<any, any>): ReactElement => (\n <CoreButton.Button\n className={CSS.B(\"select-button\")}\n onClick={toggle}\n variant=\"outlined\"\n endIcon={<Icon.Caret.Left className={CSS.BE(\"select-button\", \"indicator\")} />}\n {...props}\n >\n {children ?? selected?.[renderKey]}\n </CoreButton.Button>\n);\n\nexport const defaultButton: RenderProp<DropdownButtonButtonProps<any, any>> =\n componentRenderProp(BaseButton);\n\nexport const DropdownButton = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n data,\n value,\n columns = [],\n children = defaultButton,\n entryRenderKey = \"key\",\n allowNone = false,\n onChange,\n disabled,\n hideColumnHeader = true,\n ...props\n}: DropdownButtonProps<K, E>): ReactElement => {\n const { close, visible, toggle } = Dropdown.use();\n const [selected, setSelected] = useState<E | null>(\n data?.find((e) => e.key === value) ?? null,\n );\n\n useEffect(() => {\n setSelected(data?.find((e) => e.key === value) ?? null);\n }, [data, value]);\n\n const handleChange: UseSelectProps<K, E>[\"onChange\"] = useCallback(\n (next: K, e: UseSelectOnChangeExtra<K, E>): void => {\n close();\n if (next == null) {\n setSelected(null);\n return onChange(value);\n }\n setSelected(e.entries[0]);\n onChange(next);\n },\n [onChange, value, close, setSelected],\n );\n\n return (\n <Core<K, E>\n {...props}\n close={close}\n data={data}\n visible={visible}\n value={[value]}\n onChange={handleChange}\n allowMultiple={false}\n allowNone={allowNone}\n columns={columns}\n hideColumnHeader={hideColumnHeader}\n >\n {children({\n selected,\n renderKey: entryRenderKey,\n toggle,\n visible,\n disabled,\n })}\n </Core>\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 { Button as CoreButton } from \"@/button\";\nimport { Button, type ButtonOptionProps, type ButtonProps } from \"@/select/Button\";\nimport { type text } from \"@/text/core\";\n\ninterface Entry {\n key: text.Level;\n label: string;\n}\n\nexport interface SelectLevelProps\n extends Omit<ButtonProps<text.Level, Entry>, \"data\" | \"entryRenderKey\"> {}\n\nconst DATA: Entry[] = [\n {\n key: \"h2\",\n label: \"XL\",\n },\n {\n key: \"h3\",\n label: \"L\",\n },\n {\n key: \"h4\",\n label: \"M\",\n },\n {\n key: \"p\",\n label: \"S\",\n },\n {\n key: \"small\",\n label: \"XS\",\n },\n];\n\nconst defaultSelectDirectionButton = ({\n key,\n entry,\n onClick,\n selected,\n}: ButtonOptionProps<text.Level, Entry>): ReactElement => {\n return (\n <CoreButton.Button\n key={key}\n variant={selected ? \"filled\" : \"outlined\"}\n onClick={onClick}\n >\n {entry.label}\n </CoreButton.Button>\n );\n};\n\nexport const SelectLevel = ({\n children = defaultSelectDirectionButton,\n ...props\n}: SelectLevelProps): ReactElement => {\n return (\n <Button {...props} data={DATA}>\n {children}\n </Button>\n );\n};\n"],"names":["CoreList.List","jsx","CoreList.Selector","jsxs","Dropdown.Dialog","CSS","CoreList.Hover","CoreList.Column","CoreList.Core","componentRenderProp","useSelect","Align.Pack","CoreButton.Button","Icon","Dropdown.use","useState","useEffect","useCallback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"external-DjYXzP7v.cjs","sources":["../src/select/List.tsx","../src/select/Button.tsx","../src/text/SelectLevel.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 PropsWithChildren, type ReactElement } from \"react\";\n\nimport { type Key, type Keyed } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { List as CoreList } from \"@/list\";\nimport { componentRenderProp } from \"@/util/renderProp\";\n\nexport interface SelectListProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends CoreList.SelectorProps<K, E>,\n Pick<Partial<CoreList.ColumnHeaderProps<K, E>>, \"columns\">,\n Omit<Dropdown.DialogProps, \"onChange\" | \"children\">,\n PropsWithChildren<{}> {\n data?: E[];\n emptyContent?: ReactElement;\n hideColumnHeader?: boolean;\n omit?: K[];\n}\n\nconst DEFAULT_COLUMNS: CoreList.ColumnSpec[] = [];\n\nexport const Core = <K extends Key, E extends Keyed<K>>({\n data,\n emptyContent,\n value,\n onChange,\n allowMultiple,\n allowNone,\n hideColumnHeader = false,\n children,\n columns = DEFAULT_COLUMNS,\n visible,\n replaceOnSingle,\n omit,\n ...props\n}: SelectListProps<K, E>): ReactElement => (\n <CoreList.List data={data} emptyContent={emptyContent} omit={omit}>\n <CoreList.Selector\n value={value}\n onChange={onChange}\n allowMultiple={allowMultiple}\n allowNone={allowNone}\n replaceOnSingle={replaceOnSingle}\n >\n <Dropdown.Dialog visible={visible} className={CSS.B(\"select\")} {...props}>\n {children}\n <CoreList.Hover disabled={!visible}>\n <CoreList.Column.Header hide={hideColumnHeader} columns={columns}>\n <CoreList.Core.Virtual itemHeight={CoreList.Column.itemHeight}>\n {componentRenderProp(CoreList.Column.Item)}\n </CoreList.Core.Virtual>\n </CoreList.Column.Header>\n </CoreList.Hover>\n </Dropdown.Dialog>\n </CoreList.Selector>\n </CoreList.List>\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 useCallback,\n type ReactElement,\n useState,\n useEffect,\n type ReactNode,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { type Keyed, type Key } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Button as CoreButton } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { type Input } from \"@/input\";\nimport { type List as CoreList } from \"@/list\";\nimport {\n type UseSelectProps,\n useSelect,\n type UseSelectOnChangeExtra,\n} from \"@/list/useSelect\";\nimport { Core } from \"@/select/List\";\nimport { componentRenderProp, type RenderProp } from \"@/util/renderProp\";\n\nimport \"@/select/Button.css\";\n\nexport interface ButtonOptionProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends Pick<CoreButton.ButtonProps, \"onClick\"> {\n key: K;\n selected: boolean;\n entry: E;\n title: E[keyof E];\n}\n\nexport type ButtonProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>> = Omit<\n UseSelectProps<K, E>,\n \"data\"\n> &\n Omit<Align.PackProps, \"children\" | \"onChange\"> & {\n data: E[];\n children?: RenderProp<ButtonOptionProps<K, E>>;\n entryRenderKey?: keyof E;\n };\n\nexport const Button = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n children = defaultSelectButtonOption,\n value,\n onChange,\n entryRenderKey = \"key\",\n allowNone = false,\n allowMultiple = false,\n data,\n replaceOnSingle,\n ...props\n}: ButtonProps<K, E>): JSX.Element => {\n const { onSelect } = useSelect<K, E>({\n allowMultiple,\n allowNone,\n replaceOnSingle,\n data,\n value,\n onChange,\n } as const as UseSelectProps<K, E>);\n\n return (\n <Align.Pack {...props}>\n {data.map((e) => {\n return children({\n key: e.key,\n onClick: () => onSelect(e.key),\n selected: e.key === value,\n entry: e,\n title: e[entryRenderKey],\n });\n })}\n </Align.Pack>\n );\n};\n\nconst defaultSelectButtonOption = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n onClick,\n selected,\n title,\n}: ButtonOptionProps<K, E>): JSX.Element => (\n <CoreButton.Button onClick={onClick} variant={selected ? \"filled\" : \"outlined\"}>\n {title as ReactNode}\n </CoreButton.Button>\n);\n\nexport interface DropdownButtonButtonProps<K extends Key, E extends Keyed<K>>\n extends CoreButton.ButtonProps {\n selected: E | null;\n renderKey: keyof E;\n toggle: () => void;\n visible: boolean;\n}\n\nexport interface DropdownButtonProps<K extends Key, E extends Keyed<K>>\n extends Omit<Dropdown.DialogProps, \"onChange\" | \"visible\" | \"children\" | \"close\">,\n Input.Control<K>,\n Omit<CoreList.ListProps<K, E>, \"children\">,\n Pick<CoreButton.ButtonProps, \"disabled\"> {\n columns?: Array<CoreList.ColumnSpec<K, E>>;\n children?: RenderProp<DropdownButtonButtonProps<K, E>>;\n entryRenderKey?: keyof E;\n allowNone?: boolean;\n hideColumnHeader?: boolean;\n disabled?: boolean;\n omit?: K[];\n}\n\nexport const BaseButton = ({\n selected,\n renderKey,\n toggle,\n visible,\n children,\n ...props\n}: DropdownButtonButtonProps<any, any>): ReactElement => (\n <CoreButton.Button\n className={CSS.B(\"select-button\")}\n onClick={toggle}\n variant=\"outlined\"\n endIcon={<Icon.Caret.Left className={CSS.BE(\"select-button\", \"indicator\")} />}\n {...props}\n >\n {children ?? selected?.[renderKey]}\n </CoreButton.Button>\n);\n\nexport const defaultButton: RenderProp<DropdownButtonButtonProps<any, any>> =\n componentRenderProp(BaseButton);\n\nexport const DropdownButton = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n data,\n value,\n columns = [],\n children = defaultButton,\n entryRenderKey = \"key\",\n allowNone = false,\n onChange,\n disabled,\n hideColumnHeader = true,\n ...props\n}: DropdownButtonProps<K, E>): ReactElement => {\n const { close, visible, toggle } = Dropdown.use();\n const [selected, setSelected] = useState<E | null>(\n data?.find((e) => e.key === value) ?? null,\n );\n\n useEffect(() => {\n setSelected(data?.find((e) => e.key === value) ?? null);\n }, [data, value]);\n\n const handleChange: UseSelectProps<K, E>[\"onChange\"] = useCallback(\n (next: K, e: UseSelectOnChangeExtra<K, E>): void => {\n close();\n if (next == null) {\n setSelected(null);\n return onChange(value);\n }\n setSelected(e.entries[0]);\n onChange(next);\n },\n [onChange, value, close, setSelected],\n );\n\n return (\n <Core<K, E>\n {...props}\n close={close}\n data={data}\n visible={visible}\n value={[value]}\n onChange={handleChange}\n allowMultiple={false}\n allowNone={allowNone}\n columns={columns}\n hideColumnHeader={hideColumnHeader}\n >\n {children({\n selected,\n renderKey: entryRenderKey,\n toggle,\n visible,\n disabled,\n })}\n </Core>\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 { Button as CoreButton } from \"@/button\";\nimport { Button, type ButtonOptionProps, type ButtonProps } from \"@/select/Button\";\nimport { type text } from \"@/text/core\";\n\ninterface Entry {\n key: text.Level;\n label: string;\n}\n\nexport interface SelectLevelProps\n extends Omit<ButtonProps<text.Level, Entry>, \"data\" | \"entryRenderKey\"> {}\n\nconst DATA: Entry[] = [\n {\n key: \"h2\",\n label: \"XL\",\n },\n {\n key: \"h3\",\n label: \"L\",\n },\n {\n key: \"h4\",\n label: \"M\",\n },\n {\n key: \"p\",\n label: \"S\",\n },\n {\n key: \"small\",\n label: \"XS\",\n },\n];\n\nconst defaultSelectDirectionButton = ({\n key,\n entry,\n onClick,\n selected,\n}: ButtonOptionProps<text.Level, Entry>): ReactElement => {\n return (\n <CoreButton.Button\n key={key}\n variant={selected ? \"filled\" : \"outlined\"}\n onClick={onClick}\n >\n {entry.label}\n </CoreButton.Button>\n );\n};\n\nexport const SelectLevel = ({\n children = defaultSelectDirectionButton,\n ...props\n}: SelectLevelProps): ReactElement => {\n return (\n <Button {...props} data={DATA}>\n {children}\n </Button>\n );\n};\n"],"names":["CoreList.List","jsx","CoreList.Selector","jsxs","Dropdown.Dialog","CSS","CoreList.Hover","CoreList.Column","CoreList.Core","componentRenderProp","useSelect","Align.Pack","CoreButton.Button","Icon","Dropdown.use","useState","useEffect","useCallback"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { A as Selector, n as Dialog, H as Hover, J as Column, z as Core$1, G as componentRenderProp, K as useSelect, B as Button$1, p as m0, j as use, L as CoreDateTime, N as DateTime, E as Editable, O as Link, M as MaybeEditable, Q as Symbols, e as Text, W as WithIcon, F as edit, R as evalColor, U as formatChildren } from "./Toggle-
|
|
2
|
-
import { C as ComponentSizeLevels, L as LEVELS, j as LevelComponentSizes, k as dimensions, l as levelZ, s as specZ } from "./aggregator-
|
|
3
|
-
import { K as Keyboard } from "./Keyboard-
|
|
1
|
+
import { A as Selector, n as Dialog, H as Hover, J as Column, z as Core$1, G as componentRenderProp, K as useSelect, B as Button$1, p as m0, j as use, L as CoreDateTime, N as DateTime, E as Editable, O as Link, M as MaybeEditable, Q as Symbols, e as Text, W as WithIcon, F as edit, R as evalColor, U as formatChildren } from "./Toggle-bT5RpwfA.js";
|
|
2
|
+
import { C as ComponentSizeLevels, L as LEVELS, j as LevelComponentSizes, k as dimensions, l as levelZ, s as specZ } from "./aggregator-B8fg7W2s.js";
|
|
3
|
+
import { K as Keyboard } from "./Keyboard-D31SwhYT.js";
|
|
4
4
|
import { j as jsxRuntimeExports } from "./jsx-runtime-mMz73N64.js";
|
|
5
5
|
import { useState, useEffect, useCallback } from "react";
|
|
6
|
-
import { P as Pack } from "./Center-
|
|
7
|
-
import { C as CSS } from "./css-
|
|
8
|
-
import { L as List } from "./List-
|
|
6
|
+
import { P as Pack } from "./Center-BK9Rcaa0.js";
|
|
7
|
+
import { C as CSS } from "./css-DKKmdhSr.js";
|
|
8
|
+
import { L as List } from "./List-BmP_se57.js";
|
|
9
9
|
const DEFAULT_COLUMNS = [];
|
|
10
10
|
const Core = ({
|
|
11
11
|
data,
|
|
@@ -217,4 +217,4 @@ export {
|
|
|
217
217
|
defaultButton as d,
|
|
218
218
|
external as e
|
|
219
219
|
};
|
|
220
|
-
//# sourceMappingURL=external-
|
|
220
|
+
//# sourceMappingURL=external-FWIwgLzc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-B3ly2-jy.js","sources":["../src/select/List.tsx","../src/select/Button.tsx","../src/text/SelectLevel.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 PropsWithChildren, type ReactElement } from \"react\";\n\nimport { type Key, type Keyed } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { List as CoreList } from \"@/list\";\nimport { componentRenderProp } from \"@/util/renderProp\";\n\nexport interface SelectListProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends CoreList.SelectorProps<K, E>,\n Pick<Partial<CoreList.ColumnHeaderProps<K, E>>, \"columns\">,\n Omit<Dropdown.DialogProps, \"onChange\" | \"children\">,\n PropsWithChildren<{}> {\n data?: E[];\n emptyContent?: ReactElement;\n hideColumnHeader?: boolean;\n omit?: K[];\n}\n\nconst DEFAULT_COLUMNS: CoreList.ColumnSpec[] = [];\n\nexport const Core = <K extends Key, E extends Keyed<K>>({\n data,\n emptyContent,\n value,\n onChange,\n allowMultiple,\n allowNone,\n hideColumnHeader = false,\n children,\n columns = DEFAULT_COLUMNS,\n visible,\n replaceOnSingle,\n omit,\n ...props\n}: SelectListProps<K, E>): ReactElement => (\n <CoreList.List data={data} emptyContent={emptyContent} omit={omit}>\n <CoreList.Selector\n value={value}\n onChange={onChange}\n allowMultiple={allowMultiple}\n allowNone={allowNone}\n replaceOnSingle={replaceOnSingle}\n >\n <Dropdown.Dialog visible={visible} className={CSS.B(\"select\")} {...props}>\n {children}\n <CoreList.Hover disabled={!visible}>\n <CoreList.Column.Header hide={hideColumnHeader} columns={columns}>\n <CoreList.Core.Virtual itemHeight={CoreList.Column.itemHeight}>\n {componentRenderProp(CoreList.Column.Item)}\n </CoreList.Core.Virtual>\n </CoreList.Column.Header>\n </CoreList.Hover>\n </Dropdown.Dialog>\n </CoreList.Selector>\n </CoreList.List>\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 useCallback,\n type ReactElement,\n useState,\n useEffect,\n type ReactNode,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { type Keyed, type Key } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Button as CoreButton } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { type Input } from \"@/input\";\nimport { type List as CoreList } from \"@/list\";\nimport {\n type UseSelectProps,\n useSelect,\n type UseSelectOnChangeExtra,\n} from \"@/list/useSelect\";\nimport { Core } from \"@/select/List\";\nimport { componentRenderProp, type RenderProp } from \"@/util/renderProp\";\n\nimport \"@/select/Button.css\";\n\nexport interface ButtonOptionProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends Pick<CoreButton.ButtonProps, \"onClick\"> {\n key: K;\n selected: boolean;\n entry: E;\n title: E[keyof E];\n}\n\nexport type ButtonProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>> = Omit<\n UseSelectProps<K, E>,\n \"data\"\n> &\n Omit<Align.PackProps, \"children\" | \"onChange\"> & {\n data: E[];\n children?: RenderProp<ButtonOptionProps<K, E>>;\n entryRenderKey?: keyof E;\n };\n\nexport const Button = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n children = defaultSelectButtonOption,\n value,\n onChange,\n entryRenderKey = \"key\",\n allowNone = false,\n allowMultiple = false,\n data,\n replaceOnSingle,\n ...props\n}: ButtonProps<K, E>): JSX.Element => {\n const { onSelect } = useSelect<K, E>({\n allowMultiple,\n allowNone,\n replaceOnSingle,\n data,\n value,\n onChange,\n } as const as UseSelectProps<K, E>);\n\n return (\n <Align.Pack {...props}>\n {data.map((e) => {\n return children({\n key: e.key,\n onClick: () => onSelect(e.key),\n selected: e.key === value,\n entry: e,\n title: e[entryRenderKey],\n });\n })}\n </Align.Pack>\n );\n};\n\nconst defaultSelectButtonOption = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n onClick,\n selected,\n title,\n}: ButtonOptionProps<K, E>): JSX.Element => (\n <CoreButton.Button onClick={onClick} variant={selected ? \"filled\" : \"outlined\"}>\n {title as ReactNode}\n </CoreButton.Button>\n);\n\nexport interface DropdownButtonButtonProps<K extends Key, E extends Keyed<K>>\n extends CoreButton.ButtonProps {\n selected: E | null;\n renderKey: keyof E;\n toggle: () => void;\n visible: boolean;\n}\n\nexport interface DropdownButtonProps<K extends Key, E extends Keyed<K>>\n extends Omit<Dropdown.DialogProps, \"onChange\" | \"visible\" | \"children\" | \"close\">,\n Input.Control<K>,\n Omit<CoreList.ListProps<K, E>, \"children\">,\n Pick<CoreButton.ButtonProps, \"disabled\"> {\n columns?: Array<CoreList.ColumnSpec<K, E>>;\n children?: RenderProp<DropdownButtonButtonProps<K, E>>;\n entryRenderKey?: keyof E;\n allowNone?: boolean;\n hideColumnHeader?: boolean;\n disabled?: boolean;\n omit?: K[];\n}\n\nexport const BaseButton = ({\n selected,\n renderKey,\n toggle,\n visible,\n children,\n ...props\n}: DropdownButtonButtonProps<any, any>): ReactElement => (\n <CoreButton.Button\n className={CSS.B(\"select-button\")}\n onClick={toggle}\n variant=\"outlined\"\n endIcon={<Icon.Caret.Left className={CSS.BE(\"select-button\", \"indicator\")} />}\n {...props}\n >\n {children ?? selected?.[renderKey]}\n </CoreButton.Button>\n);\n\nexport const defaultButton: RenderProp<DropdownButtonButtonProps<any, any>> =\n componentRenderProp(BaseButton);\n\nexport const DropdownButton = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n data,\n value,\n columns = [],\n children = defaultButton,\n entryRenderKey = \"key\",\n allowNone = false,\n onChange,\n disabled,\n hideColumnHeader = true,\n ...props\n}: DropdownButtonProps<K, E>): ReactElement => {\n const { close, visible, toggle } = Dropdown.use();\n const [selected, setSelected] = useState<E | null>(\n data?.find((e) => e.key === value) ?? null,\n );\n\n useEffect(() => {\n setSelected(data?.find((e) => e.key === value) ?? null);\n }, [data, value]);\n\n const handleChange: UseSelectProps<K, E>[\"onChange\"] = useCallback(\n (next: K, e: UseSelectOnChangeExtra<K, E>): void => {\n close();\n if (next == null) {\n setSelected(null);\n return onChange(value);\n }\n setSelected(e.entries[0]);\n onChange(next);\n },\n [onChange, value, close, setSelected],\n );\n\n return (\n <Core<K, E>\n {...props}\n close={close}\n data={data}\n visible={visible}\n value={[value]}\n onChange={handleChange}\n allowMultiple={false}\n allowNone={allowNone}\n columns={columns}\n hideColumnHeader={hideColumnHeader}\n >\n {children({\n selected,\n renderKey: entryRenderKey,\n toggle,\n visible,\n disabled,\n })}\n </Core>\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 { Button as CoreButton } from \"@/button\";\nimport { Button, type ButtonOptionProps, type ButtonProps } from \"@/select/Button\";\nimport { type text } from \"@/text/core\";\n\ninterface Entry {\n key: text.Level;\n label: string;\n}\n\nexport interface SelectLevelProps\n extends Omit<ButtonProps<text.Level, Entry>, \"data\" | \"entryRenderKey\"> {}\n\nconst DATA: Entry[] = [\n {\n key: \"h2\",\n label: \"XL\",\n },\n {\n key: \"h3\",\n label: \"L\",\n },\n {\n key: \"h4\",\n label: \"M\",\n },\n {\n key: \"p\",\n label: \"S\",\n },\n {\n key: \"small\",\n label: \"XS\",\n },\n];\n\nconst defaultSelectDirectionButton = ({\n key,\n entry,\n onClick,\n selected,\n}: ButtonOptionProps<text.Level, Entry>): ReactElement => {\n return (\n <CoreButton.Button\n key={key}\n variant={selected ? \"filled\" : \"outlined\"}\n onClick={onClick}\n >\n {entry.label}\n </CoreButton.Button>\n );\n};\n\nexport const SelectLevel = ({\n children = defaultSelectDirectionButton,\n ...props\n}: SelectLevelProps): ReactElement => {\n return (\n <Button {...props} data={DATA}>\n {children}\n </Button>\n );\n};\n"],"names":["CoreList.List","jsx","CoreList.Selector","jsxs","Dropdown.Dialog","CoreList.Hover","CoreList.Column","CoreList.Core","Align.Pack","CoreButton.Button","Icon","Dropdown.use"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"external-FWIwgLzc.js","sources":["../src/select/List.tsx","../src/select/Button.tsx","../src/text/SelectLevel.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 PropsWithChildren, type ReactElement } from \"react\";\n\nimport { type Key, type Keyed } from \"@synnaxlabs/x\";\n\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { List as CoreList } from \"@/list\";\nimport { componentRenderProp } from \"@/util/renderProp\";\n\nexport interface SelectListProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends CoreList.SelectorProps<K, E>,\n Pick<Partial<CoreList.ColumnHeaderProps<K, E>>, \"columns\">,\n Omit<Dropdown.DialogProps, \"onChange\" | \"children\">,\n PropsWithChildren<{}> {\n data?: E[];\n emptyContent?: ReactElement;\n hideColumnHeader?: boolean;\n omit?: K[];\n}\n\nconst DEFAULT_COLUMNS: CoreList.ColumnSpec[] = [];\n\nexport const Core = <K extends Key, E extends Keyed<K>>({\n data,\n emptyContent,\n value,\n onChange,\n allowMultiple,\n allowNone,\n hideColumnHeader = false,\n children,\n columns = DEFAULT_COLUMNS,\n visible,\n replaceOnSingle,\n omit,\n ...props\n}: SelectListProps<K, E>): ReactElement => (\n <CoreList.List data={data} emptyContent={emptyContent} omit={omit}>\n <CoreList.Selector\n value={value}\n onChange={onChange}\n allowMultiple={allowMultiple}\n allowNone={allowNone}\n replaceOnSingle={replaceOnSingle}\n >\n <Dropdown.Dialog visible={visible} className={CSS.B(\"select\")} {...props}>\n {children}\n <CoreList.Hover disabled={!visible}>\n <CoreList.Column.Header hide={hideColumnHeader} columns={columns}>\n <CoreList.Core.Virtual itemHeight={CoreList.Column.itemHeight}>\n {componentRenderProp(CoreList.Column.Item)}\n </CoreList.Core.Virtual>\n </CoreList.Column.Header>\n </CoreList.Hover>\n </Dropdown.Dialog>\n </CoreList.Selector>\n </CoreList.List>\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 useCallback,\n type ReactElement,\n useState,\n useEffect,\n type ReactNode,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\nimport { type Keyed, type Key } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { Button as CoreButton } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { type Input } from \"@/input\";\nimport { type List as CoreList } from \"@/list\";\nimport {\n type UseSelectProps,\n useSelect,\n type UseSelectOnChangeExtra,\n} from \"@/list/useSelect\";\nimport { Core } from \"@/select/List\";\nimport { componentRenderProp, type RenderProp } from \"@/util/renderProp\";\n\nimport \"@/select/Button.css\";\n\nexport interface ButtonOptionProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>>\n extends Pick<CoreButton.ButtonProps, \"onClick\"> {\n key: K;\n selected: boolean;\n entry: E;\n title: E[keyof E];\n}\n\nexport type ButtonProps<K extends Key = Key, E extends Keyed<K> = Keyed<K>> = Omit<\n UseSelectProps<K, E>,\n \"data\"\n> &\n Omit<Align.PackProps, \"children\" | \"onChange\"> & {\n data: E[];\n children?: RenderProp<ButtonOptionProps<K, E>>;\n entryRenderKey?: keyof E;\n };\n\nexport const Button = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n children = defaultSelectButtonOption,\n value,\n onChange,\n entryRenderKey = \"key\",\n allowNone = false,\n allowMultiple = false,\n data,\n replaceOnSingle,\n ...props\n}: ButtonProps<K, E>): JSX.Element => {\n const { onSelect } = useSelect<K, E>({\n allowMultiple,\n allowNone,\n replaceOnSingle,\n data,\n value,\n onChange,\n } as const as UseSelectProps<K, E>);\n\n return (\n <Align.Pack {...props}>\n {data.map((e) => {\n return children({\n key: e.key,\n onClick: () => onSelect(e.key),\n selected: e.key === value,\n entry: e,\n title: e[entryRenderKey],\n });\n })}\n </Align.Pack>\n );\n};\n\nconst defaultSelectButtonOption = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n onClick,\n selected,\n title,\n}: ButtonOptionProps<K, E>): JSX.Element => (\n <CoreButton.Button onClick={onClick} variant={selected ? \"filled\" : \"outlined\"}>\n {title as ReactNode}\n </CoreButton.Button>\n);\n\nexport interface DropdownButtonButtonProps<K extends Key, E extends Keyed<K>>\n extends CoreButton.ButtonProps {\n selected: E | null;\n renderKey: keyof E;\n toggle: () => void;\n visible: boolean;\n}\n\nexport interface DropdownButtonProps<K extends Key, E extends Keyed<K>>\n extends Omit<Dropdown.DialogProps, \"onChange\" | \"visible\" | \"children\" | \"close\">,\n Input.Control<K>,\n Omit<CoreList.ListProps<K, E>, \"children\">,\n Pick<CoreButton.ButtonProps, \"disabled\"> {\n columns?: Array<CoreList.ColumnSpec<K, E>>;\n children?: RenderProp<DropdownButtonButtonProps<K, E>>;\n entryRenderKey?: keyof E;\n allowNone?: boolean;\n hideColumnHeader?: boolean;\n disabled?: boolean;\n omit?: K[];\n}\n\nexport const BaseButton = ({\n selected,\n renderKey,\n toggle,\n visible,\n children,\n ...props\n}: DropdownButtonButtonProps<any, any>): ReactElement => (\n <CoreButton.Button\n className={CSS.B(\"select-button\")}\n onClick={toggle}\n variant=\"outlined\"\n endIcon={<Icon.Caret.Left className={CSS.BE(\"select-button\", \"indicator\")} />}\n {...props}\n >\n {children ?? selected?.[renderKey]}\n </CoreButton.Button>\n);\n\nexport const defaultButton: RenderProp<DropdownButtonButtonProps<any, any>> =\n componentRenderProp(BaseButton);\n\nexport const DropdownButton = <K extends Key = Key, E extends Keyed<K> = Keyed<K>>({\n data,\n value,\n columns = [],\n children = defaultButton,\n entryRenderKey = \"key\",\n allowNone = false,\n onChange,\n disabled,\n hideColumnHeader = true,\n ...props\n}: DropdownButtonProps<K, E>): ReactElement => {\n const { close, visible, toggle } = Dropdown.use();\n const [selected, setSelected] = useState<E | null>(\n data?.find((e) => e.key === value) ?? null,\n );\n\n useEffect(() => {\n setSelected(data?.find((e) => e.key === value) ?? null);\n }, [data, value]);\n\n const handleChange: UseSelectProps<K, E>[\"onChange\"] = useCallback(\n (next: K, e: UseSelectOnChangeExtra<K, E>): void => {\n close();\n if (next == null) {\n setSelected(null);\n return onChange(value);\n }\n setSelected(e.entries[0]);\n onChange(next);\n },\n [onChange, value, close, setSelected],\n );\n\n return (\n <Core<K, E>\n {...props}\n close={close}\n data={data}\n visible={visible}\n value={[value]}\n onChange={handleChange}\n allowMultiple={false}\n allowNone={allowNone}\n columns={columns}\n hideColumnHeader={hideColumnHeader}\n >\n {children({\n selected,\n renderKey: entryRenderKey,\n toggle,\n visible,\n disabled,\n })}\n </Core>\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 { Button as CoreButton } from \"@/button\";\nimport { Button, type ButtonOptionProps, type ButtonProps } from \"@/select/Button\";\nimport { type text } from \"@/text/core\";\n\ninterface Entry {\n key: text.Level;\n label: string;\n}\n\nexport interface SelectLevelProps\n extends Omit<ButtonProps<text.Level, Entry>, \"data\" | \"entryRenderKey\"> {}\n\nconst DATA: Entry[] = [\n {\n key: \"h2\",\n label: \"XL\",\n },\n {\n key: \"h3\",\n label: \"L\",\n },\n {\n key: \"h4\",\n label: \"M\",\n },\n {\n key: \"p\",\n label: \"S\",\n },\n {\n key: \"small\",\n label: \"XS\",\n },\n];\n\nconst defaultSelectDirectionButton = ({\n key,\n entry,\n onClick,\n selected,\n}: ButtonOptionProps<text.Level, Entry>): ReactElement => {\n return (\n <CoreButton.Button\n key={key}\n variant={selected ? \"filled\" : \"outlined\"}\n onClick={onClick}\n >\n {entry.label}\n </CoreButton.Button>\n );\n};\n\nexport const SelectLevel = ({\n children = defaultSelectDirectionButton,\n ...props\n}: SelectLevelProps): ReactElement => {\n return (\n <Button {...props} data={DATA}>\n {children}\n </Button>\n );\n};\n"],"names":["CoreList.List","jsx","CoreList.Selector","jsxs","Dropdown.Dialog","CoreList.Hover","CoreList.Column","CoreList.Core","Align.Pack","CoreButton.Button","Icon","Dropdown.use"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const jsxRuntime = require("./jsx-runtime-B3vWrP5x.cjs");
|
|
3
3
|
const React = require("react");
|
|
4
|
-
const Toggle = require("./Toggle-
|
|
5
|
-
const Center = require("./Center-
|
|
6
|
-
const css = require("./css-
|
|
7
|
-
const aggregator = require("./aggregator-
|
|
4
|
+
const Toggle = require("./Toggle-D3iCEbO1.cjs");
|
|
5
|
+
const Center = require("./Center-Cc_rR5pQ.cjs");
|
|
6
|
+
const css = require("./css-Ci8WUD5E.cjs");
|
|
7
|
+
const aggregator = require("./aggregator-Bh2Kyzkg.cjs");
|
|
8
8
|
const resetSelection = (selected = "", tabs = []) => {
|
|
9
9
|
var _a;
|
|
10
10
|
if (tabs.length === 0)
|
|
@@ -283,4 +283,4 @@ exports.external = external;
|
|
|
283
283
|
exports.rename = rename;
|
|
284
284
|
exports.resetSelection = resetSelection;
|
|
285
285
|
exports.useStatic = useStatic;
|
|
286
|
-
//# sourceMappingURL=external-
|
|
286
|
+
//# sourceMappingURL=external-Iv2mRce8.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-B0z7uXZV.cjs","sources":["../src/tabs/Tabs.tsx","../src/tabs/Selector.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 React, {\n createContext,\n type ReactElement,\n type ReactNode,\n useContext,\n useCallback,\n} from \"react\";\n\nimport { direction } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { useSyncedRef } from \"@/hooks\";\nimport { state } from \"@/state\";\nimport { type TabSpec, Selector } from \"@/tabs/Selector\";\nimport { type ComponentSize } from \"@/util/component\";\nimport { type RenderProp } from \"@/util/renderProp\";\n\nimport \"@/tabs/Tabs.css\";\n\nexport interface Tab extends TabSpec {\n content?: ReactNode;\n}\n\nexport type TabRenderProp = RenderProp<Tab>;\n\nexport interface UseStaticTabsProps {\n tabs: Tab[];\n content?: TabRenderProp;\n onSelect?: (key: string) => void;\n selected?: string;\n}\n\nexport const resetSelection = (selected = \"\", tabs: Tab[] = []): string | undefined => {\n if (tabs.length === 0) return undefined;\n return tabs.find((t) => t.tabKey === selected) != null\n ? selected\n : tabs[tabs.length - 1]?.tabKey;\n};\n\nexport const rename = (key: string, title: string, tabs: Tab[]): Tab[] => {\n title = title.trim();\n if (title.length === 0) return tabs;\n const t = tabs.find((t) => t.tabKey === key);\n if (t == null || t.name === title) return tabs;\n return tabs.map((t) => (t.tabKey === key ? { ...t, name: title } : t));\n};\n\nexport const useStatic = ({\n tabs,\n content,\n selected,\n onSelect,\n}: UseStaticTabsProps): TabsContextValue => {\n const [value, onChange] = state.usePurePassthrough({\n initial: selected ?? tabs[0]?.tabKey ?? \"\",\n value: selected,\n onChange: onSelect,\n });\n const valueRef = useSyncedRef(selected ?? value);\n\n const handleSelect = useCallback(\n (key: string): void => {\n onChange(key);\n if (valueRef.current == null) onSelect?.(key);\n },\n [value, onSelect],\n );\n\n return {\n tabs,\n selected: value,\n content,\n onSelect: handleSelect,\n };\n};\n\nexport interface TabsContextValue {\n tabs: Tab[];\n emptyContent?: ReactElement | null;\n closable?: boolean;\n selected?: string;\n onSelect?: (key: string) => void;\n content?: TabRenderProp | ReactNode;\n onClose?: (key: string) => void;\n onDragStart?: (e: React.DragEvent<HTMLDivElement>, tab: TabSpec) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>, tab: TabSpec) => void;\n onDrop?: (e: React.DragEvent<HTMLDivElement>) => void;\n onRename?: (key: string, title: string) => void;\n onCreate?: () => void;\n}\n\nexport interface TabsProps\n extends Omit<\n Align.SpaceProps,\n \"children\" | \"onSelect\" | \"size\" | \"onDragStart\" | \"onDragEnd\" | \"content\"\n >,\n TabsContextValue {\n children?: TabRenderProp | ReactNode;\n size?: ComponentSize;\n}\n\nexport const TabsContext = createContext<TabsContextValue>({ tabs: [] });\n\nexport const useTabsContext = (): TabsContextValue => useContext(TabsContext);\n\nexport const Tabs = ({\n id,\n content,\n children,\n onSelect,\n selected,\n closable,\n tabs,\n onClose,\n onDragStart,\n onDragEnd,\n onCreate,\n onRename,\n emptyContent,\n className,\n onDragOver,\n onDrop,\n size = \"medium\",\n direction: dir = \"y\",\n ...props\n}: TabsProps): ReactElement => (\n <Align.Space\n id={id}\n empty\n className={CSS(CSS.B(\"tabs\"), className)}\n onDragOver={onDragOver}\n onDrop={onDrop}\n direction={dir}\n {...props}\n >\n <TabsContext.Provider\n value={{\n tabs,\n emptyContent,\n selected,\n closable,\n content: children ?? content,\n onSelect,\n onClose,\n onDragStart,\n onDragEnd,\n onRename,\n onCreate,\n onDrop,\n }}\n >\n <Selector size={size} direction={direction.swap(dir)} />\n <Content />\n </TabsContext.Provider>\n </Align.Space>\n);\n\nexport const Provider = TabsContext.Provider;\n\nexport const Content = (): ReactNode | null => {\n const {\n tabs,\n selected,\n content: renderProp,\n emptyContent,\n onSelect,\n } = useTabsContext();\n let content: ReactNode = null;\n const selectedTab = tabs.find((tab) => tab.tabKey === selected);\n if (selected == null || selectedTab == null) return emptyContent ?? null;\n if (renderProp != null) {\n if (typeof renderProp === \"function\") content = renderProp(selectedTab);\n else content = renderProp;\n } else if (selectedTab.content != null) content = selectedTab.content;\n return (\n <div className={CSS.B(\"tabs-content\")} onClick={() => onSelect?.(selected)}>\n {content}\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 {\n type DragEventHandler,\n type MouseEventHandler,\n type ReactElement,\n useCallback,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { useTabsContext } from \"@/tabs/Tabs\";\nimport { Text } from \"@/text\";\nimport { type ComponentSize } from \"@/util/component\";\n\nexport interface TabSpec {\n tabKey: string;\n name: string;\n closable?: boolean;\n icon?: ReactElement;\n editable?: boolean;\n}\n\nexport interface SelectorProps extends Omit<Align.SpaceProps, \"children\"> {\n size?: ComponentSize;\n}\n\nconst CLS = \"tabs-selector\";\n\nexport const Selector = ({\n className,\n size = \"medium\",\n direction = \"x\",\n ...props\n}: SelectorProps): ReactElement | null => {\n const {\n tabs,\n selected,\n onSelect,\n onClose,\n closable,\n onDragEnd,\n onDragStart,\n onDrop,\n onRename,\n onCreate,\n } = useTabsContext();\n return (\n <Align.Space\n className={CSS(CSS.B(CLS), CSS.size(size), className)}\n align=\"center\"\n justify=\"spaceBetween\"\n onDrop={onDrop}\n empty\n direction={direction}\n {...props}\n >\n <Align.Space direction={direction} className={CSS.BE(CLS, \"tabs\")} empty>\n {tabs.map((tab) => (\n <SelectorButton\n key={tab.tabKey}\n selected={selected}\n onSelect={onSelect}\n onClose={onClose}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onRename={onRename}\n closable={tab.closable ?? closable}\n size={size}\n {...tab}\n />\n ))}\n </Align.Space>\n\n {onCreate != null && (\n <Align.Space className={CSS.BE(CLS, \"actions\")}>\n <Button.Icon size={size} sharp onClick={onCreate}>\n <Icon.Add />\n </Button.Icon>\n </Align.Space>\n )}\n </Align.Space>\n );\n};\n\nconst SelectorButton = ({\n selected,\n onSelect,\n onClose,\n tabKey,\n name,\n onDragStart,\n onDragEnd,\n onRename,\n closable = true,\n icon,\n size,\n editable = true,\n}: SelectorButtonProps): ReactElement => {\n const handleDragStart: DragEventHandler<HTMLDivElement> = useCallback(\n (e) => onDragStart?.(e, { tabKey, name }),\n [onDragStart, tabKey, name],\n );\n\n const handleDragEnd: DragEventHandler<HTMLDivElement> = useCallback(\n (e) => onDragEnd?.(e, { tabKey, name }),\n [onDragEnd, tabKey, name],\n );\n\n const handleClose: MouseEventHandler<HTMLButtonElement> = useCallback(\n (e) => {\n e.stopPropagation();\n onClose?.(tabKey);\n },\n [onClose, tabKey],\n );\n\n const _onSelect = useCallback(() => onSelect?.(tabKey), [onSelect, tabKey]);\n\n return (\n <Align.Pack\n size={size}\n className={CSS(\n CSS.BE(CLS, \"btn\"),\n onRename == null && CSS.BEM(CLS, \"btn\", \"uneditable\"),\n CSS.selected(selected === tabKey),\n closable && onClose != null && CSS.BEM(CLS, \"btn\", \"closable\"),\n )}\n draggable\n direction=\"x\"\n justify=\"center\"\n align=\"center\"\n onClick={_onSelect}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n bordered={false}\n rounded={false}\n >\n <Name\n name={name}\n tabKey={tabKey}\n onRename={onRename}\n icon={icon}\n editable={editable}\n level={Text.ComponentSizeLevels[size]}\n />\n {closable && onClose != null && (\n <Button.Icon onClick={handleClose}>\n <Icon.Close aria-label=\"pluto-tabs__close\" />\n </Button.Icon>\n )}\n </Align.Pack>\n );\n};\n\nexport interface SelectorButtonProps extends TabSpec {\n selected?: string;\n onDragStart?: (e: React.DragEvent<HTMLDivElement>, tab: TabSpec) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>, tab: TabSpec) => void;\n onSelect?: (key: string) => void;\n onClose?: (key: string) => void;\n onRename?: (key: string, name: string) => void;\n size: ComponentSize;\n}\n\ninterface NameProps extends Text.CoreProps<Text.Level> {\n onRename?: (key: string, name: string) => void;\n name: string;\n tabKey: string;\n icon?: ReactElement;\n editable?: boolean;\n}\n\nconst Name = ({\n onRename,\n name,\n tabKey,\n icon,\n editable = true,\n ...props\n}: NameProps): ReactElement => {\n if (onRename == null || !editable) {\n if (icon != null)\n return (\n <Text.WithIcon startIcon={icon} noWrap {...props}>\n {name}\n </Text.WithIcon>\n );\n return (\n <Text.Text noWrap {...props}>\n {name}\n </Text.Text>\n );\n }\n return (\n <Text.Editable<Text.Level>\n onChange={(newText: string) => onRename(tabKey, newText)}\n value={name}\n noWrap\n {...props}\n />\n );\n};\n"],"names":["t","state.usePurePassthrough","useSyncedRef","useCallback","createContext","useContext","jsx","Align.Space","CSS","jsxs","direction","Button.Icon","Icon","Align.Pack","Text.ComponentSizeLevels","Text.WithIcon","Text.Text","Text.Editable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"external-Iv2mRce8.cjs","sources":["../src/tabs/Tabs.tsx","../src/tabs/Selector.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 React, {\n createContext,\n type ReactElement,\n type ReactNode,\n useContext,\n useCallback,\n} from \"react\";\n\nimport { direction } from \"@synnaxlabs/x\";\n\nimport { Align } from \"@/align\";\nimport { CSS } from \"@/css\";\nimport { useSyncedRef } from \"@/hooks\";\nimport { state } from \"@/state\";\nimport { type TabSpec, Selector } from \"@/tabs/Selector\";\nimport { type ComponentSize } from \"@/util/component\";\nimport { type RenderProp } from \"@/util/renderProp\";\n\nimport \"@/tabs/Tabs.css\";\n\nexport interface Tab extends TabSpec {\n content?: ReactNode;\n}\n\nexport type TabRenderProp = RenderProp<Tab>;\n\nexport interface UseStaticTabsProps {\n tabs: Tab[];\n content?: TabRenderProp;\n onSelect?: (key: string) => void;\n selected?: string;\n}\n\nexport const resetSelection = (selected = \"\", tabs: Tab[] = []): string | undefined => {\n if (tabs.length === 0) return undefined;\n return tabs.find((t) => t.tabKey === selected) != null\n ? selected\n : tabs[tabs.length - 1]?.tabKey;\n};\n\nexport const rename = (key: string, title: string, tabs: Tab[]): Tab[] => {\n title = title.trim();\n if (title.length === 0) return tabs;\n const t = tabs.find((t) => t.tabKey === key);\n if (t == null || t.name === title) return tabs;\n return tabs.map((t) => (t.tabKey === key ? { ...t, name: title } : t));\n};\n\nexport const useStatic = ({\n tabs,\n content,\n selected,\n onSelect,\n}: UseStaticTabsProps): TabsContextValue => {\n const [value, onChange] = state.usePurePassthrough({\n initial: selected ?? tabs[0]?.tabKey ?? \"\",\n value: selected,\n onChange: onSelect,\n });\n const valueRef = useSyncedRef(selected ?? value);\n\n const handleSelect = useCallback(\n (key: string): void => {\n onChange(key);\n if (valueRef.current == null) onSelect?.(key);\n },\n [value, onSelect],\n );\n\n return {\n tabs,\n selected: value,\n content,\n onSelect: handleSelect,\n };\n};\n\nexport interface TabsContextValue {\n tabs: Tab[];\n emptyContent?: ReactElement | null;\n closable?: boolean;\n selected?: string;\n onSelect?: (key: string) => void;\n content?: TabRenderProp | ReactNode;\n onClose?: (key: string) => void;\n onDragStart?: (e: React.DragEvent<HTMLDivElement>, tab: TabSpec) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>, tab: TabSpec) => void;\n onDrop?: (e: React.DragEvent<HTMLDivElement>) => void;\n onRename?: (key: string, title: string) => void;\n onCreate?: () => void;\n}\n\nexport interface TabsProps\n extends Omit<\n Align.SpaceProps,\n \"children\" | \"onSelect\" | \"size\" | \"onDragStart\" | \"onDragEnd\" | \"content\"\n >,\n TabsContextValue {\n children?: TabRenderProp | ReactNode;\n size?: ComponentSize;\n}\n\nexport const TabsContext = createContext<TabsContextValue>({ tabs: [] });\n\nexport const useTabsContext = (): TabsContextValue => useContext(TabsContext);\n\nexport const Tabs = ({\n id,\n content,\n children,\n onSelect,\n selected,\n closable,\n tabs,\n onClose,\n onDragStart,\n onDragEnd,\n onCreate,\n onRename,\n emptyContent,\n className,\n onDragOver,\n onDrop,\n size = \"medium\",\n direction: dir = \"y\",\n ...props\n}: TabsProps): ReactElement => (\n <Align.Space\n id={id}\n empty\n className={CSS(CSS.B(\"tabs\"), className)}\n onDragOver={onDragOver}\n onDrop={onDrop}\n direction={dir}\n {...props}\n >\n <TabsContext.Provider\n value={{\n tabs,\n emptyContent,\n selected,\n closable,\n content: children ?? content,\n onSelect,\n onClose,\n onDragStart,\n onDragEnd,\n onRename,\n onCreate,\n onDrop,\n }}\n >\n <Selector size={size} direction={direction.swap(dir)} />\n <Content />\n </TabsContext.Provider>\n </Align.Space>\n);\n\nexport const Provider = TabsContext.Provider;\n\nexport const Content = (): ReactNode | null => {\n const {\n tabs,\n selected,\n content: renderProp,\n emptyContent,\n onSelect,\n } = useTabsContext();\n let content: ReactNode = null;\n const selectedTab = tabs.find((tab) => tab.tabKey === selected);\n if (selected == null || selectedTab == null) return emptyContent ?? null;\n if (renderProp != null) {\n if (typeof renderProp === \"function\") content = renderProp(selectedTab);\n else content = renderProp;\n } else if (selectedTab.content != null) content = selectedTab.content;\n return (\n <div className={CSS.B(\"tabs-content\")} onClick={() => onSelect?.(selected)}>\n {content}\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 {\n type DragEventHandler,\n type MouseEventHandler,\n type ReactElement,\n useCallback,\n} from \"react\";\n\nimport { Icon } from \"@synnaxlabs/media\";\n\nimport { Align } from \"@/align\";\nimport { Button } from \"@/button\";\nimport { CSS } from \"@/css\";\nimport { useTabsContext } from \"@/tabs/Tabs\";\nimport { Text } from \"@/text\";\nimport { type ComponentSize } from \"@/util/component\";\n\nexport interface TabSpec {\n tabKey: string;\n name: string;\n closable?: boolean;\n icon?: ReactElement;\n editable?: boolean;\n}\n\nexport interface SelectorProps extends Omit<Align.SpaceProps, \"children\"> {\n size?: ComponentSize;\n}\n\nconst CLS = \"tabs-selector\";\n\nexport const Selector = ({\n className,\n size = \"medium\",\n direction = \"x\",\n ...props\n}: SelectorProps): ReactElement | null => {\n const {\n tabs,\n selected,\n onSelect,\n onClose,\n closable,\n onDragEnd,\n onDragStart,\n onDrop,\n onRename,\n onCreate,\n } = useTabsContext();\n return (\n <Align.Space\n className={CSS(CSS.B(CLS), CSS.size(size), className)}\n align=\"center\"\n justify=\"spaceBetween\"\n onDrop={onDrop}\n empty\n direction={direction}\n {...props}\n >\n <Align.Space direction={direction} className={CSS.BE(CLS, \"tabs\")} empty>\n {tabs.map((tab) => (\n <SelectorButton\n key={tab.tabKey}\n selected={selected}\n onSelect={onSelect}\n onClose={onClose}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onRename={onRename}\n closable={tab.closable ?? closable}\n size={size}\n {...tab}\n />\n ))}\n </Align.Space>\n\n {onCreate != null && (\n <Align.Space className={CSS.BE(CLS, \"actions\")}>\n <Button.Icon size={size} sharp onClick={onCreate}>\n <Icon.Add />\n </Button.Icon>\n </Align.Space>\n )}\n </Align.Space>\n );\n};\n\nconst SelectorButton = ({\n selected,\n onSelect,\n onClose,\n tabKey,\n name,\n onDragStart,\n onDragEnd,\n onRename,\n closable = true,\n icon,\n size,\n editable = true,\n}: SelectorButtonProps): ReactElement => {\n const handleDragStart: DragEventHandler<HTMLDivElement> = useCallback(\n (e) => onDragStart?.(e, { tabKey, name }),\n [onDragStart, tabKey, name],\n );\n\n const handleDragEnd: DragEventHandler<HTMLDivElement> = useCallback(\n (e) => onDragEnd?.(e, { tabKey, name }),\n [onDragEnd, tabKey, name],\n );\n\n const handleClose: MouseEventHandler<HTMLButtonElement> = useCallback(\n (e) => {\n e.stopPropagation();\n onClose?.(tabKey);\n },\n [onClose, tabKey],\n );\n\n const _onSelect = useCallback(() => onSelect?.(tabKey), [onSelect, tabKey]);\n\n return (\n <Align.Pack\n size={size}\n className={CSS(\n CSS.BE(CLS, \"btn\"),\n onRename == null && CSS.BEM(CLS, \"btn\", \"uneditable\"),\n CSS.selected(selected === tabKey),\n closable && onClose != null && CSS.BEM(CLS, \"btn\", \"closable\"),\n )}\n draggable\n direction=\"x\"\n justify=\"center\"\n align=\"center\"\n onClick={_onSelect}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n bordered={false}\n rounded={false}\n >\n <Name\n name={name}\n tabKey={tabKey}\n onRename={onRename}\n icon={icon}\n editable={editable}\n level={Text.ComponentSizeLevels[size]}\n />\n {closable && onClose != null && (\n <Button.Icon onClick={handleClose}>\n <Icon.Close aria-label=\"pluto-tabs__close\" />\n </Button.Icon>\n )}\n </Align.Pack>\n );\n};\n\nexport interface SelectorButtonProps extends TabSpec {\n selected?: string;\n onDragStart?: (e: React.DragEvent<HTMLDivElement>, tab: TabSpec) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>, tab: TabSpec) => void;\n onSelect?: (key: string) => void;\n onClose?: (key: string) => void;\n onRename?: (key: string, name: string) => void;\n size: ComponentSize;\n}\n\ninterface NameProps extends Text.CoreProps<Text.Level> {\n onRename?: (key: string, name: string) => void;\n name: string;\n tabKey: string;\n icon?: ReactElement;\n editable?: boolean;\n}\n\nconst Name = ({\n onRename,\n name,\n tabKey,\n icon,\n editable = true,\n ...props\n}: NameProps): ReactElement => {\n if (onRename == null || !editable) {\n if (icon != null)\n return (\n <Text.WithIcon startIcon={icon} noWrap {...props}>\n {name}\n </Text.WithIcon>\n );\n return (\n <Text.Text noWrap {...props}>\n {name}\n </Text.Text>\n );\n }\n return (\n <Text.Editable<Text.Level>\n onChange={(newText: string) => onRename(tabKey, newText)}\n value={name}\n noWrap\n {...props}\n />\n );\n};\n"],"names":["t","state.usePurePassthrough","useSyncedRef","useCallback","createContext","useContext","jsx","Align.Space","CSS","jsxs","direction","Button.Icon","Icon","Align.Pack","Text.ComponentSizeLevels","Text.WithIcon","Text.Text","Text.Editable"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const Toggle = require("./Toggle-
|
|
3
|
-
const Link = require("./Link-
|
|
2
|
+
const Toggle = require("./Toggle-D3iCEbO1.cjs");
|
|
3
|
+
const Link = require("./Link-Bq38h1dw.cjs");
|
|
4
4
|
const external = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
5
5
|
__proto__: null,
|
|
6
6
|
Button: Toggle.Button,
|
|
@@ -10,4 +10,4 @@ const external = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProp
|
|
|
10
10
|
ToggleIcon: Toggle.ToggleIcon
|
|
11
11
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
12
12
|
exports.external = external;
|
|
13
|
-
//# sourceMappingURL=external-
|
|
13
|
+
//# sourceMappingURL=external-P6zP6dBA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-P6zP6dBA.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
const css = require("./css-
|
|
2
|
+
const css = require("./css-Ci8WUD5E.cjs");
|
|
3
3
|
const jsxRuntime = require("./jsx-runtime-B3vWrP5x.cjs");
|
|
4
|
-
const Toggle = require("./Toggle-
|
|
4
|
+
const Toggle = require("./Toggle-D3iCEbO1.cjs");
|
|
5
5
|
const React = require("react");
|
|
6
|
-
require("./aggregator-
|
|
7
|
-
require("./Center-
|
|
6
|
+
require("./aggregator-Bh2Kyzkg.cjs");
|
|
7
|
+
require("./Center-Cc_rR5pQ.cjs");
|
|
8
8
|
const Picker = ({ value, onChange, ...props }) => {
|
|
9
9
|
const handleChange = (res) => {
|
|
10
10
|
if (res.hex === "transparent")
|
|
@@ -104,4 +104,4 @@ const external = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProp
|
|
|
104
104
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
105
105
|
exports.Swatch = Swatch;
|
|
106
106
|
exports.external = external;
|
|
107
|
-
//# sourceMappingURL=external-
|
|
107
|
+
//# sourceMappingURL=external-d-vI8EHK.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-
|
|
1
|
+
{"version":3,"file":"external-d-vI8EHK.cjs","sources":["../src/color/Picker/Picker.tsx","../src/color/Swatch/Swatch.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 ComponentPropsWithoutRef, type ReactElement } from \"react\";\n\nimport { SketchPicker, type ColorResult } from \"react-color\";\n\nimport { color } from \"@/color/core\";\nimport { CSS } from \"@/css\";\nimport { type Input } from \"@/input\";\n\nimport \"@/color/Picker/Picker.css\";\n\nexport interface PickerProps\n extends Input.Control<color.Crude, color.Color>,\n Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {}\n\nexport const Picker = ({ value, onChange, ...props }: PickerProps): ReactElement => {\n const handleChange = (res: ColorResult): void => {\n if (res.hex === \"transparent\") onChange(color.ZERO);\n onChange(new color.Color(res.hex, res.rgb.a));\n };\n\n return (\n <SketchPicker\n className={CSS.B(\"color-picker\")}\n color={new color.Color(value).hex}\n onChange={handleChange}\n presetColors={[]}\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, useCallback } from \"react\";\n\nimport { Button } from \"@/button\";\nimport { color } from \"@/color/core\";\nimport { type Crude, type Color } from \"@/color/core/color\";\nimport { Picker } from \"@/color/Picker\";\nimport { CSS } from \"@/css\";\nimport { Dropdown } from \"@/dropdown\";\nimport { type UseProps } from \"@/dropdown/Dropdown\";\nimport { Haul } from \"@/haul\";\nimport { type Input } from \"@/input\";\nimport { Text } from \"@/text\";\nimport { Theming } from \"@/theming\";\n\nimport \"@/color/Swatch/Swatch.css\";\n\nexport interface SwatchProps\n extends Input.Control<Crude, Color>,\n Omit<Button.ButtonProps, \"onChange\" | \"value\">,\n UseProps {}\n\nconst HAUL_TYPE = \"color\";\n\nexport const Swatch = ({\n value,\n onChange,\n className,\n size = \"medium\",\n onVisibleChange,\n initialVisible,\n draggable = true,\n ...props\n}: SwatchProps): ReactElement => {\n const { visible, open, close } = Dropdown.use({ onVisibleChange, initialVisible });\n\n const bg = Theming.use().colors.gray.l0;\n\n const d = new color.Color(value);\n\n const dragging = Haul.useDraggingState();\n\n const canDrop: Haul.CanDrop = useCallback(\n ({ items }) => {\n const [k] = Haul.filterByType(HAUL_TYPE, items);\n return k != null && k.key !== d.hex;\n },\n [d.hex],\n );\n\n const { startDrag, ...haulProps } = Haul.useDragAndDrop({\n type: \"Color.Swatch\",\n onDrop: ({ items }) => {\n const dropped = Haul.filterByType(HAUL_TYPE, items);\n if (items.length > 0) onChange?.(new color.Color(dropped[0].key as string));\n return dropped;\n },\n canDrop,\n });\n\n const swatch = (\n <Button.Button\n className={CSS(\n CSS.B(\"color-swatch\"),\n CSS.size(size),\n d.contrast(bg) > 1.5 && d.a > 0.5 && CSS.M(\"no-border\"),\n CSS.dropRegion(canDrop(dragging)),\n className,\n )}\n draggable={draggable}\n onDragStart={() => startDrag([{ type: HAUL_TYPE, key: d.hex }])}\n style={{ backgroundColor: color.cssString(value) }}\n variant=\"text\"\n onClick={open}\n size={size}\n tooltip={\n onChange != null ? (\n <Text.Text level=\"small\">Click to change color</Text.Text>\n ) : undefined\n }\n {...haulProps}\n {...props}\n />\n );\n\n if (onChange == null) return swatch;\n\n return (\n <Dropdown.Dialog\n close={close}\n visible={visible}\n className={CSS.BE(\"color-swatch\", \"dropdown\")}\n keepMounted={false}\n variant=\"floating\"\n >\n {swatch}\n <Picker value={value} onChange={onChange} />\n </Dropdown.Dialog>\n );\n};\n"],"names":["color.ZERO","color.Color","jsx","SketchPicker","CSS","Dropdown.use","Theming.use","Haul.useDraggingState","useCallback","Haul.filterByType","Haul.useDragAndDrop","Button.Button","color.cssString","Text.Text","jsxs","Dropdown.Dialog"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { j as jsxRuntimeExports } from "./jsx-runtime-mMz73N64.js";
|
|
2
|
-
import { B as Button, I as Icon, C as CONTEXT_SELECTED, q as CONTEXT_TARGET, r as ContextMenu, s as useContextMenu } from "./Toggle-
|
|
3
|
-
import { L as Link } from "./Link-
|
|
4
|
-
import { C as CSS } from "./css-
|
|
2
|
+
import { B as Button, I as Icon, C as CONTEXT_SELECTED, q as CONTEXT_TARGET, r as ContextMenu, s as useContextMenu } from "./Toggle-bT5RpwfA.js";
|
|
3
|
+
import { L as Link } from "./Link-DQKdkwWL.js";
|
|
4
|
+
import { C as CSS } from "./css-DKKmdhSr.js";
|
|
5
5
|
import { createContext, useContext } from "react";
|
|
6
6
|
const MenuContext = createContext({
|
|
7
7
|
onClick: () => {
|
|
@@ -75,4 +75,4 @@ const external = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProp
|
|
|
75
75
|
export {
|
|
76
76
|
external as e
|
|
77
77
|
};
|
|
78
|
-
//# sourceMappingURL=external-
|
|
78
|
+
//# sourceMappingURL=external-giUMrk8w.js.map
|