@servicetitan/anvil2 3.12.0 → 3.12.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 +16 -0
- package/dist/{DataTable-C_O7nJDd.js → DataTable-CjvD9TbJ.js} +15 -5
- package/dist/DataTable-CjvD9TbJ.js.map +1 -0
- package/dist/{Dialog-C3wxqB-V.js → Dialog-PcuDCqK7.js} +2 -2
- package/dist/{Dialog-C3wxqB-V.js.map → Dialog-PcuDCqK7.js.map} +1 -1
- package/dist/Dialog.js +1 -1
- package/dist/{Drawer-BO_G3ujC.js → Drawer-C73Ka9ra.js} +2 -2
- package/dist/{Drawer-BO_G3ujC.js.map → Drawer-C73Ka9ra.js.map} +1 -1
- package/dist/Drawer.js +1 -1
- package/dist/{FilterBar-D8jLOWpw.js → FilterBar-D2NDYqTs.js} +3 -3
- package/dist/{FilterBar-D8jLOWpw.js.map → FilterBar-D2NDYqTs.js.map} +1 -1
- package/dist/FilterBar.js +1 -1
- package/dist/MultiSelectField.js +1 -1
- package/dist/{MultiSelectFieldSync-D1GrPsmK.js → MultiSelectFieldSync-CFw607cm.js} +5 -11
- package/dist/{MultiSelectFieldSync-D1GrPsmK.js.map → MultiSelectFieldSync-CFw607cm.js.map} +1 -1
- package/dist/MultiSelectMenu.js +1 -1
- package/dist/{MultiSelectMenuSync-DXaQJaFb.js → MultiSelectMenuSync-C6afc80f.js} +5 -11
- package/dist/MultiSelectMenuSync-C6afc80f.js.map +1 -0
- package/dist/{Page-Dvdx-9vo.js → Page-B5yLLq76.js} +2 -2
- package/dist/{Page-Dvdx-9vo.js.map → Page-B5yLLq76.js.map} +1 -1
- package/dist/Page.js +1 -1
- package/dist/{SavedFiltersButton-BKdyw-84.js → SavedFiltersButton-ClghkFdA.js} +5 -5
- package/dist/{SavedFiltersButton-BKdyw-84.js.map → SavedFiltersButton-ClghkFdA.js.map} +1 -1
- package/dist/SavedFiltersButton.js +1 -1
- package/dist/SelectField.js +1 -1
- package/dist/{SelectFieldSync-CXJ_vM_r.js → SelectFieldSync-BdYCHwPd.js} +5 -11
- package/dist/{SelectFieldSync-CXJ_vM_r.js.map → SelectFieldSync-BdYCHwPd.js.map} +1 -1
- package/dist/SelectMenu.js +1 -1
- package/dist/{SelectMenuSync-fgPfAK2H.js → SelectMenuSync-DlqmXr04.js} +5 -11
- package/dist/{SelectMenuSync-fgPfAK2H.js.map → SelectMenuSync-DlqmXr04.js.map} +1 -1
- package/dist/{SelectOptions-DnCivsmF.js → SelectOptions-Cz4mU7WG.js} +2 -2
- package/dist/{SelectOptions-DnCivsmF.js.map → SelectOptions-Cz4mU7WG.js.map} +1 -1
- package/dist/Table.js +1 -1
- package/dist/{TimeField-BY_hasgp.js → TimeField-BZQP8KSf.js} +2 -2
- package/dist/{TimeField-BY_hasgp.js.map → TimeField-BZQP8KSf.js.map} +1 -1
- package/dist/TimeField.css +1 -3
- package/dist/TimeField.js +1 -1
- package/dist/Toast.js +2 -2
- package/dist/{Toaster-CEJo8hNY.js → Toaster-B1xZq1bs.js} +2 -2
- package/dist/{Toaster-CEJo8hNY.js.map → Toaster-B1xZq1bs.js.map} +1 -1
- package/dist/{Toaster-CJW-ZD3D.js → Toaster-C2z5rCrc.js} +44 -35
- package/dist/Toaster-C2z5rCrc.js.map +1 -0
- package/dist/Toaster.css +49 -55
- package/dist/TreeSelectField.js +1 -1
- package/dist/{TreeSelectFieldSync-KV1A8ixs.js → TreeSelectFieldSync-D7ntJmDF.js} +4 -10
- package/dist/{TreeSelectFieldSync-KV1A8ixs.js.map → TreeSelectFieldSync-D7ntJmDF.js.map} +1 -1
- package/dist/TreeSelectMenu.js +1 -1
- package/dist/{TreeSelectMenuSync-sn_p39Sm.js → TreeSelectMenuSync-CTm2n1vJ.js} +4 -10
- package/dist/{TreeSelectMenuSync-sn_p39Sm.js.map → TreeSelectMenuSync-CTm2n1vJ.js.map} +1 -1
- package/dist/beta.js +10 -10
- package/dist/{bulkActionTypes-KRa7Hs6l.js → bulkActionTypes-jKqcdwuO.js} +2 -2
- package/dist/{bulkActionTypes-KRa7Hs6l.js.map → bulkActionTypes-jKqcdwuO.js.map} +1 -1
- package/dist/{filter-state-DY4aB2Yl.js → filter-state-TEgOgQVy.js} +9 -9
- package/dist/{filter-state-DY4aB2Yl.js.map → filter-state-TEgOgQVy.js.map} +1 -1
- package/dist/index.js +10 -10
- package/dist/src/beta/components/Table/DataTable/internal/constants.d.ts +35 -0
- package/dist/src/beta/components/TreeSelectField/TreeSelectFieldSync.d.ts +1 -1
- package/dist/src/beta/components/TreeSelectMenu/TreeSelectMenuSync.d.ts +1 -1
- package/dist/src/internal/functions/areOptionsValueEqual.d.ts +8 -0
- package/dist/src/internal/functions/isThenable.d.ts +4 -0
- package/dist/src/internal/hooks/useInvalidateOnOptionsChange.d.ts +16 -0
- package/dist/{syncFilterUtils-B6bmn3bo.js → syncFilterUtils-9Pqeq8J4.js} +45 -30
- package/dist/syncFilterUtils-9Pqeq8J4.js.map +1 -0
- package/dist/{treeSync-iLxsTFYf.js → treeSync-tEqZxxHQ.js} +55 -20
- package/dist/treeSync-tEqZxxHQ.js.map +1 -0
- package/dist/{useAdaptiveView-Q30aklTE.js → useInvalidateOnOptionsChange-CC_6sRp9.js} +54 -3
- package/dist/useInvalidateOnOptionsChange-CC_6sRp9.js.map +1 -0
- package/package.json +5 -4
- package/dist/DataTable-C_O7nJDd.js.map +0 -1
- package/dist/MultiSelectMenuSync-DXaQJaFb.js.map +0 -1
- package/dist/Toaster-CJW-ZD3D.js.map +0 -1
- package/dist/syncFilterUtils-B6bmn3bo.js.map +0 -1
- package/dist/treeSync-iLxsTFYf.js.map +0 -1
- package/dist/useAdaptiveView-Q30aklTE.js.map +0 -1
- /package/dist/{useAdaptiveView.css → useInvalidateOnOptionsChange.css} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInvalidateOnOptionsChange-CC_6sRp9.js","sources":["../src/internal/functions/isThenable.ts","../src/internal/components/OptionCheckbox.tsx","../src/internal/components/OptionRow.tsx","../src/internal/components/OptionContentArea.tsx","../src/internal/components/OptionsPopover/OptionsPopover.tsx","../src/internal/components/OptionsDialog/OptionsDialog.tsx","../src/beta/hooks/useAdaptiveView/useAdaptiveView.tsx","../src/internal/functions/areOptionsValueEqual.ts","../src/internal/hooks/useInvalidateOnOptionsChange.ts"],"sourcesContent":["/**\n * Returns true when `value` looks like a thenable (Promise or Promise-like).\n */\nexport function isThenable<T>(value: unknown): value is PromiseLike<T> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof (value as PromiseLike<T>).then === \"function\"\n );\n}\n","import cx from \"classnames\";\nimport { Icon } from \"../../components/Icon\";\nimport { Spinner } from \"../../components/Spinner\";\nimport CheckboxOutline from \"@servicetitan/hammer-icon/mdi/round/check_box_outline_blank.svg\";\nimport CheckboxChecked from \"@servicetitan/hammer-icon/mdi/round/check_box.svg\";\nimport CheckboxIndeterminate from \"@servicetitan/hammer-icon/mdi/round/indeterminate_check_box.svg\";\nimport type { CheckState } from \"../../types\";\nimport styles from \"./OptionCheckbox.module.scss\";\n\nexport type OptionCheckboxProps = {\n checkState: CheckState;\n className?: string;\n};\n\nconst iconMap = {\n checked: CheckboxChecked,\n unchecked: CheckboxOutline,\n indeterminate: CheckboxIndeterminate,\n} as const;\n\nexport function OptionCheckbox({ checkState, className }: OptionCheckboxProps) {\n if (checkState === \"loading\") {\n return (\n <span className={cx(styles[\"loading\"], className)}>\n <Spinner size=\"small\" aria-hidden=\"true\" />\n </span>\n );\n }\n\n return (\n <Icon\n aria-hidden=\"true\"\n size=\"large\"\n svg={iconMap[checkState]}\n className={cx(styles[\"checkbox\"], styles[checkState], className)}\n />\n );\n}\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./OptionRow.module.scss\";\n\nexport type OptionRowProps = ComponentPropsWithoutRef<\"div\"> & {\n disabled?: boolean;\n};\n\nexport const OptionRow = forwardRef<HTMLDivElement, OptionRowProps>(\n function OptionRow({ disabled, children, className, ...rest }, ref) {\n const optionRowClass = cx(\n styles[\"option-row\"],\n { [styles[\"disabled\"]]: disabled },\n className,\n );\n return (\n <div ref={ref} {...rest} className={optionRowClass}>\n {children}\n </div>\n );\n },\n);\n\nexport const OptionRowSideContent = forwardRef<\n HTMLDivElement,\n ComponentPropsWithoutRef<\"div\"> & { children: ReactNode }\n>(function OptionRowSideContent({ children, className, ...rest }, ref) {\n const sideContentClass = cx(styles[\"side-content\"], className);\n return (\n <div ref={ref} {...rest} className={sideContentClass}>\n {children}\n </div>\n );\n});\n","import type { ReactNode } from \"react\";\nimport { Flex } from \"../../components/Flex\";\nimport { Text } from \"../../components/Text\";\nimport { Avatar } from \"../../components/Avatar\";\nimport { Chip } from \"../../components/Chip\";\nimport { Icon } from \"../../components/Icon\";\nimport type { OptionContent } from \"../types/optionContent\";\nimport { OptionRowSideContent } from \"./OptionRow\";\nimport styles from \"./OptionContentArea.module.scss\";\n\nexport type OptionContentAreaProps = {\n label: string;\n content?: OptionContent;\n children?: ReactNode;\n};\n\nexport function OptionContentArea({\n label,\n content,\n children,\n}: OptionContentAreaProps) {\n const hasAvatar = !!content?.avatar;\n const hasChips = !!content?.chips?.length;\n const hasIcon = !!content?.icon;\n\n return (\n <>\n {hasAvatar && (\n <OptionRowSideContent aria-hidden=\"true\">\n <Avatar size=\"medium\" {...content!.avatar!} />\n </OptionRowSideContent>\n )}\n <Flex grow={1} shrink={1} direction=\"column\" justifyContent=\"center\">\n <Text size=\"small\" className={styles[\"title\"]}>\n {content?.title ?? label}\n </Text>\n {content?.description && (\n <Text size=\"small\" className={styles[\"description\"]}>\n {content.description}\n </Text>\n )}\n {hasChips && (\n <Flex\n wrap=\"wrap\"\n gap=\"1\"\n className={styles[\"chips-row\"]}\n role=\"group\"\n aria-label=\"Tags\"\n >\n {content!.chips!.map((chip, i) => (\n <Chip key={`${chip.label}-${i}`} size=\"small\" {...chip} />\n ))}\n </Flex>\n )}\n {children}\n </Flex>\n {hasIcon && (\n <OptionRowSideContent>\n <Icon\n size=\"large\"\n svg={content!.icon!.svg}\n color={content!.icon!.color}\n aria-hidden={content!.icon!.label ? undefined : \"true\"}\n aria-label={content!.icon!.label}\n />\n </OptionRowSideContent>\n )}\n </>\n );\n}\n","import {\n type ReactNode,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\n\nimport {\n autoPlacement,\n autoUpdate,\n computePosition,\n offset,\n size,\n} from \"@floating-ui/react\";\n\nimport cx from \"classnames\";\n\nimport { useOnClickOutside } from \"../../hooks/useOnClickOutside/useOnClickOutside\";\nimport { portalScopeClassNames } from \"../../functions/portalScopeClassNames\";\n\nimport styles from \"./OptionsPopover.module.scss\";\n\nexport type OptionsPopoverProps = {\n id: string;\n children: ReactNode;\n referenceElement: RefObject<HTMLElement>;\n open: boolean;\n /**\n * Fired when the popover should close (click-outside, focus-out, or\n * Escape). On Escape, the popover restores focus to `referenceElement`\n * before invoking this callback; for other paths focus has already moved\n * elsewhere intentionally.\n */\n onClose: () => void;\n /** Controls the popover width strategy.\n * - `\"reference\"` — match the reference element's width\n * - `number` — fixed width in px\n * - `string` — any CSS width value (e.g. `\"20rem\"`)\n * - `undefined` (default) — intrinsic sizing (`max-content`)\n */\n width?: \"reference\" | number | string;\n /**\n * Optional content rendered as a full-bleed footer region inside the popover\n * shell, separated from the body by a top border. The popover suppresses its\n * own bottom padding so the footer can hug the popover's lower edge.\n */\n footer?: ReactNode;\n};\n\nfunction resolveWidth(\n width: OptionsPopoverProps[\"width\"],\n referenceWidth: number,\n): string | undefined {\n if (width === \"reference\") return `${referenceWidth}px`;\n if (typeof width === \"number\") return `${width}px`;\n if (typeof width === \"string\") return width;\n return undefined;\n}\n\nexport const OptionsPopover = (props: OptionsPopoverProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const { id, children, referenceElement, open, onClose, width, footer } =\n props;\n\n // A single click-outside on a focusable element fires both the\n // useOnClickOutside (pointerup) path and the focusout path below. Dedupe\n // so onClose runs at most once per user action.\n const lastCloseRef = useRef(0);\n const safeClose = useCallback(() => {\n const now = Date.now();\n if (now - lastCloseRef.current < 50) return;\n lastCloseRef.current = now;\n onClose();\n }, [onClose]);\n\n useOnClickOutside({\n targets: [ref.current ?? undefined, referenceElement.current ?? undefined],\n onClickOutside: safeClose,\n disable: !open,\n });\n\n useEffect(() => {\n if (open) {\n ref.current?.showPopover();\n } else {\n ref.current?.hidePopover();\n }\n }, [open]);\n\n // Close when focus leaves the popover (and isn't moving to the trigger\n // element, which has its own click/focus handling). This is the keyboard\n // counterpart to useOnClickOutside.\n useEffect(() => {\n if (!open) return;\n const popoverEl = ref.current;\n if (!popoverEl) return;\n const handleFocusOut = (e: FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (!next) {\n // Focus moved to nothing tracked (e.g. body). Treat as exit.\n safeClose();\n return;\n }\n if (popoverEl.contains(next)) return;\n const trigger = referenceElement.current;\n if (trigger && trigger.contains(next)) return;\n safeClose();\n };\n popoverEl.addEventListener(\"focusout\", handleFocusOut);\n return () => popoverEl.removeEventListener(\"focusout\", handleFocusOut);\n }, [open, safeClose, referenceElement]);\n\n // Close on Escape from anywhere inside the popover (e.g. when focus is on\n // the footer button, where no host hook is listening). Focus is restored to\n // the reference element before onClose fires so consumers don't need to\n // manage trigger focus themselves. If a downstream handler (search input,\n // listbox) already handled Escape and called preventDefault, defer to it.\n useEffect(() => {\n if (!open) return;\n const popoverEl = ref.current;\n if (!popoverEl) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented) return;\n e.preventDefault();\n referenceElement.current?.focus();\n safeClose();\n };\n popoverEl.addEventListener(\"keydown\", handleKeyDown);\n return () => popoverEl.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, safeClose, referenceElement]);\n\n const updatePosition = useCallback(async () => {\n if (!ref.current || !referenceElement.current) return;\n const position = await computePosition(\n referenceElement.current,\n ref.current,\n {\n placement: \"bottom-start\",\n middleware: [\n offset(8),\n autoPlacement({\n allowedPlacements: [\n \"bottom-start\",\n \"bottom-end\",\n \"top-start\",\n \"top-end\",\n ],\n padding: 8,\n }),\n size({\n padding: 8,\n apply({ rects, elements, availableHeight, availableWidth }) {\n const resolved = resolveWidth(width, rects.reference.width);\n Object.assign(elements.floating.style, {\n ...(resolved != null && { width: resolved }),\n maxWidth: `${Math.max(0, availableWidth)}px`,\n maxHeight: `${Math.max(0, availableHeight)}px`,\n });\n },\n }),\n ],\n },\n );\n ref.current.style.left = `${position.x}px`;\n ref.current.style.top = `${position.y}px`;\n }, [ref, referenceElement, width]);\n\n useEffect(() => {\n if (!ref.current || !referenceElement.current || !open) return;\n const cleanup = autoUpdate(\n referenceElement.current,\n ref.current,\n updatePosition,\n );\n return () => {\n cleanup();\n };\n }, [referenceElement, ref, updatePosition, open]);\n\n return (\n <div\n ref={ref}\n id={id}\n className={cx(styles[\"options-popover\"], portalScopeClassNames)}\n popover=\"manual\"\n data-anv=\"popover-content\"\n data-anv-part=\"popover\"\n >\n <div className={styles[\"options-popover-body\"]}>{children}</div>\n {footer ? (\n <div className={styles[\"options-popover-footer\"]}>{footer}</div>\n ) : null}\n </div>\n );\n};\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { Flex, type FocusableElement, Text } from \"../../..\";\nimport { DialogCancelButton } from \"../../../components/Dialog/DialogCancelButton\";\nimport styles from \"./OptionsDialog.module.scss\";\nimport Close from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport { DialogContext } from \"../../../components/Dialog/internal/DialogContext\";\nimport { useDialogScrollLock } from \"../..\";\nimport { tabbable } from \"tabbable\";\n\nexport const OptionsDialog = ({\n id,\n isOpen,\n onClose,\n field,\n children,\n title,\n initialFocusResolver,\n footer,\n}: {\n id: string;\n isOpen: boolean;\n onClose: () => void;\n title: string;\n field?: React.ReactNode;\n children: React.ReactNode;\n initialFocusResolver?: (focusables: FocusableElement[]) => FocusableElement;\n /** Optional content rendered below the dialog body. */\n footer?: React.ReactNode;\n}) => {\n const elRef = useRef<HTMLDialogElement>(null);\n const visualViewportHeightRef = useRef<HTMLDivElement>(null);\n\n useDialogScrollLock({\n open: isOpen,\n id,\n enableScrollChaining: false,\n elementRef: elRef,\n });\n\n const computeFocus = useCallback(\n (focusables: FocusableElement[]) => {\n if (initialFocusResolver) {\n return initialFocusResolver(focusables);\n }\n return (\n focusables.find(\n (focusable) => focusable.dataset.anv !== \"dialog-cancel-button\",\n ) || focusables[0]\n );\n },\n [initialFocusResolver],\n );\n\n useEffect(() => {\n if (isOpen) {\n elRef.current?.showModal();\n if (elRef.current) {\n computeFocus(tabbable(elRef.current)).focus();\n }\n } else {\n elRef.current?.close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Omitting computeFocus because we don't want to show/close the dialog on computeFocus change\n }, [isOpen]);\n\n useEffect(() => {\n if (isOpen) {\n const handleResize = () => {\n if (!visualViewportHeightRef.current) return;\n visualViewportHeightRef.current.style.height = `${window.visualViewport?.height ?? 0}px`;\n visualViewportHeightRef.current.style.maxHeight = `${window.visualViewport?.height ?? 0}px`;\n };\n window.visualViewport?.addEventListener(\"resize\", handleResize);\n return () => {\n window.visualViewport?.removeEventListener(\"resize\", handleResize);\n };\n }\n }, [isOpen]);\n\n return (\n <dialog\n ref={elRef}\n id={id}\n data-anv=\"field-dialog\"\n data-anv-part=\"dialog\"\n className={styles[\"field-dialog\"]}\n onKeyDown={(e) => {\n if (e.code === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n }}\n >\n <div\n className={styles[\"field-dialog-visual-viewport-height\"]}\n ref={visualViewportHeightRef}\n >\n <Flex direction=\"row\" className={styles[\"header\"]}>\n <Text variant=\"headline\" el=\"h1\">\n {title}\n </Text>\n <span className={styles[\"close-container\"]}>\n <DialogContext.Provider value={{ close: onClose }}>\n <DialogCancelButton\n className={styles[\"close-button\"]}\n size=\"small\"\n appearance=\"ghost\"\n aria-label=\"Close dialog\"\n icon={Close}\n />\n </DialogContext.Provider>\n </span>\n </Flex>\n {field ? (\n <Flex direction=\"column\" className={styles[\"field\"]}>\n {field}\n </Flex>\n ) : null}\n <Flex direction=\"column\" className={styles[\"content\"]}>\n {children}\n </Flex>\n {footer ? <div className={styles[\"footer\"]}>{footer}</div> : null}\n </div>\n </dialog>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport { useBreakpoint } from \"../../../hooks\";\n\n/**\n * The type of view to render based on device characteristics.\n */\nexport type AdaptiveView = \"mobile\" | \"desktop\";\n\n/**\n * Return type for the useAdaptiveView hook.\n */\nexport interface UseAdaptiveViewReturn {\n /**\n * The current adaptive view type.\n */\n view: AdaptiveView;\n /**\n * True when the device should use mobile-optimized UI (Dialog).\n */\n isMobile: boolean;\n /**\n * True when the device should use desktop-optimized UI (Popover).\n */\n isDesktop: boolean;\n}\n\n/**\n * Detects whether the primary pointer is coarse (touch) using CSS media query.\n * Returns false during SSR or when matchMedia is unavailable.\n */\nfunction detectCoarsePointer(): boolean {\n if (typeof window === \"undefined\" || !window.matchMedia) {\n return false;\n }\n return window.matchMedia(\"(pointer: coarse)\").matches;\n}\n\n/**\n * Custom hook for detecting whether to use mobile or desktop UI patterns.\n *\n * This hook determines the optimal UI pattern (e.g., Dialog vs Popover) by combining:\n * - Screen size via useBreakpoint (viewport width)\n * - Pointer precision via CSS media query (pointer: coarse)\n *\n * A device is considered \"mobile\" when it has both:\n * - A small screen (below md breakpoint, < 768px)\n * - A coarse pointer (touch-primary input)\n *\n * This approach correctly identifies:\n * - Mobile phones → mobile view (Dialog)\n * - iPads/tablets → desktop view (Popover) due to larger screens\n * - Touch laptops → desktop view (Popover) due to fine pointer primary\n * - Desktop → desktop view (Popover)\n *\n * @returns Object containing view type and boolean flags for mobile/desktop\n *\n * @example\n * const { isMobile } = useAdaptiveView();\n *\n * return isMobile ? (\n * <Dialog>{children}</Dialog>\n * ) : (\n * <Popover>{children}</Popover>\n * );\n */\nexport function useAdaptiveView(): UseAdaptiveViewReturn {\n const breakpoint = useBreakpoint();\n const [hasCoarsePointer, setHasCoarsePointer] = useState(detectCoarsePointer);\n\n useEffect(() => {\n setHasCoarsePointer(detectCoarsePointer());\n\n // Listen for pointer capability changes (e.g., connecting/disconnecting a mouse)\n const mediaQuery = window.matchMedia(\"(pointer: coarse)\");\n const handleChange = (e: MediaQueryListEvent) => {\n setHasCoarsePointer(e.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n }, []);\n\n const isSmallScreen = !breakpoint?.md;\n const isMobile = isSmallScreen && hasCoarsePointer;\n\n return {\n view: isMobile ? \"mobile\" : \"desktop\",\n isMobile,\n isDesktop: !isMobile,\n };\n}\n","/**\n * Deep value equality for select option lists (and nested tree nodes).\n *\n * Compares arrays and plain objects by contents so a new array/object identity\n * with the same data is treated as unchanged. Functions and React elements are\n * compared by reference.\n */\nexport function areOptionsValueEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) {\n return true;\n }\n\n if (typeof a !== typeof b || a === null || b === null) {\n return false;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n return a.every((item, index) => areOptionsValueEqual(item, b[index]));\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n // Missing keys and explicit `undefined` are equal so spreads / defaults\n // like `{ ...option, disabled: undefined }` do not look like a change.\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const key of keys) {\n if (!areOptionsValueEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n\n return false;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n // React elements and other exotic objects should not be walked.\n if (typeof (value as { $$typeof?: unknown }).$$typeof === \"symbol\") {\n return false;\n }\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n","import { useEffect, useRef } from \"react\";\nimport { areOptionsValueEqual } from \"../functions/areOptionsValueEqual\";\n\ntype InvalidatableHandle = {\n invalidate: () => void;\n};\n\n/**\n * Invalidates a select field/menu when its `options` *contents* change.\n *\n * A new array (or tree) identity with the same data does not invalidate, so\n * consumers can pass inline option literals without triggering a reload.\n *\n * @param handleRef Ref to an imperative handle that exposes `invalidate`\n * @param options The current options value (flat list or tree)\n */\nexport function useInvalidateOnOptionsChange(\n handleRef: { current: InvalidatableHandle | null },\n options: unknown,\n): void {\n const prevOptionsRef = useRef(options);\n\n useEffect(() => {\n if (areOptionsValueEqual(prevOptionsRef.current, options)) {\n prevOptionsRef.current = options;\n return;\n }\n\n prevOptionsRef.current = options;\n handleRef.current?.invalidate();\n }, [handleRef, options]);\n}\n"],"names":["CheckboxChecked","CheckboxOutline","CheckboxIndeterminate","styles","OptionRow","OptionRowSideContent","Close"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/anvil2",
|
|
3
|
-
"version": "3.12.
|
|
3
|
+
"version": "3.12.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"types": "./dist/src/index.d.ts",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
"tabbable": "^6.2.0",
|
|
79
79
|
"tinycolor2": "^1.6.0",
|
|
80
80
|
"uuid": "^14.0.0",
|
|
81
|
-
"@servicetitan/hammer-
|
|
82
|
-
"@servicetitan/hammer-
|
|
81
|
+
"@servicetitan/hammer-token": "3.3.0",
|
|
82
|
+
"@servicetitan/hammer-icon": "1.3.0"
|
|
83
83
|
},
|
|
84
84
|
"peerDependencies": {
|
|
85
85
|
"@types/react": "^18 || ^19",
|
|
@@ -127,7 +127,7 @@
|
|
|
127
127
|
"vite": "6.4.2",
|
|
128
128
|
"vitest": "^3.2.4",
|
|
129
129
|
"vitest-axe": "^0.1.0",
|
|
130
|
-
"@servicetitan/anvil2-illustrations": "1.
|
|
130
|
+
"@servicetitan/anvil2-illustrations": "1.2.0"
|
|
131
131
|
},
|
|
132
132
|
"scripts": {
|
|
133
133
|
"dev": "vite build --watch",
|
|
@@ -137,6 +137,7 @@
|
|
|
137
137
|
"build:icons": "pnpm svgo:st-icons && node scripts/createIconIndexes.mjs",
|
|
138
138
|
"build:vite": "vite build",
|
|
139
139
|
"check-types": "tsc --noEmit --project tsconfig.build.json",
|
|
140
|
+
"typecheck": "pnpm check-types",
|
|
140
141
|
"check-parts": "node ./scripts/check-anv-parts.mjs",
|
|
141
142
|
"check-parts:selftest": "node ./scripts/check-anv-parts.mjs --selftest",
|
|
142
143
|
"clean": "rimraf dist node_modules/.cache",
|