@pie-element/placement-ordering 14.3.1 → 14.3.2-beta.2
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/CHANGELOG.md +29 -56
- package/configure/CHANGELOG.md +28 -44
- package/configure/lib/__tests__/choice-editor.test.js +376 -0
- package/configure/lib/__tests__/choice-tile.test.js +283 -0
- package/configure/lib/__tests__/design.test.js +268 -0
- package/configure/lib/__tests__/help.test.js +64 -0
- package/configure/lib/__tests__/index.test.js +77 -0
- package/configure/lib/__tests__/utils.test.js +493 -0
- package/configure/package.json +5 -5
- package/controller/CHANGELOG.md +38 -6
- package/controller/lib/__tests__/index.test.js +401 -0
- package/controller/lib/__tests__/scoring.test.js +165 -0
- package/controller/package.json +1 -1
- package/docs/demo/pie.manifest.json +11 -0
- package/lib/__tests__/index-test.js +90 -0
- package/lib/__tests__/ordering.test.js +133 -0
- package/lib/__tests__/placement-ordering.test.js +445 -0
- package/lib/placement-ordering.js +8 -138
- package/lib/placement-ordering.js.map +1 -1
- package/lib/tile.js +22 -93
- package/lib/tile.js.map +1 -1
- package/lib/tiler.js +1 -7
- package/lib/tiler.js.map +1 -1
- package/package.json +5 -6
- package/lib/keyboard-coordinates.js +0 -124
- package/lib/keyboard-coordinates.js.map +0 -1
package/lib/tile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile.js","names":["_react","_interopRequireDefault","require","_propTypes","_debug","_core","_styles","_drag","_renderUi","log","debug","StyledNumberContainer","styled","theme","width","fontSize","typography","textAlign","color","palette","common","black","Holder","type","index","isOver","disabled","default","createElement","PlaceHolder","undefined","propTypes","PropTypes","string","number","bool","StyledTileContent","isDragging","isSelected","outcome","label","cursor","height","padding","boxSizing","overflow","border","backgroundColor","background","transition","pointerEvents","userSelect","secondary","borderColor","primary","main","transform","opacity","primaryLight","borderStyle","secondaryLight","boxShadow","incorrect","correct","TileContent","props","empty","guideIndex","dangerouslySetInnerHTML","__html","Tile","id","instanceId","draggable","tileIndex","selectedChoice","onChoiceClick","onPlacementClick","dragId","dropId","tileData","value","attributes","listeners","setNodeRef","setDragRef","useDraggable","data","setDropRef","dropIsOver","useDroppable","isHovered","setIsHovered","React","useState","hasSelection","showsHoverEffect","handleClick","isNativeTabStop","handleKeyDown","e","code","preventDefault","ref","useRef","useEffect","currentRef","current","handleTouchStart","addEventListener","passive","removeEventListener","setRefs","element","style","x","y","margin","zIndex","willChange","_extends2","role","tabIndex","onKeyDown","onClick","onMouseEnter","onMouseLeave","exports","any","object","func","_default"],"sources":["../src/tile.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport debug from 'debug';\nimport { useDraggable, useDroppable } from '@dnd-kit/core';\nimport { styled } from '@mui/material/styles';\n\nimport { PlaceHolder } from '@pie-lib/drag';\nimport { color } from '@pie-lib/render-ui';\n\nconst log = debug('pie-elements:placement-ordering:tile');\n\nconst StyledNumberContainer = styled('div')(({ theme }) => ({\n width: '100%',\n fontSize: theme.typography.fontSize + 4,\n textAlign: 'center',\n color: `rgba(${theme.palette.common.black}, 0.6)`,\n}));\n\nconst Holder = ({ type, index, isOver, disabled }) => (\n <PlaceHolder type={type} isOver={isOver} disabled={disabled}>\n {type === 'target' && index !== undefined && <StyledNumberContainer>{index}</StyledNumberContainer>}\n </PlaceHolder>\n);\n\nHolder.propTypes = {\n type: PropTypes.string,\n index: PropTypes.number,\n isOver: PropTypes.bool,\n disabled: PropTypes.bool,\n};\n\nconst StyledTileContent = styled('div')(\n ({ theme, isDragging, isSelected, isOver, disabled, outcome, label, type }) => ({\n cursor: disabled ? 'not-allowed' : 'grab',\n width: '100%',\n height: '100%',\n padding: '10px',\n boxSizing: 'border-box',\n overflow: 'hidden',\n border: type === 'choice' || type === 'target' ? `1px solid ${color.border()}` : '1px solid transparent',\n backgroundColor: type === 'choice' || type === 'target' ? color.background() : 'transparent',\n transition:\n type === 'choice' || type === 'target'\n ? 'background-color 150ms ease, border-color 150ms ease, opacity 150ms ease'\n : 'none',\n pointerEvents: 'none',\n userSelect: 'none',\n\n ...((type === 'choice' || type === 'target') && {\n '&:hover': {\n backgroundColor: disabled ? color.background() : color.secondary(),\n // The disabled branch says \"disabled\", so it takes the disabled token rather\n // than the neutral stroke the resting state uses.\n borderColor: disabled ? color.disabled() : theme.palette.primary.main,\n transform: disabled ? 'none' : 'scale(1.02)',\n },\n }),\n\n // Apply conditional styles based on props (only if not empty spacing tile)\n ...((type === 'choice' || type === 'target') &&\n isOver &&\n !disabled && {\n opacity: 0.4,\n backgroundColor: color.primaryLight(),\n borderColor: theme.palette.primary.main,\n borderStyle: 'dashed',\n transform: 'scale(1.05)',\n }),\n\n ...((type === 'choice' || type === 'target') &&\n (isDragging || isSelected) &&\n !disabled && {\n opacity: 0.6,\n backgroundColor: color.secondaryLight(),\n transform: 'scale(1.05) rotate(2deg)',\n boxShadow: '0 8px 16px rgba(0,0,0,0.2)',\n cursor: 'grabbing',\n }),\n\n ...((type === 'choice' || type === 'target') &&\n disabled && {\n cursor: 'not-allowed',\n '&:hover': {\n backgroundColor: color.background(),\n transform: 'none',\n },\n }),\n\n ...((type === 'choice' || type === 'target') &&\n outcome === 'incorrect' && {\n border: `1px solid ${color.incorrect()}`,\n }),\n\n ...((type === 'choice' || type === 'target') &&\n outcome === 'correct' && {\n border: `1px solid ${color.correct()}`,\n }),\n\n ...(!label && {\n border: 'none',\n '&:hover': {\n backgroundColor: 'unset',\n },\n }),\n }),\n);\n\nconst TileContent = (props) => {\n const { type, isDragging, isSelected, empty, isOver, label, disabled, outcome, guideIndex } = props;\n\n if (empty) {\n return <Holder type={type} index={guideIndex} isOver={isOver} disabled={disabled} />;\n } else {\n return (\n <StyledTileContent\n type={type}\n isDragging={isDragging}\n isSelected={isSelected}\n isOver={isOver}\n disabled={disabled}\n outcome={outcome}\n label={label}\n dangerouslySetInnerHTML={{ __html: label }}\n />\n );\n }\n};\n\nexport const Tile = (props) => {\n const {\n label,\n type,\n id,\n empty,\n disabled,\n outcome,\n index,\n guideIndex,\n instanceId,\n draggable,\n tileIndex,\n selectedChoice,\n onChoiceClick,\n onPlacementClick,\n } = props;\n\n // Use type + tileIndex in the IDs to guarantee uniqueness in all modes.\n // In includeTargets mode, a choice (id:'c1', type:'choice') and a target (id:'c1', type:'target')\n // can coexist — the type differentiates them.\n // tileIndex (array position from tiler) ensures empty placeholders are also unique.\n const dragId = `tile-${type}-${id != null ? id : 'empty'}-${tileIndex}-${instanceId}`;\n const dropId = `drop-${type}-${id != null ? id : 'empty'}-${tileIndex}-${instanceId}`;\n\n // Built once and reused for dnd-kit's own drag/drop data and for the click handlers\n // below, so a click carries exactly the same shape a real drag would.\n const tileData = { id, type, instanceId, value: label, index };\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n transform,\n isDragging,\n } = useDraggable({\n id: dragId,\n data: tileData,\n disabled: !draggable || disabled,\n });\n\n const { setNodeRef: setDropRef, isOver: dropIsOver } = useDroppable({\n id: dropId,\n data: tileData,\n // Disable droppable on the tile currently being dragged so closestCenter\n // cannot pick it as the drop target (prevents self-collision and wrong matches).\n disabled: isDragging,\n });\n\n const isSelected =\n !!selectedChoice &&\n selectedChoice.type === tileData.type &&\n selectedChoice.id === tileData.id &&\n selectedChoice.index === tileData.index;\n\n // dnd-kit's own isOver (dropIsOver) only reflects real collision detection during an\n // active drag, so it stays false while a placement area is merely a candidate for a\n // pending click-based placement. Track hovering locally and fold it into the same\n // isOver signal the styling below already uses, so hovering a response area while\n // something is selected gets the exact same treatment as hovering it during a real\n // drag — one code path, no duplicated CSS.\n const [isHovered, setIsHovered] = React.useState(false);\n const hasSelection = !!selectedChoice && !disabled;\n const showsHoverEffect = dropIsOver || (type === 'target' && hasSelection && isHovered);\n\n // Click-to-select/click-to-place (both choices and targets are handled by this same\n // component, differentiated by `type`):\n // - Choice tile: selects/switches/deselects it, UNLESS a placed answer (a \"target\")\n // is currently selected, in which case clicking any choice-row tile returns it to\n // the choices column/row (choice -> choice has no placement meaning in the\n // reducer, so there's no ambiguity there).\n // - Target tile: clicking the already-selected placed answer again deselects it;\n // clicking it while something else is selected places that selection here\n // (empty or occupied); clicking a filled target with nothing selected selects\n // that placed answer for moving, the same way Tab+Space/Enter does. An empty\n // target with nothing selected is a no-op.\n const handleClick = () => {\n if (disabled) return;\n\n if (type === 'choice') {\n if (selectedChoice?.type === 'target') {\n onPlacementClick?.(tileData);\n } else if (draggable) {\n onChoiceClick?.(tileData);\n }\n } else if (type === 'target') {\n if (isSelected) {\n onChoiceClick?.(tileData);\n } else if (selectedChoice) {\n onPlacementClick?.(tileData);\n } else if (draggable) {\n onChoiceClick?.(tileData);\n }\n }\n };\n\n // dnd-kit's own draggable attributes (spread below) already make a draggable tile a\n // native Tab stop with its own Space/Enter activation. An empty tile is never\n // draggable, so without this it wouldn't be reachable by Tab at all — needed for\n // \"select a choice, then Tab to a placement area and press Space/Enter\" to work.\n // Gated to non-draggable tiles specifically so it never overrides dnd-kit's own\n // keydown handling (see the conditional spread order below).\n const isNativeTabStop = !(draggable && !disabled) && !disabled;\n\n const handleKeyDown = (e) => {\n if (e.code === 'Space' || e.code === 'Enter') {\n e.preventDefault();\n handleClick();\n }\n };\n\n const ref = React.useRef(null);\n\n React.useEffect(() => {\n const currentRef = ref.current;\n\n const handleTouchStart = (e) => {\n e.preventDefault(); // Prevent the default touch event behavior\n };\n\n if (currentRef) {\n currentRef.addEventListener('touchstart', handleTouchStart, { passive: false });\n }\n\n return () => {\n if (currentRef) {\n currentRef.removeEventListener('touchstart', handleTouchStart);\n }\n };\n }, []);\n\n const setRefs = (element) => {\n ref.current = element;\n setDragRef(element);\n setDropRef(element);\n };\n\n log('[render], props: ', props);\n\n const style = {\n transform: transform ? `translate3d(${transform.x}px, ${transform.y}px, 0)` : undefined,\n boxSizing: 'border-box',\n overflow: 'visible',\n padding: 0,\n margin: 0,\n textAlign: 'center',\n pointerEvents: 'auto',\n cursor: disabled ? 'not-allowed' : type === 'target' && hasSelection ? 'pointer' : isDragging ? 'grabbing' : 'grab',\n zIndex: isDragging ? 1000 : 'auto',\n willChange: isDragging ? 'transform' : 'auto',\n };\n\n return (\n <div\n ref={setRefs}\n style={style}\n role={isNativeTabStop ? 'button' : undefined}\n tabIndex={isNativeTabStop ? 0 : undefined}\n onKeyDown={isNativeTabStop ? handleKeyDown : undefined}\n onClick={handleClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...(draggable && !disabled ? { ...listeners, ...attributes } : {})}\n >\n <TileContent\n label={label}\n id={id}\n empty={empty}\n index={index}\n guideIndex={guideIndex}\n isOver={showsHoverEffect}\n isDragging={isDragging}\n isSelected={isSelected}\n disabled={disabled}\n outcome={outcome}\n type={type}\n />\n </div>\n );\n};\n\nTile.propTypes = {\n id: PropTypes.any,\n label: PropTypes.string,\n isOver: PropTypes.bool,\n type: PropTypes.string,\n empty: PropTypes.bool,\n disabled: PropTypes.bool,\n outcome: PropTypes.string,\n index: PropTypes.number,\n guideIndex: PropTypes.number,\n instanceId: PropTypes.any,\n draggable: PropTypes.bool,\n tileIndex: PropTypes.number,\n selectedChoice: PropTypes.object,\n onChoiceClick: PropTypes.func,\n onPlacementClick: PropTypes.func,\n};\n\nexport default Tile;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"tile.js","names":["_react","_interopRequireDefault","require","_propTypes","_debug","_core","_styles","_drag","_renderUi","log","debug","StyledNumberContainer","styled","theme","width","fontSize","typography","textAlign","color","palette","common","black","Holder","type","index","isOver","disabled","default","createElement","PlaceHolder","undefined","propTypes","PropTypes","string","number","bool","StyledTileContent","isDragging","outcome","label","cursor","height","padding","boxSizing","overflow","border","grey","backgroundColor","background","transition","pointerEvents","userSelect","secondary","borderColor","primary","main","transform","opacity","primaryLight","borderStyle","secondaryLight","boxShadow","incorrect","correct","TileContent","props","empty","guideIndex","dangerouslySetInnerHTML","__html","Tile","id","instanceId","draggable","tileIndex","dragId","dropId","attributes","listeners","setNodeRef","setDragRef","useDraggable","data","value","setDropRef","dropIsOver","useDroppable","ref","React","useRef","useEffect","currentRef","current","handleTouchStart","e","preventDefault","addEventListener","passive","removeEventListener","setRefs","element","style","x","y","margin","zIndex","willChange","_extends2","exports","any","_default"],"sources":["../src/tile.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport debug from 'debug';\nimport { useDraggable, useDroppable } from '@dnd-kit/core';\nimport { styled } from '@mui/material/styles';\n\nimport { PlaceHolder } from '@pie-lib/drag';\nimport { color } from '@pie-lib/render-ui';\n\nconst log = debug('pie-elements:placement-ordering:tile');\n\nconst StyledNumberContainer = styled('div')(({ theme }) => ({\n width: '100%',\n fontSize: theme.typography.fontSize + 4,\n textAlign: 'center',\n color: `rgba(${theme.palette.common.black}, 0.6)`,\n}));\n\nconst Holder = ({ type, index, isOver, disabled }) => (\n <PlaceHolder type={type} isOver={isOver} disabled={disabled}>\n {type === 'target' && index !== undefined && <StyledNumberContainer>{index}</StyledNumberContainer>}\n </PlaceHolder>\n);\n\nHolder.propTypes = {\n type: PropTypes.string,\n index: PropTypes.number,\n isOver: PropTypes.bool,\n disabled: PropTypes.bool,\n};\n\nconst StyledTileContent = styled('div')(({ theme, isDragging, isOver, disabled, outcome, label, type }) => ({\n cursor: disabled ? 'not-allowed' : 'grab',\n width: '100%',\n height: '100%',\n padding: '10px',\n boxSizing: 'border-box',\n overflow: 'hidden',\n border: (type === 'choice' || type === 'target') ? `1px solid ${theme.palette.grey[400]}` : '1px solid transparent',\n backgroundColor: (type === 'choice' || type === 'target') ? color.background() : 'transparent',\n transition: (type === 'choice' || type === 'target') ? 'background-color 150ms ease, border-color 150ms ease, opacity 150ms ease' : 'none',\n pointerEvents: 'none',\n userSelect: 'none',\n\n ...((type === 'choice' || type === 'target') && {\n '&:hover': {\n backgroundColor: disabled ? color.background() : color.secondary(),\n borderColor: disabled ? theme.palette.grey[400] : theme.palette.primary.main,\n transform: disabled ? 'none' : 'scale(1.02)',\n },\n }),\n\n // Apply conditional styles based on props (only if not empty spacing tile)\n ...((type === 'choice' || type === 'target') && isOver && !disabled && {\n opacity: 0.4,\n backgroundColor: color.primaryLight(),\n borderColor: theme.palette.primary.main,\n borderStyle: 'dashed',\n transform: 'scale(1.05)',\n }),\n\n ...((type === 'choice' || type === 'target') && isDragging && !disabled && {\n opacity: 0.6,\n backgroundColor: color.secondaryLight(),\n transform: 'scale(1.05) rotate(2deg)',\n boxShadow: '0 8px 16px rgba(0,0,0,0.2)',\n cursor: 'grabbing',\n }),\n\n ...((type === 'choice' || type === 'target') && disabled && {\n cursor: 'not-allowed',\n '&:hover': {\n backgroundColor: color.background(),\n transform: 'none',\n },\n }),\n\n ...((type === 'choice' || type === 'target') && outcome === 'incorrect' && {\n border: `1px solid ${color.incorrect()}`,\n }),\n\n ...((type === 'choice' || type === 'target') && outcome === 'correct' && {\n border: `1px solid ${color.correct()}`,\n }),\n\n ...(!label && {\n border: 'none',\n '&:hover': {\n backgroundColor: 'unset',\n },\n }),\n}));\n\nconst TileContent = (props) => {\n const { type, isDragging, empty, isOver, label, disabled, outcome, guideIndex } = props;\n\n if (empty) {\n return <Holder type={type} index={guideIndex} isOver={isOver} disabled={disabled} />;\n } else {\n return (\n <StyledTileContent\n type={type}\n isDragging={isDragging}\n isOver={isOver}\n disabled={disabled}\n outcome={outcome}\n label={label}\n dangerouslySetInnerHTML={{ __html: label }}\n />\n );\n }\n};\n\nexport const Tile = (props) => {\n const {\n label,\n type,\n id,\n empty,\n disabled,\n outcome,\n index,\n guideIndex,\n instanceId,\n draggable,\n tileIndex,\n } = props;\n\n // Use type + tileIndex in the IDs to guarantee uniqueness in all modes.\n // In includeTargets mode, a choice (id:'c1', type:'choice') and a target (id:'c1', type:'target')\n // can coexist — the type differentiates them.\n // tileIndex (array position from tiler) ensures empty placeholders are also unique.\n const dragId = `tile-${type}-${id != null ? id : 'empty'}-${tileIndex}-${instanceId}`;\n const dropId = `drop-${type}-${id != null ? id : 'empty'}-${tileIndex}-${instanceId}`;\n\n const {\n attributes,\n listeners,\n setNodeRef: setDragRef,\n transform,\n isDragging,\n } = useDraggable({\n id: dragId,\n data: {\n id,\n type,\n instanceId,\n value: label,\n index\n },\n disabled: !draggable || disabled,\n });\n\n const {\n setNodeRef: setDropRef,\n isOver: dropIsOver,\n } = useDroppable({\n id: dropId,\n data: {\n id,\n type,\n instanceId,\n value: label,\n index\n },\n // Disable droppable on the tile currently being dragged so closestCenter\n // cannot pick it as the drop target (prevents self-collision and wrong matches).\n disabled: isDragging,\n });\n\n const ref = React.useRef(null);\n\n React.useEffect(() => {\n const currentRef = ref.current;\n\n const handleTouchStart = (e) => {\n e.preventDefault(); // Prevent the default touch event behavior\n };\n\n if (currentRef) {\n currentRef.addEventListener('touchstart', handleTouchStart, { passive: false });\n }\n\n return () => {\n if (currentRef) {\n currentRef.removeEventListener('touchstart', handleTouchStart);\n }\n };\n }, []);\n\n const setRefs = (element) => {\n ref.current = element;\n setDragRef(element);\n setDropRef(element);\n };\n\n log('[render], props: ', props);\n\n const style = {\n transform: transform ? `translate3d(${transform.x}px, ${transform.y}px, 0)` : undefined,\n boxSizing: 'border-box',\n overflow: 'visible',\n padding: 0,\n margin: 0,\n textAlign: 'center',\n pointerEvents: 'auto',\n cursor: disabled ? 'not-allowed' : (isDragging ? 'grabbing' : 'grab'),\n zIndex: isDragging ? 1000 : 'auto',\n willChange: isDragging ? 'transform' : 'auto',\n };\n\n return (\n <div\n ref={setRefs}\n style={style}\n {...(draggable && !disabled ? { ...listeners, ...attributes } : {})}\n >\n <TileContent\n label={label}\n id={id}\n empty={empty}\n index={index}\n guideIndex={guideIndex}\n isOver={dropIsOver}\n isDragging={isDragging}\n disabled={disabled}\n outcome={outcome}\n type={type}\n />\n </div>\n );\n};\n\nTile.propTypes = {\n id: PropTypes.any,\n label: PropTypes.string,\n isOver: PropTypes.bool,\n type: PropTypes.string,\n empty: PropTypes.bool,\n disabled: PropTypes.bool,\n outcome: PropTypes.string,\n index: PropTypes.number,\n guideIndex: PropTypes.number,\n instanceId: PropTypes.any,\n draggable: PropTypes.bool,\n tileIndex: PropTypes.number,\n};\n\nexport default Tile;\n"],"mappings":"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","ignoreList":[]}
|
package/lib/tiler.js
CHANGED
|
@@ -17,10 +17,7 @@ const types = {
|
|
|
17
17
|
disabled: _propTypes.default.bool,
|
|
18
18
|
tiles: _propTypes.default.array.isRequired,
|
|
19
19
|
tileSize: _propTypes.default.string,
|
|
20
|
-
addGuide: _propTypes.default.bool
|
|
21
|
-
selectedChoice: _propTypes.default.object,
|
|
22
|
-
onChoiceClick: _propTypes.default.func,
|
|
23
|
-
onPlacementClick: _propTypes.default.func
|
|
20
|
+
addGuide: _propTypes.default.bool
|
|
24
21
|
};
|
|
25
22
|
const defaults = {
|
|
26
23
|
tileSize: '1fr',
|
|
@@ -34,9 +31,6 @@ const buildTiles = props => {
|
|
|
34
31
|
tile.guideIndex = props.addGuide ? tile.index + 1 : undefined;
|
|
35
32
|
// unique key for dnd-kit IDs
|
|
36
33
|
tile.tileIndex = index;
|
|
37
|
-
tile.selectedChoice = props.selectedChoice;
|
|
38
|
-
tile.onChoiceClick = props.onChoiceClick;
|
|
39
|
-
tile.onPlacementClick = props.onPlacementClick;
|
|
40
34
|
if (props.includeTargets) {
|
|
41
35
|
return /*#__PURE__*/_react.default.createElement(_tile.default, (0, _extends2.default)({}, tile, {
|
|
42
36
|
key: index
|
package/lib/tiler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tiler.js","names":["_propTypes","_interopRequireDefault","require","_react","_styles","_tile","types","choiceLabel","PropTypes","string","targetLabel","disabled","bool","tiles","array","isRequired","tileSize","addGuide","selectedChoice","object","onChoiceClick","func","onPlacementClick","defaults","buildTiles","props","T","tile","index","instanceId","guideIndex","undefined","tileIndex","includeTargets","default","createElement","_extends2","key","type","label","propTypes","StyledHTilerContainer","styled","theme","display","paddingBottom","spacing","gridGap","StyledChoiceLabel","textAlign","StyledTargetLabel","gridRow","StyledVTilerContainer","gridAutoFlow","StyledVChoiceLabel","gridColumn","StyledVTargetLabel","HorizontalTiler","React","Component","render","choiceLabelEnabled","rows","columns","length","style","gridTemplateColumns","Math","floor","gridTemplateRows","labelStyle","dangerouslySetInnerHTML","__html","map","exports","_defineProperty2","VerticalTiler"],"sources":["../src/tiler.jsx"],"sourcesContent":["import PropTypes from 'prop-types';\nimport React from 'react';\nimport { styled } from '@mui/material/styles';\n\nimport Tile from './tile';\n\nconst types = {\n choiceLabel: PropTypes.string,\n targetLabel: PropTypes.string,\n disabled: PropTypes.bool,\n tiles: PropTypes.array.isRequired,\n tileSize: PropTypes.string,\n addGuide: PropTypes.bool,\n selectedChoice: PropTypes.object,\n onChoiceClick: PropTypes.func,\n onPlacementClick: PropTypes.func,\n};\n\nconst defaults = {\n tileSize: '1fr',\n disabled: false,\n addGuide: false,\n};\n\nconst buildTiles = (props) => {\n const T = (tile, index) => {\n tile.instanceId = props.instanceId;\n tile.disabled = props.disabled;\n tile.guideIndex = props.addGuide ? tile.index + 1 : undefined;\n // unique key for dnd-kit IDs\n tile.tileIndex = index;\n tile.selectedChoice = props.selectedChoice;\n tile.onChoiceClick = props.onChoiceClick;\n tile.onPlacementClick = props.onPlacementClick;\n\n if (props.includeTargets) {\n return <Tile {...tile} key={index} />;\n } else {\n return tile.type === 'choice' ? <Tile {...tile} key={index} /> : <Tile {...tile} label=\"\" key={index} />;\n }\n };\n\n T.propTypes = { ...types };\n return T;\n};\n\nconst StyledHTilerContainer = styled('div')(({ theme, includeTargets }) => ({\n display: 'grid',\n paddingBottom: theme.spacing(2),\n ...(includeTargets && {\n gridGap: '10px',\n }),\n}));\n\nconst StyledChoiceLabel = styled('div')({\n textAlign: 'center',\n});\n\nconst StyledTargetLabel = styled('div')({\n textAlign: 'center',\n gridRow: '3/4',\n});\n\nconst StyledVTilerContainer = styled('div')(({ includeTargets }) => ({\n gridAutoFlow: 'column',\n display: 'grid',\n ...(includeTargets && {\n gridGap: '10px',\n }),\n}));\n\nconst StyledVChoiceLabel = styled('div')({\n gridColumn: '1/2',\n textAlign: 'center',\n});\n\nconst StyledVTargetLabel = styled('div')({\n gridColumn: '2/3',\n textAlign: 'center',\n});\n\nexport class HorizontalTiler extends React.Component {\n static propTypes = { ...types };\n static defaultProps = { ...defaults };\n render() {\n const { includeTargets, choiceLabelEnabled, choiceLabel, targetLabel, tiles, tileSize } = this.props;\n\n const rows = includeTargets ? `auto ${tileSize} auto ${tileSize}` : `auto ${tileSize} auto`;\n const columns = includeTargets ? tiles.length / 2 : tiles.length;\n\n const style = {\n gridTemplateColumns: includeTargets\n ? `repeat(${columns}, ${tileSize})`\n : `auto repeat(${Math.floor(columns / 2) - 1}, ${tileSize} 10px) ${tileSize} auto`,\n gridTemplateRows: rows,\n };\n\n const labelStyle = {\n gridColumn: `1/${columns + 1}`,\n };\n\n return (\n <StyledHTilerContainer includeTargets={includeTargets} style={style}>\n <StyledChoiceLabel\n style={labelStyle}\n dangerouslySetInnerHTML={{ __html: choiceLabelEnabled ? choiceLabel : '' }}\n />\n {includeTargets && (\n <StyledTargetLabel style={labelStyle} dangerouslySetInnerHTML={{ __html: targetLabel }} />\n )}\n {tiles.map(buildTiles(this.props))}\n </StyledHTilerContainer>\n );\n }\n}\n\nexport class VerticalTiler extends React.Component {\n static propTypes = { ...types };\n static defaultProps = { ...defaults };\n render() {\n const { includeTargets, choiceLabelEnabled, choiceLabel, targetLabel, tiles, tileSize } = this.props;\n\n const columns = includeTargets ? 2 : 1;\n const rows = includeTargets ? tiles.length / 2 : tiles.length;\n\n const style = {\n gridTemplateColumns: `repeat(${columns}, ${tileSize})`,\n gridTemplateRows: includeTargets\n ? `auto repeat(${rows}, ${tileSize})`\n : `auto auto repeat(${Math.floor(rows / 2) - 1}, ${tileSize} 10px) ${tileSize} auto`,\n };\n\n return (\n <StyledVTilerContainer includeTargets={includeTargets} style={style}>\n <StyledVChoiceLabel\n dangerouslySetInnerHTML={{ __html: choiceLabelEnabled ? choiceLabel : '' }}\n />\n\n {includeTargets && <StyledVTargetLabel dangerouslySetInnerHTML={{ __html: targetLabel }} />}\n {tiles.map(buildTiles(this.props))}\n </StyledVTilerContainer>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"tiler.js","names":["_propTypes","_interopRequireDefault","require","_react","_styles","_tile","types","choiceLabel","PropTypes","string","targetLabel","disabled","bool","tiles","array","isRequired","tileSize","addGuide","defaults","buildTiles","props","T","tile","index","instanceId","guideIndex","undefined","tileIndex","includeTargets","default","createElement","_extends2","key","type","label","propTypes","StyledHTilerContainer","styled","theme","display","paddingBottom","spacing","gridGap","StyledChoiceLabel","textAlign","StyledTargetLabel","gridRow","StyledVTilerContainer","gridAutoFlow","StyledVChoiceLabel","gridColumn","StyledVTargetLabel","HorizontalTiler","React","Component","render","choiceLabelEnabled","rows","columns","length","style","gridTemplateColumns","Math","floor","gridTemplateRows","labelStyle","dangerouslySetInnerHTML","__html","map","exports","_defineProperty2","VerticalTiler"],"sources":["../src/tiler.jsx"],"sourcesContent":["import PropTypes from 'prop-types';\nimport React from 'react';\nimport { styled } from '@mui/material/styles';\n\nimport Tile from './tile';\n\nconst types = {\n choiceLabel: PropTypes.string,\n targetLabel: PropTypes.string,\n disabled: PropTypes.bool,\n tiles: PropTypes.array.isRequired,\n tileSize: PropTypes.string,\n addGuide: PropTypes.bool,\n};\n\nconst defaults = {\n tileSize: '1fr',\n disabled: false,\n addGuide: false,\n};\n\nconst buildTiles = (props) => {\n const T = (tile, index) => {\n tile.instanceId = props.instanceId;\n tile.disabled = props.disabled;\n tile.guideIndex = props.addGuide ? tile.index + 1 : undefined;\n // unique key for dnd-kit IDs\n tile.tileIndex = index;\n\n if (props.includeTargets) {\n return <Tile {...tile} key={index} />;\n } else {\n return tile.type === 'choice' ? <Tile {...tile} key={index} /> : <Tile {...tile} label=\"\" key={index} />;\n }\n };\n\n T.propTypes = { ...types };\n return T;\n};\n\nconst StyledHTilerContainer = styled('div')(({ theme, includeTargets }) => ({\n display: 'grid',\n paddingBottom: theme.spacing(2),\n ...(includeTargets && {\n gridGap: '10px',\n }),\n}));\n\nconst StyledChoiceLabel = styled('div')({\n textAlign: 'center',\n});\n\nconst StyledTargetLabel = styled('div')({\n textAlign: 'center',\n gridRow: '3/4',\n});\n\nconst StyledVTilerContainer = styled('div')(({ includeTargets }) => ({\n gridAutoFlow: 'column',\n display: 'grid',\n ...(includeTargets && {\n gridGap: '10px',\n }),\n}));\n\nconst StyledVChoiceLabel = styled('div')({\n gridColumn: '1/2',\n textAlign: 'center',\n});\n\nconst StyledVTargetLabel = styled('div')({\n gridColumn: '2/3',\n textAlign: 'center',\n});\n\nexport class HorizontalTiler extends React.Component {\n static propTypes = { ...types };\n static defaultProps = { ...defaults };\n render() {\n const { includeTargets, choiceLabelEnabled, choiceLabel, targetLabel, tiles, tileSize } = this.props;\n\n const rows = includeTargets ? `auto ${tileSize} auto ${tileSize}` : `auto ${tileSize} auto`;\n const columns = includeTargets ? tiles.length / 2 : tiles.length;\n\n const style = {\n gridTemplateColumns: includeTargets\n ? `repeat(${columns}, ${tileSize})`\n : `auto repeat(${Math.floor(columns / 2) - 1}, ${tileSize} 10px) ${tileSize} auto`,\n gridTemplateRows: rows,\n };\n\n const labelStyle = {\n gridColumn: `1/${columns + 1}`,\n };\n\n return (\n <StyledHTilerContainer includeTargets={includeTargets} style={style}>\n <StyledChoiceLabel\n style={labelStyle}\n dangerouslySetInnerHTML={{ __html: choiceLabelEnabled ? choiceLabel : '' }}\n />\n {includeTargets && (\n <StyledTargetLabel style={labelStyle} dangerouslySetInnerHTML={{ __html: targetLabel }} />\n )}\n {tiles.map(buildTiles(this.props))}\n </StyledHTilerContainer>\n );\n }\n}\n\nexport class VerticalTiler extends React.Component {\n static propTypes = { ...types };\n static defaultProps = { ...defaults };\n render() {\n const { includeTargets, choiceLabelEnabled, choiceLabel, targetLabel, tiles, tileSize } = this.props;\n\n const columns = includeTargets ? 2 : 1;\n const rows = includeTargets ? tiles.length / 2 : tiles.length;\n\n const style = {\n gridTemplateColumns: `repeat(${columns}, ${tileSize})`,\n gridTemplateRows: includeTargets\n ? `auto repeat(${rows}, ${tileSize})`\n : `auto auto repeat(${Math.floor(rows / 2) - 1}, ${tileSize} 10px) ${tileSize} auto`,\n };\n\n return (\n <StyledVTilerContainer includeTargets={includeTargets} style={style}>\n <StyledVChoiceLabel\n dangerouslySetInnerHTML={{ __html: choiceLabelEnabled ? choiceLabel : '' }}\n />\n\n {includeTargets && <StyledVTargetLabel dangerouslySetInnerHTML={{ __html: targetLabel }} />}\n {tiles.map(buildTiles(this.props))}\n </StyledVTilerContainer>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/placement-ordering",
|
|
3
3
|
"repository": "pie-framework/pie-elements",
|
|
4
|
-
"version": "14.3.
|
|
4
|
+
"version": "14.3.2-beta.2",
|
|
5
5
|
"description": "",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@dnd-kit/core": "6.3.1",
|
|
11
|
-
"@dnd-kit/modifiers": "9.0.0",
|
|
12
11
|
"@emotion/react": "^11.14.0",
|
|
13
12
|
"@emotion/style": "^0.8.0",
|
|
14
13
|
"@mui/icons-material": "^7.3.4",
|
|
15
14
|
"@mui/material": "^7.3.4",
|
|
16
15
|
"@pie-framework/pie-player-events": "^0.1.0",
|
|
17
|
-
"@pie-lib/correct-answer-toggle": "4.0.
|
|
18
|
-
"@pie-lib/drag": "4.
|
|
16
|
+
"@pie-lib/correct-answer-toggle": "4.0.5",
|
|
17
|
+
"@pie-lib/drag": "4.0.6",
|
|
19
18
|
"@pie-lib/math-rendering": "5.1.0",
|
|
20
|
-
"@pie-lib/render-ui": "
|
|
19
|
+
"@pie-lib/render-ui": "6.1.3",
|
|
21
20
|
"@pie-lib/translator": "4.0.2",
|
|
22
21
|
"debug": "^4.1.1",
|
|
23
22
|
"decimal.js": "^10.0.0",
|
|
@@ -29,7 +28,7 @@
|
|
|
29
28
|
},
|
|
30
29
|
"author": "",
|
|
31
30
|
"license": "ISC",
|
|
32
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "fcf6139719821e97ab40cb60e9a953fe427d86a4",
|
|
33
32
|
"scripts": {
|
|
34
33
|
"postpublish": "../../scripts/postpublish"
|
|
35
34
|
},
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.closestDroppableKeyboardCoordinates = void 0;
|
|
7
|
-
var _core = require("@dnd-kit/core");
|
|
8
|
-
/**
|
|
9
|
-
* Custom keyboard coordinate getter for placement-ordering's Tab-based placement mode
|
|
10
|
-
* (enabled only when the item is configured with `placementArea` / `includeTargets`).
|
|
11
|
-
*
|
|
12
|
-
* Tab/Shift+Tab cycle the dragged choice directly onto the next/previous enabled
|
|
13
|
-
* droppable (a placement/target tile, or an empty gap left behind in the choices row),
|
|
14
|
-
* in real on-screen position order, placing the dragged item's own top-left corner at
|
|
15
|
-
* the target's center-left point.
|
|
16
|
-
*
|
|
17
|
-
* Arrow keys are delegated to dnd-kit's own `defaultKeyboardCoordinateGetter` so the
|
|
18
|
-
* pre-existing free-form arrow-key dragging behavior is left completely unchanged.
|
|
19
|
-
*
|
|
20
|
-
* The tile currently being dragged already disables its own droppable
|
|
21
|
-
* (see `useDroppable({ disabled: isDragging })` in tile.jsx), so it's naturally
|
|
22
|
-
* excluded from the candidate list here without any extra bookkeeping.
|
|
23
|
-
*
|
|
24
|
-
* When picking up a choice from the choices row, the other not-yet-placed choice
|
|
25
|
-
* tiles are also registered droppables (tile.jsx disables a droppable only while it's
|
|
26
|
-
* the one being dragged), but dropping a choice onto another choice is a no-op in the
|
|
27
|
-
* reducer (ordering.js's updateResponse has no `choice -> choice` case) — so they're
|
|
28
|
-
* excluded from the Tab/Shift+Tab cycle, leaving only the real placement targets.
|
|
29
|
-
*/
|
|
30
|
-
const closestDroppableKeyboardCoordinates = (event, {
|
|
31
|
-
active,
|
|
32
|
-
context,
|
|
33
|
-
currentCoordinates
|
|
34
|
-
}) => {
|
|
35
|
-
const {
|
|
36
|
-
code
|
|
37
|
-
} = event;
|
|
38
|
-
const isTab = code === 'Tab';
|
|
39
|
-
const isArrow = code === _core.KeyboardCode.Down || code === _core.KeyboardCode.Up || code === _core.KeyboardCode.Left || code === _core.KeyboardCode.Right;
|
|
40
|
-
if (!isTab && !isArrow) {
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
43
|
-
if (isArrow) {
|
|
44
|
-
return (0, _core.defaultKeyboardCoordinateGetter)(event, {
|
|
45
|
-
context,
|
|
46
|
-
currentCoordinates
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
event.preventDefault();
|
|
50
|
-
const {
|
|
51
|
-
droppableRects,
|
|
52
|
-
droppableContainers,
|
|
53
|
-
collisionRect
|
|
54
|
-
} = context;
|
|
55
|
-
if (!droppableRects || droppableRects.size === 0) {
|
|
56
|
-
return currentCoordinates;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// `currentCoordinates` is the top-left of the dragged item's collision rect (not its
|
|
60
|
-
// center), so derive the dragged item's center in the same frame before comparing it
|
|
61
|
-
// against droppable centers below.
|
|
62
|
-
const draggedHalfSize = {
|
|
63
|
-
x: (collisionRect?.width || 0) / 2,
|
|
64
|
-
y: (collisionRect?.height || 0) / 2
|
|
65
|
-
};
|
|
66
|
-
const currentCenter = {
|
|
67
|
-
x: currentCoordinates.x + draggedHalfSize.x,
|
|
68
|
-
y: currentCoordinates.y + draggedHalfSize.y
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
// Only exclude other choice tiles while dragging a choice; dragging a placed target
|
|
72
|
-
// back onto a choice-row gap is still a valid "return to pool" destination.
|
|
73
|
-
const activeType = active?.data?.current?.type;
|
|
74
|
-
const excludeChoiceDroppables = activeType === 'choice';
|
|
75
|
-
const targets = [];
|
|
76
|
-
for (const [id, container] of droppableContainers) {
|
|
77
|
-
if (container?.disabled) continue;
|
|
78
|
-
if (excludeChoiceDroppables && container?.data?.current?.type === 'choice') continue;
|
|
79
|
-
const rect = droppableRects.get(id);
|
|
80
|
-
if (!rect) continue;
|
|
81
|
-
const center = {
|
|
82
|
-
x: rect.left + rect.width / 2,
|
|
83
|
-
y: rect.top + rect.height / 2
|
|
84
|
-
};
|
|
85
|
-
// Land the dragged item's own top-left corner at the target's center-left point,
|
|
86
|
-
// rather than at the target's own top-left corner.
|
|
87
|
-
const dropPosition = {
|
|
88
|
-
x: rect.left,
|
|
89
|
-
y: rect.top + rect.height / 2
|
|
90
|
-
};
|
|
91
|
-
targets.push({
|
|
92
|
-
id,
|
|
93
|
-
dropPosition,
|
|
94
|
-
center
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
if (targets.length === 0) {
|
|
98
|
-
return currentCoordinates;
|
|
99
|
-
}
|
|
100
|
-
const reverse = event.shiftKey;
|
|
101
|
-
|
|
102
|
-
// Sort targets by real on-screen position (top to bottom, then left to right), so
|
|
103
|
-
// this works the same whether the tiler is laid out vertically or horizontally.
|
|
104
|
-
targets.sort((a, b) => {
|
|
105
|
-
if (Math.abs(a.center.y - b.center.y) > 10) return a.center.y - b.center.y;
|
|
106
|
-
return a.center.x - b.center.x;
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
// Find the current target (closest to current coordinates)
|
|
110
|
-
let currentIndex = 0;
|
|
111
|
-
let minDist = Infinity;
|
|
112
|
-
for (let i = 0; i < targets.length; i++) {
|
|
113
|
-
const dist = distance(currentCenter, targets[i].center);
|
|
114
|
-
if (dist < minDist) {
|
|
115
|
-
minDist = dist;
|
|
116
|
-
currentIndex = i;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
const nextIndex = reverse ? (currentIndex - 1 + targets.length) % targets.length : (currentIndex + 1) % targets.length;
|
|
120
|
-
return targets[nextIndex].dropPosition;
|
|
121
|
-
};
|
|
122
|
-
exports.closestDroppableKeyboardCoordinates = closestDroppableKeyboardCoordinates;
|
|
123
|
-
const distance = (a, b) => Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);
|
|
124
|
-
//# sourceMappingURL=keyboard-coordinates.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard-coordinates.js","names":["_core","require","closestDroppableKeyboardCoordinates","event","active","context","currentCoordinates","code","isTab","isArrow","KeyboardCode","Down","Up","Left","Right","undefined","defaultKeyboardCoordinateGetter","preventDefault","droppableRects","droppableContainers","collisionRect","size","draggedHalfSize","x","width","y","height","currentCenter","activeType","data","current","type","excludeChoiceDroppables","targets","id","container","disabled","rect","get","center","left","top","dropPosition","push","length","reverse","shiftKey","sort","a","b","Math","abs","currentIndex","minDist","Infinity","i","dist","distance","nextIndex","exports","sqrt"],"sources":["../src/keyboard-coordinates.js"],"sourcesContent":["import { defaultKeyboardCoordinateGetter, KeyboardCode } from '@dnd-kit/core';\n\n/**\n * Custom keyboard coordinate getter for placement-ordering's Tab-based placement mode\n * (enabled only when the item is configured with `placementArea` / `includeTargets`).\n *\n * Tab/Shift+Tab cycle the dragged choice directly onto the next/previous enabled\n * droppable (a placement/target tile, or an empty gap left behind in the choices row),\n * in real on-screen position order, placing the dragged item's own top-left corner at\n * the target's center-left point.\n *\n * Arrow keys are delegated to dnd-kit's own `defaultKeyboardCoordinateGetter` so the\n * pre-existing free-form arrow-key dragging behavior is left completely unchanged.\n *\n * The tile currently being dragged already disables its own droppable\n * (see `useDroppable({ disabled: isDragging })` in tile.jsx), so it's naturally\n * excluded from the candidate list here without any extra bookkeeping.\n *\n * When picking up a choice from the choices row, the other not-yet-placed choice\n * tiles are also registered droppables (tile.jsx disables a droppable only while it's\n * the one being dragged), but dropping a choice onto another choice is a no-op in the\n * reducer (ordering.js's updateResponse has no `choice -> choice` case) — so they're\n * excluded from the Tab/Shift+Tab cycle, leaving only the real placement targets.\n */\nexport const closestDroppableKeyboardCoordinates = (event, { active, context, currentCoordinates }) => {\n const { code } = event;\n const isTab = code === 'Tab';\n const isArrow =\n code === KeyboardCode.Down || code === KeyboardCode.Up || code === KeyboardCode.Left || code === KeyboardCode.Right;\n\n if (!isTab && !isArrow) {\n return undefined;\n }\n\n if (isArrow) {\n return defaultKeyboardCoordinateGetter(event, { context, currentCoordinates });\n }\n\n event.preventDefault();\n\n const { droppableRects, droppableContainers, collisionRect } = context;\n\n if (!droppableRects || droppableRects.size === 0) {\n return currentCoordinates;\n }\n\n // `currentCoordinates` is the top-left of the dragged item's collision rect (not its\n // center), so derive the dragged item's center in the same frame before comparing it\n // against droppable centers below.\n const draggedHalfSize = {\n x: (collisionRect?.width || 0) / 2,\n y: (collisionRect?.height || 0) / 2,\n };\n const currentCenter = {\n x: currentCoordinates.x + draggedHalfSize.x,\n y: currentCoordinates.y + draggedHalfSize.y,\n };\n\n // Only exclude other choice tiles while dragging a choice; dragging a placed target\n // back onto a choice-row gap is still a valid \"return to pool\" destination.\n const activeType = active?.data?.current?.type;\n const excludeChoiceDroppables = activeType === 'choice';\n\n const targets = [];\n\n for (const [id, container] of droppableContainers) {\n if (container?.disabled) continue;\n\n if (excludeChoiceDroppables && container?.data?.current?.type === 'choice') continue;\n\n const rect = droppableRects.get(id);\n\n if (!rect) continue;\n\n const center = {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n };\n // Land the dragged item's own top-left corner at the target's center-left point,\n // rather than at the target's own top-left corner.\n const dropPosition = {\n x: rect.left,\n y: rect.top + rect.height / 2,\n };\n\n targets.push({ id, dropPosition, center });\n }\n\n if (targets.length === 0) {\n return currentCoordinates;\n }\n\n const reverse = event.shiftKey;\n\n // Sort targets by real on-screen position (top to bottom, then left to right), so\n // this works the same whether the tiler is laid out vertically or horizontally.\n targets.sort((a, b) => {\n if (Math.abs(a.center.y - b.center.y) > 10) return a.center.y - b.center.y;\n return a.center.x - b.center.x;\n });\n\n // Find the current target (closest to current coordinates)\n let currentIndex = 0;\n let minDist = Infinity;\n\n for (let i = 0; i < targets.length; i++) {\n const dist = distance(currentCenter, targets[i].center);\n\n if (dist < minDist) {\n minDist = dist;\n currentIndex = i;\n }\n }\n\n const nextIndex = reverse\n ? (currentIndex - 1 + targets.length) % targets.length\n : (currentIndex + 1) % targets.length;\n\n return targets[nextIndex].dropPosition;\n};\n\nconst distance = (a, b) => Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);\n"],"mappings":"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","ignoreList":[]}
|