@solibo/solibo-ui 1.0.7 → 1.0.10
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/assets/index.css +1 -1
- package/dist/assets/index15.css +1 -1
- package/dist/assets/index19.css +1 -1
- package/dist/assets/index32.css +1 -1
- package/dist/assets/index38.css +1 -1
- package/dist/assets/index39.css +1 -1
- package/dist/assets/index46.css +1 -1
- package/dist/assets/index51.css +1 -1
- package/dist/assets/index8.css +1 -1
- package/dist/assets/index9.css +1 -1
- package/dist/components/card/index.cjs +1 -1
- package/dist/components/card/index.js +45 -45
- package/dist/components/dialog/index.cjs +1 -1
- package/dist/components/dialog/index.cjs.map +1 -1
- package/dist/components/dialog/index.js +39 -37
- package/dist/components/dialog/index.js.map +1 -1
- package/dist/components/dropdown/index.cjs +1 -1
- package/dist/components/dropdown/index.js +70 -70
- package/dist/components/editor/index.cjs +25 -25
- package/dist/components/editor/index.cjs.map +1 -1
- package/dist/components/editor/index.js +1561 -1550
- package/dist/components/editor/index.js.map +1 -1
- package/dist/components/icon/index.cjs +1 -1
- package/dist/components/icon/index.js +22 -22
- package/dist/components/iframe/index.cjs +1 -1
- package/dist/components/iframe/index.cjs.map +1 -1
- package/dist/components/iframe/index.js +46 -49
- package/dist/components/iframe/index.js.map +1 -1
- package/dist/components/message/index.cjs +1 -1
- package/dist/components/message/index.js +18 -18
- package/dist/components/popover/index.cjs +1 -1
- package/dist/components/popover/index.cjs.map +1 -1
- package/dist/components/popover/index.js +10 -10
- package/dist/components/popover/index.js.map +1 -1
- package/dist/components/search/index.cjs +1 -1
- package/dist/components/search/index.js +29 -29
- package/dist/components/select/index.cjs +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/sortable/index.cjs +1 -1
- package/dist/components/sortable/index.cjs.map +1 -1
- package/dist/components/sortable/index.js +141 -134
- package/dist/components/sortable/index.js.map +1 -1
- package/dist/{index-oL8GYbhj.cjs → index-BPIK2dxs.cjs} +2 -2
- package/dist/{index-oL8GYbhj.cjs.map → index-BPIK2dxs.cjs.map} +1 -1
- package/dist/{index-CMfR_USP.js → index-C_YiNpZP.js} +8 -8
- package/dist/{index-CMfR_USP.js.map → index-C_YiNpZP.js.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +13 -2
- package/dist/index.js +37 -36
- package/dist/tokens.css +3 -1
- package/dist/tokens.json +46 -19
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/popover/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport {\n type AriaAttributes,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '@/components/button';\n\nimport styles from './styles.module.css';\n\nexport type PopoverCloseOptions = {\n restoreFocus?: boolean;\n};\n\nexport type PopoverInitialFocus = 'first' | 'last';\n\nexport type PopoverRenderProps = {\n close: (options?: PopoverCloseOptions) => void;\n initialFocus?: PopoverInitialFocus;\n isOpen: boolean;\n};\n\ntype PopoverOpenOptions = {\n initialFocus?: PopoverInitialFocus;\n};\n\nexport type PopoverProps = {\n children: ReactNode | ((props: PopoverRenderProps) => ReactNode);\n inline?: boolean;\n position?: 'auto' | 'left' | 'right';\n triggerAccessibleLabel?: string;\n triggerAriaHasPopup?: AriaAttributes['aria-haspopup'];\n triggerButtonContent: ReactNode;\n};\n\nexport const Popover = ({\n children,\n inline = false,\n position = 'left',\n triggerAccessibleLabel,\n triggerAriaHasPopup,\n triggerButtonContent,\n}: PopoverProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const initialFocusRef = useRef<PopoverInitialFocus | undefined>(undefined);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const triggerRef = useRef<HTMLButtonElement | HTMLSpanElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n const [opensAbove, setOpensAbove] = useState(false);\n const preferredHorizontalPlacement = position === 'auto' ? 'right' : position;\n const [horizontalPlacement, setHorizontalPlacement] = useState<'left' | 'right'>(\n preferredHorizontalPlacement\n );\n\n const openPopover = ({ initialFocus }: PopoverOpenOptions = {}) => {\n initialFocusRef.current = initialFocus;\n setOpensAbove(false);\n setHorizontalPlacement(preferredHorizontalPlacement);\n setIsOpen(true);\n };\n\n const closePopover = useCallback(({ restoreFocus = true }: PopoverCloseOptions = {}) => {\n setIsOpen(false);\n\n if (restoreFocus) {\n triggerRef.current?.focus();\n }\n }, []);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isOpen && event.key === 'Escape') {\n closePopover();\n }\n };\n\n const handleTriggerKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (isOpen) {\n return;\n }\n\n if (inline && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n openPopover();\n return;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n openPopover({ initialFocus: 'first' });\n return;\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n openPopover({ initialFocus: 'last' });\n }\n };\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (containerRef.current?.contains(target) || panelRef.current?.contains(target)) return;\n\n closePopover({ restoreFocus: false });\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n\n return () => {\n document.removeEventListener('mousedown', handlePointerDown);\n };\n }, [closePopover, isOpen]);\n\n const updatePosition = useCallback(() => {\n const panel = panelRef.current;\n const trigger = triggerRef.current;\n if (!panel || !trigger) return;\n\n const panelBounds = panel.getBoundingClientRect();\n const triggerBounds = trigger.getBoundingClientRect();\n const spaceAbove = triggerBounds.top;\n const spaceBelow = window.innerHeight - triggerBounds.bottom;\n\n setOpensAbove(panelBounds.height > spaceBelow && spaceAbove > spaceBelow);\n setHorizontalPlacement(\n position === 'auto' &&\n panelBounds.width > window.innerWidth - triggerBounds.left &&\n triggerBounds.right > window.innerWidth - triggerBounds.left\n ? 'left'\n : preferredHorizontalPlacement\n );\n }, [position, preferredHorizontalPlacement]);\n\n useLayoutEffect(() => {\n if (!isOpen) return undefined;\n\n updatePosition();\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n }, [isOpen, updatePosition]);\n\n const handleTriggerClick = (event: React.MouseEvent<HTMLElement>) => {\n if (inline) event.preventDefault();\n event.stopPropagation();\n if (isOpen) {\n closePopover({ restoreFocus: false });\n } else {\n openPopover();\n }\n };\n\n const triggerProps = {\n 'aria-controls': isOpen ? panelId : undefined,\n 'aria-expanded': isOpen,\n 'aria-haspopup': triggerAriaHasPopup,\n 'aria-label': triggerAccessibleLabel,\n className: inline ? styles['inline-trigger'] : styles.trigger,\n onClick: handleTriggerClick,\n onKeyDown: handleTriggerKeyDown,\n };\n\n const triggerBounds = inline ? triggerRef.current?.getBoundingClientRect() : undefined;\n const horizontalTransform = horizontalPlacement === 'left' ? 'translateX(-100%)' : '';\n const verticalTransform = opensAbove ? 'translateY(calc(-100% - var(--shape-spacing-2xs)))' : '';\n const inlineTransform = [horizontalTransform, verticalTransform].filter(Boolean).join(' ');\n const panel = isOpen ? (\n <div\n className={cx(\n styles['popover-panel'],\n styles[opensAbove ? 'above' : 'below'],\n inline && styles['inline-panel'],\n !inline && styles[horizontalPlacement]\n )}\n data-horizontal-placement={horizontalPlacement}\n data-placement={opensAbove ? 'above' : 'below'}\n id={panelId}\n ref={panelRef}\n style={\n triggerBounds\n ? {\n left: horizontalPlacement === 'left' ? triggerBounds.right : triggerBounds.left,\n position: 'fixed',\n top: opensAbove ? triggerBounds.top : triggerBounds.bottom,\n transform: inlineTransform || undefined,\n }\n : undefined\n }\n >\n {typeof children === 'function'\n ? children({ close: closePopover, initialFocus: initialFocusRef.current, isOpen })\n : children}\n </div>\n ) : null;\n\n return (\n <div\n className={cx(styles.popover, inline && styles.inline)}\n data-open={isOpen}\n onKeyDown={handleKeyDown}\n onClick={(event) => {\n if (inline) event.preventDefault();\n event.stopPropagation();\n }}\n ref={containerRef}\n >\n {inline ? (\n <span\n {...triggerProps}\n ref={triggerRef}\n role='button'\n tabIndex={0}\n >\n {triggerButtonContent}\n </span>\n ) : (\n <Button\n {...triggerProps}\n ref={triggerRef as React.Ref<HTMLButtonElement>}\n variant='secondary'\n >\n {triggerButtonContent}\n </Button>\n )}\n {inline && panel && typeof document !== 'undefined'\n ? createPortal(panel, document.body)\n : panel}\n </div>\n );\n};\n"],"names":["Popover","children","inline","position","triggerAccessibleLabel","triggerAriaHasPopup","triggerButtonContent","containerRef","useRef","initialFocusRef","undefined","panelRef","panelId","useId","triggerRef","isOpen","setIsOpen","useState","opensAbove","setOpensAbove","preferredHorizontalPlacement","horizontalPlacement","setHorizontalPlacement","openPopover","initialFocus","current","closePopover","useCallback","restoreFocus","focus","handleKeyDown","event","key","handleTriggerKeyDown","preventDefault","useEffect","handlePointerDown","target","contains","document","addEventListener","removeEventListener","updatePosition","panel","trigger","panelBounds","getBoundingClientRect","triggerBounds","spaceAbove","top","spaceBelow","window","innerHeight","bottom","height","width","innerWidth","left","right","useLayoutEffect","handleTriggerClick","stopPropagation","triggerProps","className","styles","onClick","onKeyDown","inlineTransform","filter","Boolean","join","jsx","cx","transform","close","jsxs","popover","Button","createPortal","body"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/popover/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport {\n type AriaAttributes,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '@/components/button';\n\nimport styles from './styles.module.css';\n\nexport type PopoverCloseOptions = {\n restoreFocus?: boolean;\n};\n\nexport type PopoverInitialFocus = 'first' | 'last';\n\nexport type PopoverRenderProps = {\n close: (options?: PopoverCloseOptions) => void;\n initialFocus?: PopoverInitialFocus;\n isOpen: boolean;\n};\n\ntype PopoverOpenOptions = {\n initialFocus?: PopoverInitialFocus;\n};\n\nexport type PopoverProps = {\n children: ReactNode | ((props: PopoverRenderProps) => ReactNode);\n inline?: boolean;\n position?: 'auto' | 'left' | 'right';\n triggerAccessibleLabel?: string;\n triggerAriaHasPopup?: AriaAttributes['aria-haspopup'];\n triggerButtonContent: ReactNode;\n};\n\nexport const Popover = ({\n children,\n inline = false,\n position = 'left',\n triggerAccessibleLabel,\n triggerAriaHasPopup,\n triggerButtonContent,\n}: PopoverProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const initialFocusRef = useRef<PopoverInitialFocus | undefined>(undefined);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const triggerRef = useRef<HTMLButtonElement | HTMLSpanElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n const [opensAbove, setOpensAbove] = useState(false);\n const preferredHorizontalPlacement = position === 'auto' ? 'right' : position;\n const [horizontalPlacement, setHorizontalPlacement] = useState<'left' | 'right'>(\n preferredHorizontalPlacement\n );\n\n const openPopover = ({ initialFocus }: PopoverOpenOptions = {}) => {\n initialFocusRef.current = initialFocus;\n setOpensAbove(false);\n setHorizontalPlacement(preferredHorizontalPlacement);\n setIsOpen(true);\n };\n\n const closePopover = useCallback(({ restoreFocus = true }: PopoverCloseOptions = {}) => {\n setIsOpen(false);\n\n if (restoreFocus) {\n triggerRef.current?.focus();\n }\n }, []);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isOpen && event.key === 'Escape') {\n closePopover();\n }\n };\n\n const handleTriggerKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (isOpen) {\n return;\n }\n\n if (inline && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n openPopover();\n return;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n openPopover({ initialFocus: 'first' });\n return;\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n openPopover({ initialFocus: 'last' });\n }\n };\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (containerRef.current?.contains(target) || panelRef.current?.contains(target)) return;\n\n closePopover({ restoreFocus: false });\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n\n return () => {\n document.removeEventListener('mousedown', handlePointerDown);\n };\n }, [closePopover, isOpen]);\n\n const updatePosition = useCallback(() => {\n const panel = panelRef.current;\n const trigger = triggerRef.current;\n if (!panel || !trigger) return;\n\n const panelBounds = panel.getBoundingClientRect();\n const triggerBounds = trigger.getBoundingClientRect();\n const spaceAbove = triggerBounds.top;\n const spaceBelow = window.innerHeight - triggerBounds.bottom;\n\n setOpensAbove(panelBounds.height > spaceBelow && spaceAbove > spaceBelow);\n setHorizontalPlacement(\n position === 'auto' &&\n panelBounds.width > window.innerWidth - triggerBounds.left &&\n triggerBounds.right > window.innerWidth - triggerBounds.left\n ? 'left'\n : preferredHorizontalPlacement\n );\n }, [position, preferredHorizontalPlacement]);\n\n useLayoutEffect(() => {\n if (!isOpen) return undefined;\n\n updatePosition();\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n }, [isOpen, updatePosition]);\n\n const handleTriggerClick = (event: React.MouseEvent<HTMLElement>) => {\n if (inline) event.preventDefault();\n event.stopPropagation();\n if (isOpen) {\n closePopover({ restoreFocus: false });\n } else {\n openPopover();\n }\n };\n\n const triggerProps = {\n 'aria-controls': isOpen ? panelId : undefined,\n 'aria-expanded': isOpen,\n 'aria-haspopup': triggerAriaHasPopup,\n 'aria-label': triggerAccessibleLabel,\n className: inline ? styles['inline-trigger'] : styles.trigger,\n onClick: handleTriggerClick,\n onKeyDown: handleTriggerKeyDown,\n };\n\n const triggerBounds = inline ? triggerRef.current?.getBoundingClientRect() : undefined;\n const horizontalTransform = horizontalPlacement === 'left' ? 'translateX(-100%)' : '';\n const verticalTransform = opensAbove ? 'translateY(calc(-100% - var(--shape-spacing-2xs)))' : '';\n const inlineTransform = [horizontalTransform, verticalTransform].filter(Boolean).join(' ');\n const panel = isOpen ? (\n <div\n className={cx(\n styles['popover-panel'],\n styles[opensAbove ? 'above' : 'below'],\n inline && styles['inline-panel'],\n !inline && styles[horizontalPlacement]\n )}\n data-horizontal-placement={horizontalPlacement}\n data-placement={opensAbove ? 'above' : 'below'}\n id={panelId}\n ref={panelRef}\n style={\n triggerBounds\n ? {\n left: horizontalPlacement === 'left' ? triggerBounds.right : triggerBounds.left,\n position: 'fixed',\n top: opensAbove ? triggerBounds.top : triggerBounds.bottom,\n transform: inlineTransform || undefined,\n }\n : undefined\n }\n >\n {typeof children === 'function'\n ? children({ close: closePopover, initialFocus: initialFocusRef.current, isOpen })\n : children}\n </div>\n ) : null;\n\n return (\n <div\n className={cx(styles.popover, inline && styles.inline)}\n data-open={isOpen}\n onKeyDown={handleKeyDown}\n onClick={(event) => {\n if (inline) event.preventDefault();\n event.stopPropagation();\n }}\n ref={containerRef}\n >\n {inline ? (\n <span\n {...triggerProps}\n ref={triggerRef}\n role='button'\n tabIndex={0}\n >\n {triggerButtonContent}\n </span>\n ) : (\n <Button\n {...triggerProps}\n ref={triggerRef as React.Ref<HTMLButtonElement>}\n variant='simple'\n >\n {triggerButtonContent}\n </Button>\n )}\n {inline && panel && typeof document !== 'undefined'\n ? createPortal(panel, document.body)\n : panel}\n </div>\n );\n};\n"],"names":["Popover","children","inline","position","triggerAccessibleLabel","triggerAriaHasPopup","triggerButtonContent","containerRef","useRef","initialFocusRef","undefined","panelRef","panelId","useId","triggerRef","isOpen","setIsOpen","useState","opensAbove","setOpensAbove","preferredHorizontalPlacement","horizontalPlacement","setHorizontalPlacement","openPopover","initialFocus","current","closePopover","useCallback","restoreFocus","focus","handleKeyDown","event","key","handleTriggerKeyDown","preventDefault","useEffect","handlePointerDown","target","contains","document","addEventListener","removeEventListener","updatePosition","panel","trigger","panelBounds","getBoundingClientRect","triggerBounds","spaceAbove","top","spaceBelow","window","innerHeight","bottom","height","width","innerWidth","left","right","useLayoutEffect","handleTriggerClick","stopPropagation","triggerProps","className","styles","onClick","onKeyDown","inlineTransform","filter","Boolean","join","jsx","cx","transform","close","jsxs","popover","Button","createPortal","body"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index9.css');const n=require("react/jsx-runtime"),h=require("react"),p=require("../button/index.cjs"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index9.css');const n=require("react/jsx-runtime"),h=require("react"),p=require("../button/index.cjs"),M=require("../checkbox/index.cjs"),N=require("../chip/index.cjs"),C=require("../controls/index.cjs"),I=require("../dialog/index.cjs"),O=require("../header/index.cjs"),R=require("../../index-CEzqxRIu.cjs"),w="_search_14b9n_3",B="_controls_14b9n_15",S="_chips_14b9n_29",o={search:w,controls:B,chips:S,"filter-groups":"_filter-groups_14b9n_36","filter-group":"_filter-group_14b9n_36"},T=({closeLabel:b="Close",filterButtonLabel:_="Filters",filterDialogTitle:m="Filters",filterGroups:l=[],onChange:j,onSelectedFiltersChange:c,removeFilterLabel:v=r=>`Remove ${r.label} filter`,resetLabel:g="Reset",searchLabel:y="Search",searchPlaceholder:k="Search",selectedFilters:t=[],value:f=""})=>{const r=h.useId(),[x,i]=h.useState(!1),q=h.useMemo(()=>new Map(l.flatMap(e=>e.options).map(e=>[e.value,e])),[l]),u=t.flatMap(e=>{const s=q.get(e);return s?[s]:[]}),d=(e,s)=>{c&&c(s?[...new Set([...t,e])]:t.filter(a=>a!==e))};return n.jsxs("div",{className:o.search,"data-component":"search",children:[n.jsxs("div",{className:o.controls,children:[n.jsx(R.Input,{"aria-label":y,icon:"search",onChange:e=>j(e.target.value),placeholder:k,type:"search",value:f}),l.length>0&&n.jsx(p.Button,{"aria-expanded":x,"aria-haspopup":"dialog",badge:u.length,icon:"funnel",onClick:()=>i(!0),variant:"tertiary",children:_})]}),u.length>0&&n.jsxs("div",{"aria-label":_,className:o.chips,children:[u.map(e=>n.jsx(N.Chip,{accessibleLabel:v(e),label:e.label,onClick:()=>d(e.value,!1),onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),d(e.value,!1))},role:"button"},e.value)),n.jsx(p.Button,{onClick:()=>c==null?void 0:c([]),variant:"tertiary",children:g})]}),x&&n.jsx(I.Dialog,{"aria-labelledby":r,controls:n.jsx(C.Controls,{children:n.jsx(p.Button,{onClick:()=>i(!1),children:b})}),header:n.jsx(O.Header,{children:n.jsx("h2",{id:r,children:m})}),open:!0,setOpen:i,children:n.jsx("div",{className:o["filter-groups"],children:l.map((e,s)=>n.jsxs("fieldset",{className:o["filter-group"],children:[e.label&&n.jsx("legend",{children:e.label}),e.options.map(a=>n.jsx(M.Checkbox,{checked:t.includes(a.value),label:a.label,onChange:D=>d(a.value,D.target.checked)},a.value))]},e.label??s))})})]})};exports.Search=T;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,52 +1,52 @@
|
|
|
1
1
|
import { jsxs as t, jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import { useId as
|
|
2
|
+
import { useId as C, useState as M, useMemo as w } from "react";
|
|
3
3
|
import { Button as d } from "../button/index.js";
|
|
4
|
-
import { Checkbox as
|
|
5
|
-
import { Chip as
|
|
6
|
-
import { Controls as
|
|
7
|
-
import { Dialog as
|
|
8
|
-
import { Header as
|
|
9
|
-
import { I as
|
|
10
|
-
import '../../assets/index9.css';const
|
|
11
|
-
search:
|
|
12
|
-
controls:
|
|
13
|
-
chips:
|
|
14
|
-
"filter-groups": "_filter-
|
|
15
|
-
"filter-group": "_filter-
|
|
4
|
+
import { Checkbox as O } from "../checkbox/index.js";
|
|
5
|
+
import { Chip as j } from "../chip/index.js";
|
|
6
|
+
import { Controls as R } from "../controls/index.js";
|
|
7
|
+
import { Dialog as B } from "../dialog/index.js";
|
|
8
|
+
import { Header as E } from "../header/index.js";
|
|
9
|
+
import { I as H } from "../../index-BHgGZxsR.js";
|
|
10
|
+
import '../../assets/index9.css';const K = "_search_14b9n_3", T = "_controls_14b9n_15", $ = "_chips_14b9n_29", n = {
|
|
11
|
+
search: K,
|
|
12
|
+
controls: T,
|
|
13
|
+
chips: $,
|
|
14
|
+
"filter-groups": "_filter-groups_14b9n_36",
|
|
15
|
+
"filter-group": "_filter-group_14b9n_36"
|
|
16
16
|
}, V = ({
|
|
17
|
-
closeLabel:
|
|
17
|
+
closeLabel: f = "Close",
|
|
18
18
|
filterButtonLabel: u = "Filters",
|
|
19
19
|
filterDialogTitle: v = "Filters",
|
|
20
|
-
filterGroups:
|
|
20
|
+
filterGroups: c = [],
|
|
21
21
|
onChange: _,
|
|
22
22
|
onSelectedFiltersChange: o,
|
|
23
|
-
removeFilterLabel: g = (
|
|
23
|
+
removeFilterLabel: g = (i) => `Remove ${i.label} filter`,
|
|
24
24
|
resetLabel: k = "Reset",
|
|
25
25
|
searchLabel: y = "Search",
|
|
26
26
|
searchPlaceholder: x = "Search",
|
|
27
|
-
selectedFilters:
|
|
28
|
-
value:
|
|
27
|
+
selectedFilters: s = [],
|
|
28
|
+
value: D = ""
|
|
29
29
|
}) => {
|
|
30
|
-
const
|
|
31
|
-
const l =
|
|
30
|
+
const i = C(), [b, p] = M(!1), I = w(() => new Map(c.flatMap((a) => a.options).map((a) => [a.value, a])), [c]), h = s.flatMap((a) => {
|
|
31
|
+
const l = I.get(a);
|
|
32
32
|
return l ? [l] : [];
|
|
33
33
|
}), m = (a, l) => {
|
|
34
|
-
o && o(l ? [.../* @__PURE__ */ new Set([...
|
|
34
|
+
o && o(l ? [.../* @__PURE__ */ new Set([...s, a])] : s.filter((r) => r !== a));
|
|
35
35
|
};
|
|
36
|
-
return /* @__PURE__ */ t("div", { className:
|
|
37
|
-
/* @__PURE__ */ t("div", { className:
|
|
38
|
-
/* @__PURE__ */ e(
|
|
39
|
-
|
|
36
|
+
return /* @__PURE__ */ t("div", { className: n.search, "data-component": "search", children: [
|
|
37
|
+
/* @__PURE__ */ t("div", { className: n.controls, children: [
|
|
38
|
+
/* @__PURE__ */ e(H, { "aria-label": y, icon: "search", onChange: (a) => _(a.target.value), placeholder: x, type: "search", value: D }),
|
|
39
|
+
c.length > 0 && /* @__PURE__ */ e(d, { "aria-expanded": b, "aria-haspopup": "dialog", badge: h.length, icon: "funnel", onClick: () => p(!0), variant: "tertiary", children: u })
|
|
40
40
|
] }),
|
|
41
|
-
h.length > 0 && /* @__PURE__ */ t("div", { "aria-label": u, className:
|
|
42
|
-
h.map((a) => /* @__PURE__ */ e(
|
|
41
|
+
h.length > 0 && /* @__PURE__ */ t("div", { "aria-label": u, className: n.chips, children: [
|
|
42
|
+
h.map((a) => /* @__PURE__ */ e(j, { accessibleLabel: g(a), label: a.label, onClick: () => m(a.value, !1), onKeyDown: (l) => {
|
|
43
43
|
(l.key === "Enter" || l.key === " ") && (l.preventDefault(), m(a.value, !1));
|
|
44
44
|
}, role: "button" }, a.value)),
|
|
45
45
|
/* @__PURE__ */ e(d, { onClick: () => o == null ? void 0 : o([]), variant: "tertiary", children: k })
|
|
46
46
|
] }),
|
|
47
|
-
|
|
47
|
+
b && /* @__PURE__ */ e(B, { "aria-labelledby": i, controls: /* @__PURE__ */ e(R, { children: /* @__PURE__ */ e(d, { onClick: () => p(!1), children: f }) }), header: /* @__PURE__ */ e(E, { children: /* @__PURE__ */ e("h2", { id: i, children: v }) }), open: !0, setOpen: p, children: /* @__PURE__ */ e("div", { className: n["filter-groups"], children: c.map((a, l) => /* @__PURE__ */ t("fieldset", { className: n["filter-group"], children: [
|
|
48
48
|
a.label && /* @__PURE__ */ e("legend", { children: a.label }),
|
|
49
|
-
a.options.map((r) => /* @__PURE__ */ e(
|
|
49
|
+
a.options.map((r) => /* @__PURE__ */ e(O, { checked: s.includes(r.value), label: r.label, onChange: (N) => m(r.value, N.target.checked) }, r.value))
|
|
50
50
|
] }, a.label ?? l)) }) })
|
|
51
51
|
] });
|
|
52
52
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("react/jsx-runtime");require("../../classix-5H4IWnMA.cjs");require("../../icons-Dx0NQYLH.cjs");const e=require("../../index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("react/jsx-runtime");require("../../classix-5H4IWnMA.cjs");require("../../icons-Dx0NQYLH.cjs");const e=require("../../index-BPIK2dxs.cjs");require("../../use-touched-D_TJ8wDc.cjs");exports.Select=e.Select;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "react/jsx-runtime";
|
|
2
2
|
import "../../classix-DG18itHa.js";
|
|
3
3
|
import "../../icons-BFgf_lJN.js";
|
|
4
|
-
import { S as e } from "../../index-
|
|
4
|
+
import { S as e } from "../../index-C_YiNpZP.js";
|
|
5
5
|
import "../../use-touched-DXIJVVzz.js";
|
|
6
6
|
export {
|
|
7
7
|
e as Select
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index8.css');const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index8.css');const q=require("react/jsx-runtime"),X=require("../../classix-5H4IWnMA.cjs"),s=require("react"),Z=require("../list/index.cjs"),G="_sortable_iw0r0_1",J="_dragging_iw0r0_13",K="_columns_iw0r0_38",Q="_pseudo_iw0r0_47",b={sortable:G,dragging:J,columns:K,pseudo:Q,"target-above":"_target-above_iw0r0_62","target-below":"_target-below_iw0r0_63"},k=s.createContext(null);function tt(){return s.useContext(k)}const h=a=>Number.parseFloat(a)||0,et=a=>{const w=a.firstElementChild,i=a.getBoundingClientRect();if(w){const y=w.getBoundingClientRect();return{borderRadius:window.getComputedStyle(w).borderRadius,height:y.height,width:y.width,wrapperHeight:i.height}}const u=window.getComputedStyle(a),A=h(u.borderLeftWidth)+h(u.borderRightWidth)+h(u.paddingLeft)+h(u.paddingRight),T=h(u.borderBottomWidth)+h(u.borderTopWidth)+h(u.paddingBottom)+h(u.paddingTop);return{borderRadius:u.borderRadius,height:Math.max(0,i.height-T),width:Math.max(0,i.width-A),wrapperHeight:i.height}};function nt({children:a,className:w,columns:i=1,isRearranging:u=!1,onChangeOrder:A,...T}){const y=Number.isFinite(i)?Math.max(1,Math.floor(i)):1,R=s.useMemo(()=>s.Children.toArray(a),[a]),l=s.useRef(-1),L=s.useMemo(()=>typeof window<"u"&&(navigator.maxTouchPoints>0||window.matchMedia("(pointer: coarse)").matches),[]),p=s.useRef(!1),_=s.useRef(null),v=s.useRef(null),x=s.useRef(null),I=s.useRef(0),C=s.useRef(null),g=s.useRef(null),E=s.useRef(o=>o.preventDefault()).current,[M,O]=s.useState({borderRadius:"0px",height:0,width:0,wrapperHeight:0}),[m,S]=s.useState(null),W={...T.style,"--sortable-placeholder-height":`${M.height}px`,"--sortable-placeholder-radius":M.borderRadius,"--sortable-placeholder-width":`${M.width}px`},H=(o,t)=>{if(t<0||t>=R.length||o===t)return;const c=R.slice(),[e]=c.splice(o,1);c.splice(t,0,e),A(c.map((n,r)=>({id:String(s.isValidElement(n)?n.props["data-id"]??`idx-${r}`:`idx-${r}`),weight:c.length-1-r})))},D=()=>{v.current!==null&&(clearTimeout(v.current),v.current=null)},B=()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null)},$=o=>{let t=(o==null?void 0:o.parentElement)??null;for(;t;){const{overflowY:c}=window.getComputedStyle(t);if(/(auto|scroll|overlay)/.test(c)&&t.scrollHeight>t.clientHeight)return t;t=t.parentElement}return document.scrollingElement instanceof HTMLElement?document.scrollingElement:null},P=(o=!1)=>{D(),B(),window.removeEventListener("touchmove",E),C.current=null,p.current=!1,_.current=null,x.current=null,I.current=o?Date.now()+500:0,l.current=-1,S(null)},N=(o,t)=>{l.current=o,O(et(t)),S(o)},U=o=>o instanceof Element&&!!o.closest('button, a, input, textarea, select, option, [role="button"], [contenteditable="true"]'),Y=(o,t,c)=>{const e=l.current;if(!Number.isInteger(t)||e<0||t===e)return null;const n=o.getBoundingClientRect(),r=t===e+1?M.wrapperHeight:n.height,d=c>n.top+r/2?t+1:t;return d>e?d-1:d},j=(o,t)=>{var n;const c=(n=document.elementFromPoint(o,t))==null?void 0:n.closest("[data-sortable-index]");if(!c)return;const e=Y(c,Number(c.dataset.sortableIndex),t);e!==null&&(_.current=e,S(e))},V=o=>{const t=$(o);if(!t)return;const c=72,e=18,n=()=>{if(!p.current){g.current=null;return}const r=C.current;if(!r){g.current=requestAnimationFrame(n);return}const f=t===document.scrollingElement?{top:0,bottom:window.innerHeight}:t.getBoundingClientRect();let d=0;if(r.y<f.top+c){const F=Math.max(0,r.y-f.top);d=-e*(1-F/c)}else if(r.y>f.bottom-c){const F=Math.max(0,f.bottom-r.y);d=e*(1-F/c)}d!==0&&(t.scrollBy({top:d,behavior:"auto"}),j(r.x,r.y)),g.current=requestAnimationFrame(n)};B(),g.current=requestAnimationFrame(n)},z=()=>{l.current=-1,S(null)};return s.useEffect(()=>()=>{D(),B(),window.removeEventListener("touchmove",E)},[E]),q.jsx(Z.List,{className:X.t(w,b.sortable,y>1&&b.columns),columns:i,ordered:!0,style:W,...T,"data-component":"sortable",children:R.map((o,t)=>{const c=s.isValidElement(o)?o.key:null;return q.jsx("li",{"data-sortable-index":t,onClickCapture:e=>{I.current<=Date.now()||(e.preventDefault(),e.stopPropagation(),I.current=0)},className:X.t(m!==null&&m>t-10&&m<t+10&&b.pseudo,m===t&&l.current<t&&b["target-below"],m===t&&l.current>t&&b["target-above"],l.current===t&&b.dragging),onContextMenu:e=>{(p.current||v.current!==null)&&e.preventDefault()},onTouchStart:e=>{if(u||U(e.target))return;I.current=0;const n=e.touches[0];if(!n)return;const r=e.currentTarget;x.current={x:n.clientX,y:n.clientY},D(),v.current=setTimeout(()=>{N(t,r),p.current=!0,_.current=t,C.current={x:n.clientX,y:n.clientY},window.addEventListener("touchmove",E,{passive:!1}),V(r)},350)},onTouchMove:e=>{const n=e.touches[0];if(n){if(C.current={x:n.clientX,y:n.clientY},!p.current){const r=x.current;if(!r)return;Math.hypot(n.clientX-r.x,n.clientY-r.y)>8&&(D(),x.current=null);return}j(n.clientX,n.clientY)}},onTouchEnd:e=>{if(D(),!p.current){x.current=null;return}e.preventDefault();const n=l.current,r=_.current;n>=0&&r!==null&&n!==r&&H(n,r),P(!0)},onTouchCancel:()=>P(),draggable:!u&&!L,onDragEnd:()=>z(),onDragOver:e=>{e.preventDefault(),e.dataTransfer.dropEffect="move";const n=Y(e.currentTarget,t,e.clientY);n!==null&&S(n)},onDragStart:e=>{if(L){e.preventDefault();return}N(t,e.currentTarget),e.dataTransfer.setData("text/plain",""),e.dataTransfer.effectAllowed="move"},onDrop:e=>{e.preventDefault();const n=l.current,r=m;n<0||r===null||n===r||(H(n,r),z())},"data-component":"sortable",children:q.jsx(k.Provider,{value:{canMoveDown:t<R.length-1,canMoveUp:t>0,index:t,moveDown:()=>H(t,t+1),moveUp:()=>H(t,t-1)},children:o})},c??t)})})}exports.Sortable=nt;exports.useOptionalSortableItem=tt;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/sortable/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport React, { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { List } from '@/components/list';\n\nimport styles from './styles.module.css';\n\ntype SortItem = { id: string; weight: number };\n\ntype SortableItemContextValue = {\n canMoveDown: boolean;\n canMoveUp: boolean;\n index: number;\n moveDown: () => void;\n moveUp: () => void;\n};\n\nconst SortableItemContext = createContext<SortableItemContextValue | null>(null);\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useOptionalSortableItem() {\n return useContext(SortableItemContext);\n}\n\ntype SortableProps = React.ComponentPropsWithoutRef<'ol'> & {\n columns?: number;\n isRearranging?: boolean;\n onChangeOrder: (order: SortItem[]) => void;\n};\n\ntype withVars = React.CSSProperties & {\n '--height'?: string;\n '--width'?: string;\n '--icon-svg'?: string;\n};\n\n/**\n * Children must provide a stable `data-id` for emits `{ id, weight }` and `key` (reconciliation).\n */\n\nexport function Sortable({\n children,\n className,\n columns = 1,\n isRearranging = false,\n onChangeOrder,\n ...props\n}: SortableProps) {\n const cols = Number.isFinite(columns) ? Math.max(1, Math.floor(columns)) : 1;\n const arr = useMemo(() => React.Children.toArray(children), [children]);\n const drag = useRef(-1);\n const usesTouchInput = useMemo(\n () =>\n typeof window !== 'undefined' &&\n (navigator.maxTouchPoints > 0 || window.matchMedia('(pointer: coarse)').matches),\n []\n );\n const touchDragActive = useRef(false);\n const touchDropIndex = useRef<number | null>(null);\n const touchHoldTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const touchStart = useRef<{ index: number; x: number; y: number } | null>(null);\n const suppressClick = useRef(false);\n const touchPosition = useRef<{ x: number; y: number } | null>(null);\n const autoScrollFrame = useRef<number | null>(null);\n const [zoneSize, setZoneSize] = useState({\n height: 0,\n width: 0,\n });\n const [dropIndex, setDropIndex] = useState<number | null>(null);\n const [droppedAtIndex, setDroppedAtIndex] = useState<number | null>(null);\n const withVars: withVars = {\n ...props.style,\n '--height': `calc(${zoneSize.height}px - var(--scale-16))`,\n '--width': cols > 1 ? `calc(${zoneSize.width}px - var(--scale-16))` : `${zoneSize.width}px`,\n };\n\n const emitOrder = (items: React.ReactNode[]) => {\n onChangeOrder(\n items.map((item, index) => ({\n id: String(\n React.isValidElement(item)\n ? ((item.props as { 'data-id'?: string })['data-id'] ?? `idx-${index}`)\n : `idx-${index}`\n ),\n weight: items.length - 1 - index,\n }))\n );\n };\n\n const moveItem = (from: number, to: number) => {\n if (to < 0 || to >= arr.length || from === to) return;\n\n const next = arr.slice();\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n\n setDroppedAtIndex(to);\n emitOrder(next);\n };\n\n const clearTouchHoldTimer = () => {\n if (touchHoldTimer.current !== null) {\n clearTimeout(touchHoldTimer.current);\n touchHoldTimer.current = null;\n }\n };\n\n const clearAutoScrollFrame = () => {\n if (autoScrollFrame.current !== null) {\n cancelAnimationFrame(autoScrollFrame.current);\n autoScrollFrame.current = null;\n }\n };\n\n const getScrollableAncestor = (element: HTMLElement | null) => {\n let current = element?.parentElement ?? null;\n\n while (current) {\n const { overflowY } = window.getComputedStyle(current);\n const canScroll =\n /(auto|scroll|overlay)/.test(overflowY) && current.scrollHeight > current.clientHeight;\n\n if (canScroll) return current;\n current = current.parentElement;\n }\n\n return document.scrollingElement instanceof HTMLElement ? document.scrollingElement : null;\n };\n\n const resetTouchDragState = () => {\n clearTouchHoldTimer();\n clearAutoScrollFrame();\n touchPosition.current = null;\n touchDragActive.current = false;\n touchDropIndex.current = null;\n touchStart.current = null;\n suppressClick.current = false;\n drag.current = -1;\n setDropIndex(null);\n };\n\n const isInteractiveTarget = (target: EventTarget | null) =>\n target instanceof Element &&\n Boolean(\n target.closest(\n 'button, a, input, textarea, select, option, [role=\"button\"], [contenteditable=\"true\"]'\n )\n );\n\n const updateTouchDropIndex = (clientX: number, clientY: number) => {\n const target = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>('[data-sortable-index]');\n if (!target) return;\n\n const index = Number(target.dataset.sortableIndex);\n const from = drag.current;\n if (!Number.isInteger(index) || from < 0 || index === from) return;\n\n const rect = target.getBoundingClientRect();\n const itemHeight = index === from + 1 ? zoneSize.height : rect.height;\n const isBottomHalf = clientY > rect.top + itemHeight / 2;\n const rawIndex = isBottomHalf ? index + 1 : index;\n const nextDropIndex = rawIndex > from ? rawIndex - 1 : rawIndex;\n\n touchDropIndex.current = nextDropIndex;\n setDropIndex(nextDropIndex);\n };\n\n const startTouchAutoScroll = (item: HTMLElement) => {\n const scrollContainer = getScrollableAncestor(item);\n if (!scrollContainer) return;\n\n const edgeSize = 72;\n const maxSpeed = 18;\n\n const step = () => {\n if (!touchDragActive.current) {\n autoScrollFrame.current = null;\n return;\n }\n\n const position = touchPosition.current;\n if (!position) {\n autoScrollFrame.current = requestAnimationFrame(step);\n return;\n }\n\n const rect =\n scrollContainer === document.scrollingElement\n ? { top: 0, bottom: window.innerHeight }\n : scrollContainer.getBoundingClientRect();\n\n let speed = 0;\n\n if (position.y < rect.top + edgeSize) {\n const distance = Math.max(0, position.y - rect.top);\n speed = -maxSpeed * (1 - distance / edgeSize);\n } else if (position.y > rect.bottom - edgeSize) {\n const distance = Math.max(0, rect.bottom - position.y);\n speed = maxSpeed * (1 - distance / edgeSize);\n }\n\n if (speed !== 0) {\n scrollContainer.scrollBy({ top: speed, behavior: 'auto' });\n updateTouchDropIndex(position.x, position.y);\n }\n\n autoScrollFrame.current = requestAnimationFrame(step);\n };\n\n clearAutoScrollFrame();\n autoScrollFrame.current = requestAnimationFrame(step);\n };\n\n const resetDragState = () => {\n drag.current = -1;\n setDropIndex(null);\n };\n\n useEffect(() => {\n if (!isRearranging) {\n setDroppedAtIndex(null);\n }\n }, [isRearranging]);\n\n useEffect(\n () => () => {\n clearTouchHoldTimer();\n clearAutoScrollFrame();\n },\n []\n );\n\n useEffect(() => {\n const preventScrollWhileDragging = (event: TouchEvent) => {\n if (touchDragActive.current) {\n event.preventDefault();\n }\n };\n\n window.addEventListener('touchmove', preventScrollWhileDragging, {\n passive: false,\n });\n\n return () => {\n clearTouchHoldTimer();\n window.removeEventListener('touchmove', preventScrollWhileDragging);\n };\n }, []);\n\n return (\n <List\n className={cx(className, styles.sortable, cols > 1 && styles.columns)}\n columns={columns}\n ordered\n style={withVars}\n {...props}\n >\n {arr.map((child, i) => {\n const key = React.isValidElement(child) ? child.key : null;\n\n return (\n <li\n key={key ?? i}\n data-sortable-index={i}\n onClickCapture={(e) => {\n if (!suppressClick.current) return;\n e.preventDefault();\n e.stopPropagation();\n suppressClick.current = false;\n }}\n className={cx(\n dropIndex !== null && dropIndex > i - 10 && dropIndex < i + 10 && styles.pseudo,\n dropIndex === i && drag.current < i && styles['target-below'],\n dropIndex === i && drag.current > i && styles['target-above'],\n drag.current === i && styles.dragging,\n droppedAtIndex === i && isRearranging && styles.dropping\n )}\n onContextMenu={(e) => {\n if (touchDragActive.current || touchHoldTimer.current !== null) {\n e.preventDefault();\n }\n }}\n onTouchStart={(e) => {\n if (isRearranging || isInteractiveTarget(e.target)) return;\n\n const touch = e.touches[0];\n if (!touch) return;\n\n const item = e.currentTarget;\n touchStart.current = {\n index: i,\n x: touch.clientX,\n y: touch.clientY,\n };\n\n clearTouchHoldTimer();\n touchHoldTimer.current = setTimeout(() => {\n drag.current = i;\n touchDragActive.current = true;\n touchDropIndex.current = i;\n suppressClick.current = true;\n setZoneSize({\n height: item.offsetHeight,\n width: item.offsetWidth,\n });\n setDropIndex(i);\n touchPosition.current = {\n x: touch.clientX,\n y: touch.clientY,\n };\n startTouchAutoScroll(item);\n }, 350);\n }}\n onTouchMove={(e) => {\n const touch = e.touches[0];\n if (!touch) return;\n\n touchPosition.current = {\n x: touch.clientX,\n y: touch.clientY,\n };\n\n if (!touchDragActive.current) {\n const start = touchStart.current;\n if (!start) return;\n\n const distance = Math.hypot(touch.clientX - start.x, touch.clientY - start.y);\n if (distance > 8) {\n clearTouchHoldTimer();\n touchStart.current = null;\n }\n return;\n }\n updateTouchDropIndex(touch.clientX, touch.clientY);\n }}\n onTouchEnd={(e) => {\n clearTouchHoldTimer();\n\n if (!touchDragActive.current) {\n touchStart.current = null;\n return;\n }\n\n e.preventDefault();\n const from = drag.current;\n const to = touchDropIndex.current;\n\n if (from >= 0 && to !== null && from !== to) {\n moveItem(from, to);\n }\n\n resetTouchDragState();\n }}\n onTouchCancel={() => resetTouchDragState()}\n draggable={!isRearranging && !usesTouchInput}\n onDragEnd={() => resetDragState()}\n onDragOver={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n const from = drag.current;\n if (from < 0 || from === i) return;\n\n const rect = e.currentTarget.getBoundingClientRect();\n const itemHeight = i === from + 1 ? zoneSize.height : rect.height;\n const isBottomHalf = e.clientY > rect.top + itemHeight / 2;\n const rawIndex = isBottomHalf ? i + 1 : i;\n const nextDropIndex = rawIndex > from ? rawIndex - 1 : rawIndex;\n\n setDropIndex(nextDropIndex);\n }}\n onDragStart={(e) => {\n if (usesTouchInput) {\n e.preventDefault();\n return;\n }\n drag.current = i;\n setZoneSize({\n height: e.currentTarget.offsetHeight,\n width: e.currentTarget.offsetWidth,\n });\n e.dataTransfer.setData('text/plain', '');\n e.dataTransfer.effectAllowed = 'move';\n setDropIndex(i);\n }}\n onDrop={(e) => {\n e.preventDefault();\n const from = drag.current;\n const to = dropIndex;\n if (from < 0 || to === null || from === to) return;\n moveItem(from, to);\n resetDragState();\n }}\n >\n <SortableItemContext.Provider\n value={{\n canMoveDown: i < arr.length - 1,\n canMoveUp: i > 0,\n index: i,\n moveDown: () => moveItem(i, i + 1),\n moveUp: () => moveItem(i, i - 1),\n }}\n >\n {child}\n </SortableItemContext.Provider>\n </li>\n );\n })}\n </List>\n );\n}\n"],"names":["SortableItemContext","createContext","useOptionalSortableItem","useContext","Sortable","children","className","columns","isRearranging","onChangeOrder","props","cols","Number","isFinite","Math","max","floor","arr","useMemo","React","Children","toArray","drag","useRef","usesTouchInput","window","navigator","maxTouchPoints","matchMedia","matches","touchDragActive","touchDropIndex","touchHoldTimer","touchStart","suppressClick","touchPosition","autoScrollFrame","zoneSize","setZoneSize","useState","height","width","dropIndex","setDropIndex","droppedAtIndex","setDroppedAtIndex","withVars","style","emitOrder","items","map","item","index","id","String","isValidElement","weight","length","moveItem","from","to","next","slice","moved","splice","clearTouchHoldTimer","current","clearTimeout","clearAutoScrollFrame","cancelAnimationFrame","getScrollableAncestor","element","parentElement","overflowY","getComputedStyle","test","scrollHeight","clientHeight","document","scrollingElement","HTMLElement","resetTouchDragState","isInteractiveTarget","target","Element","Boolean","closest","updateTouchDropIndex","clientX","clientY","elementFromPoint","dataset","sortableIndex","isInteger","rect","getBoundingClientRect","itemHeight","rawIndex","top","nextDropIndex","startTouchAutoScroll","scrollContainer","edgeSize","maxSpeed","step","position","requestAnimationFrame","bottom","innerHeight","speed","y","distance","scrollBy","behavior","x","resetDragState","useEffect","preventScrollWhileDragging","event","preventDefault","addEventListener","passive","removeEventListener","jsx","List","cx","styles","sortable","child","i","key","e","stopPropagation","pseudo","dragging","dropping","touch","touches","currentTarget","setTimeout","offsetHeight","offsetWidth","start","hypot","dataTransfer","dropEffect","setData","effectAllowed","canMoveDown","canMoveUp","moveDown","moveUp"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/sortable/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport React, { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { List } from '@/components/list';\n\nimport styles from './styles.module.css';\n\ntype SortItem = { id: string; weight: number };\n\ntype SortableItemContextValue = {\n canMoveDown: boolean;\n canMoveUp: boolean;\n index: number;\n moveDown: () => void;\n moveUp: () => void;\n};\n\nconst SortableItemContext = createContext<SortableItemContextValue | null>(null);\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useOptionalSortableItem() {\n return useContext(SortableItemContext);\n}\n\ntype SortableProps = React.ComponentPropsWithoutRef<'ol'> & {\n columns?: number;\n isRearranging?: boolean;\n onChangeOrder: (order: SortItem[]) => void;\n};\n\ntype SortableStyle = React.CSSProperties & {\n '--sortable-placeholder-height'?: string;\n '--sortable-placeholder-radius'?: string;\n '--sortable-placeholder-width'?: string;\n};\n\ntype ZoneSize = {\n borderRadius: string;\n height: number;\n width: number;\n wrapperHeight: number;\n};\n\nconst toPixels = (value: string) => Number.parseFloat(value) || 0;\n\nconst measureDraggedItem = (item: HTMLLIElement): ZoneSize => {\n const content = item.firstElementChild;\n const itemRect = item.getBoundingClientRect();\n\n if (content) {\n const rect = content.getBoundingClientRect();\n\n return {\n borderRadius: window.getComputedStyle(content).borderRadius,\n height: rect.height,\n width: rect.width,\n wrapperHeight: itemRect.height,\n };\n }\n\n const style = window.getComputedStyle(item);\n const horizontalInsets =\n toPixels(style.borderLeftWidth) +\n toPixels(style.borderRightWidth) +\n toPixels(style.paddingLeft) +\n toPixels(style.paddingRight);\n const verticalInsets =\n toPixels(style.borderBottomWidth) +\n toPixels(style.borderTopWidth) +\n toPixels(style.paddingBottom) +\n toPixels(style.paddingTop);\n\n return {\n borderRadius: style.borderRadius,\n height: Math.max(0, itemRect.height - verticalInsets),\n width: Math.max(0, itemRect.width - horizontalInsets),\n wrapperHeight: itemRect.height,\n };\n};\n\n/**\n * Children must provide a stable `data-id` for emits `{ id, weight }` and `key` (reconciliation).\n */\n\nexport function Sortable({\n children,\n className,\n columns = 1,\n isRearranging = false,\n onChangeOrder,\n ...props\n}: SortableProps) {\n const cols = Number.isFinite(columns) ? Math.max(1, Math.floor(columns)) : 1;\n const arr = useMemo(() => React.Children.toArray(children), [children]);\n const drag = useRef(-1);\n const usesTouchInput = useMemo(\n () =>\n typeof window !== 'undefined' &&\n (navigator.maxTouchPoints > 0 || window.matchMedia('(pointer: coarse)').matches),\n []\n );\n const touchDragActive = useRef(false);\n const touchDropIndex = useRef<number | null>(null);\n const touchHoldTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const touchStart = useRef<{ x: number; y: number } | null>(null);\n const suppressClickUntil = useRef(0);\n const touchPosition = useRef<{ x: number; y: number } | null>(null);\n const autoScrollFrame = useRef<number | null>(null);\n const preventTouchScroll = useRef((event: TouchEvent) => event.preventDefault()).current;\n const [zoneSize, setZoneSize] = useState({\n borderRadius: '0px',\n height: 0,\n width: 0,\n wrapperHeight: 0,\n });\n const [dropIndex, setDropIndex] = useState<number | null>(null);\n const withVars: SortableStyle = {\n ...props.style,\n '--sortable-placeholder-height': `${zoneSize.height}px`,\n '--sortable-placeholder-radius': zoneSize.borderRadius,\n '--sortable-placeholder-width': `${zoneSize.width}px`,\n };\n\n const moveItem = (from: number, to: number) => {\n if (to < 0 || to >= arr.length || from === to) return;\n\n const next = arr.slice();\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n\n onChangeOrder(\n next.map((item, index) => ({\n id: String(\n React.isValidElement(item)\n ? ((item.props as { 'data-id'?: string })['data-id'] ?? `idx-${index}`)\n : `idx-${index}`\n ),\n weight: next.length - 1 - index,\n }))\n );\n };\n\n const clearTouchHoldTimer = () => {\n if (touchHoldTimer.current !== null) {\n clearTimeout(touchHoldTimer.current);\n touchHoldTimer.current = null;\n }\n };\n\n const clearAutoScrollFrame = () => {\n if (autoScrollFrame.current !== null) {\n cancelAnimationFrame(autoScrollFrame.current);\n autoScrollFrame.current = null;\n }\n };\n\n const getScrollableAncestor = (element: HTMLElement | null) => {\n let current = element?.parentElement ?? null;\n\n while (current) {\n const { overflowY } = window.getComputedStyle(current);\n const canScroll =\n /(auto|scroll|overlay)/.test(overflowY) && current.scrollHeight > current.clientHeight;\n\n if (canScroll) return current;\n current = current.parentElement;\n }\n\n return document.scrollingElement instanceof HTMLElement ? document.scrollingElement : null;\n };\n\n const resetTouchDragState = (suppressNextClick = false) => {\n clearTouchHoldTimer();\n clearAutoScrollFrame();\n window.removeEventListener('touchmove', preventTouchScroll);\n touchPosition.current = null;\n touchDragActive.current = false;\n touchDropIndex.current = null;\n touchStart.current = null;\n suppressClickUntil.current = suppressNextClick ? Date.now() + 500 : 0;\n drag.current = -1;\n setDropIndex(null);\n };\n\n const startDrag = (index: number, item: HTMLLIElement) => {\n drag.current = index;\n setZoneSize(measureDraggedItem(item));\n setDropIndex(index);\n };\n\n const isInteractiveTarget = (target: EventTarget | null) =>\n target instanceof Element &&\n Boolean(\n target.closest(\n 'button, a, input, textarea, select, option, [role=\"button\"], [contenteditable=\"true\"]'\n )\n );\n\n const getDropIndex = (target: HTMLElement, index: number, clientY: number) => {\n const from = drag.current;\n if (!Number.isInteger(index) || from < 0 || index === from) return null;\n\n const rect = target.getBoundingClientRect();\n const itemHeight = index === from + 1 ? zoneSize.wrapperHeight : rect.height;\n const isBottomHalf = clientY > rect.top + itemHeight / 2;\n const rawIndex = isBottomHalf ? index + 1 : index;\n return rawIndex > from ? rawIndex - 1 : rawIndex;\n };\n\n const updateTouchDropIndex = (clientX: number, clientY: number) => {\n const target = document\n .elementFromPoint(clientX, clientY)\n ?.closest<HTMLElement>('[data-sortable-index]');\n if (!target) return;\n\n const nextDropIndex = getDropIndex(target, Number(target.dataset.sortableIndex), clientY);\n if (nextDropIndex === null) return;\n\n touchDropIndex.current = nextDropIndex;\n setDropIndex(nextDropIndex);\n };\n\n const startTouchAutoScroll = (item: HTMLElement) => {\n const scrollContainer = getScrollableAncestor(item);\n if (!scrollContainer) return;\n\n const edgeSize = 72;\n const maxSpeed = 18;\n\n const step = () => {\n if (!touchDragActive.current) {\n autoScrollFrame.current = null;\n return;\n }\n\n const position = touchPosition.current;\n if (!position) {\n autoScrollFrame.current = requestAnimationFrame(step);\n return;\n }\n\n const rect =\n scrollContainer === document.scrollingElement\n ? { top: 0, bottom: window.innerHeight }\n : scrollContainer.getBoundingClientRect();\n\n let speed = 0;\n\n if (position.y < rect.top + edgeSize) {\n const distance = Math.max(0, position.y - rect.top);\n speed = -maxSpeed * (1 - distance / edgeSize);\n } else if (position.y > rect.bottom - edgeSize) {\n const distance = Math.max(0, rect.bottom - position.y);\n speed = maxSpeed * (1 - distance / edgeSize);\n }\n\n if (speed !== 0) {\n scrollContainer.scrollBy({ top: speed, behavior: 'auto' });\n updateTouchDropIndex(position.x, position.y);\n }\n\n autoScrollFrame.current = requestAnimationFrame(step);\n };\n\n clearAutoScrollFrame();\n autoScrollFrame.current = requestAnimationFrame(step);\n };\n\n const resetDragState = () => {\n drag.current = -1;\n setDropIndex(null);\n };\n\n useEffect(\n () => () => {\n clearTouchHoldTimer();\n clearAutoScrollFrame();\n window.removeEventListener('touchmove', preventTouchScroll);\n },\n [preventTouchScroll]\n );\n\n return (\n <List\n className={cx(className, styles.sortable, cols > 1 && styles.columns)}\n columns={columns}\n ordered\n style={withVars}\n {...props}\n >\n {arr.map((child, i) => {\n const key = React.isValidElement(child) ? child.key : null;\n\n return (\n <li\n key={key ?? i}\n data-sortable-index={i}\n onClickCapture={(e) => {\n if (suppressClickUntil.current <= Date.now()) return;\n e.preventDefault();\n e.stopPropagation();\n suppressClickUntil.current = 0;\n }}\n className={cx(\n dropIndex !== null && dropIndex > i - 10 && dropIndex < i + 10 && styles.pseudo,\n dropIndex === i && drag.current < i && styles['target-below'],\n dropIndex === i && drag.current > i && styles['target-above'],\n drag.current === i && styles.dragging\n )}\n onContextMenu={(e) => {\n if (touchDragActive.current || touchHoldTimer.current !== null) {\n e.preventDefault();\n }\n }}\n onTouchStart={(e) => {\n if (isRearranging || isInteractiveTarget(e.target)) return;\n suppressClickUntil.current = 0;\n\n const touch = e.touches[0];\n if (!touch) return;\n\n const item = e.currentTarget;\n touchStart.current = {\n x: touch.clientX,\n y: touch.clientY,\n };\n\n clearTouchHoldTimer();\n touchHoldTimer.current = setTimeout(() => {\n startDrag(i, item);\n touchDragActive.current = true;\n touchDropIndex.current = i;\n touchPosition.current = {\n x: touch.clientX,\n y: touch.clientY,\n };\n window.addEventListener('touchmove', preventTouchScroll, { passive: false });\n startTouchAutoScroll(item);\n }, 350);\n }}\n onTouchMove={(e) => {\n const touch = e.touches[0];\n if (!touch) return;\n\n touchPosition.current = {\n x: touch.clientX,\n y: touch.clientY,\n };\n\n if (!touchDragActive.current) {\n const start = touchStart.current;\n if (!start) return;\n\n const distance = Math.hypot(touch.clientX - start.x, touch.clientY - start.y);\n if (distance > 8) {\n clearTouchHoldTimer();\n touchStart.current = null;\n }\n return;\n }\n updateTouchDropIndex(touch.clientX, touch.clientY);\n }}\n onTouchEnd={(e) => {\n clearTouchHoldTimer();\n\n if (!touchDragActive.current) {\n touchStart.current = null;\n return;\n }\n\n e.preventDefault();\n const from = drag.current;\n const to = touchDropIndex.current;\n\n if (from >= 0 && to !== null && from !== to) {\n moveItem(from, to);\n }\n\n resetTouchDragState(true);\n }}\n onTouchCancel={() => resetTouchDragState()}\n draggable={!isRearranging && !usesTouchInput}\n onDragEnd={() => resetDragState()}\n onDragOver={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n const nextDropIndex = getDropIndex(e.currentTarget, i, e.clientY);\n if (nextDropIndex === null) return;\n setDropIndex(nextDropIndex);\n }}\n onDragStart={(e) => {\n if (usesTouchInput) {\n e.preventDefault();\n return;\n }\n startDrag(i, e.currentTarget);\n e.dataTransfer.setData('text/plain', '');\n e.dataTransfer.effectAllowed = 'move';\n }}\n onDrop={(e) => {\n e.preventDefault();\n const from = drag.current;\n const to = dropIndex;\n if (from < 0 || to === null || from === to) return;\n moveItem(from, to);\n resetDragState();\n }}\n >\n <SortableItemContext.Provider\n value={{\n canMoveDown: i < arr.length - 1,\n canMoveUp: i > 0,\n index: i,\n moveDown: () => moveItem(i, i + 1),\n moveUp: () => moveItem(i, i - 1),\n }}\n >\n {child}\n </SortableItemContext.Provider>\n </li>\n );\n })}\n </List>\n );\n}\n"],"names":["SortableItemContext","createContext","useOptionalSortableItem","useContext","toPixels","value","Number","parseFloat","measureDraggedItem","item","content","firstElementChild","itemRect","getBoundingClientRect","rect","borderRadius","window","getComputedStyle","height","width","wrapperHeight","style","horizontalInsets","borderLeftWidth","borderRightWidth","paddingLeft","paddingRight","verticalInsets","borderBottomWidth","borderTopWidth","paddingBottom","paddingTop","Math","max","Sortable","children","className","columns","isRearranging","onChangeOrder","props","cols","isFinite","floor","arr","useMemo","React","Children","toArray","drag","useRef","usesTouchInput","navigator","maxTouchPoints","matchMedia","matches","touchDragActive","touchDropIndex","touchHoldTimer","touchStart","suppressClickUntil","touchPosition","autoScrollFrame","preventTouchScroll","event","preventDefault","current","zoneSize","setZoneSize","useState","dropIndex","setDropIndex","withVars","moveItem","from","to","length","next","slice","moved","splice","map","index","id","String","isValidElement","weight","clearTouchHoldTimer","clearTimeout","clearAutoScrollFrame","cancelAnimationFrame","getScrollableAncestor","element","parentElement","overflowY","test","scrollHeight","clientHeight","document","scrollingElement","HTMLElement","resetTouchDragState","suppressNextClick","removeEventListener","Date","now","startDrag","isInteractiveTarget","target","Element","Boolean","closest","getDropIndex","clientY","isInteger","itemHeight","rawIndex","top","updateTouchDropIndex","clientX","elementFromPoint","nextDropIndex","dataset","sortableIndex","startTouchAutoScroll","scrollContainer","edgeSize","maxSpeed","step","position","requestAnimationFrame","bottom","innerHeight","speed","y","distance","scrollBy","behavior","x","resetDragState","useEffect","jsx","List","cx","styles","sortable","child","i","key","e","stopPropagation","pseudo","dragging","touch","touches","currentTarget","setTimeout","addEventListener","passive","start","hypot","dataTransfer","dropEffect","setData","effectAllowed","canMoveDown","canMoveUp","moveDown","moveUp"],"mappings":"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"}
|