Source: observer/types.ts

import { TypeVoidFunction } from '../types/voidFunction';
import { INTERSECTION_DIRECTIONS } from './IntersectionObserver';

/**
 * pure MutationObserver init options
 * @memberof MutationObserver
 * @alias IMutationObserverInit
 * @interface
 * @property {Boolean} [childList] - target 의 하위 요소 추가 / 삭제 감지 유무
 * @property {Boolean} [attributes] - target 의 속성 변경 감지 유무
 * @property {Boolean} [characterData] - target 의 데이터 변경 감지 유무
 * @property {Boolean} [subtree] - target 의 하위 요소 변경 사항 감지 유무
 * @property {Boolean} [attributeOldValue] - attributeOldValue TBD
 * @property {Boolean} [characterDataOldValue] - TBD
 * @property {Array.<String>} [attributeFilter] - TBD [MDN attributeFilter]{@link https://developer.mozilla.org/en-US/docs/Web/API/MutationObserverInit/attributeFilter}
 * @see https://developer.mozilla.org/ko/docs/Web/API/MutationObserver#MutationObserverInit
 */
export interface IMutationObserverInit {
  childList?: boolean;
  attributes?: boolean;
  characterData?: boolean;
  subtree?: boolean;
  attributeOldValue?: boolean;
  characterDataOldValue?: boolean;
  attributeFilter?: string[];
};

/**
 * MutationObserver init options
 * @memberof MutationObserver
 * @alias IMutationObserverExtOption
 * @interface
 * @property {HTMLElement} target - 감지할 element
 * @property {Number} [debounce] - 이벤트 debounce 값
 * @property {TypeVoidFunction} [callback] - 이벤트 callback
 * @property {IMutationObserverInit} [options] - 세부 MutationObserver options
 */
export interface IMutationObserverExtOption {
  target: HTMLElement;
  debounce?: number;
  callback?: TypeVoidFunction;
  options?: IMutationObserverInit;
};

/**
 * Visibility Status 반환 규격
 * @memberof VisibilityChangeObserver
 * @alias IVisibilityStatus
 * @interface
 * @property {Boolean} hidden - hidden 상태 유무
 * @property {Boolean} show - show 상태 유무
 * @see VisibilityChangeObserver#getStatus
 */
export interface IVisibilityStatus {
  isHidden: boolean;
  isShow: boolean;
};


/**
 * @typedef IntersectionObserverInit
 * @alias IntersectionObserverInit
 * @property {Element | null} [root]
 * @property {String} [rootMargin]
 * @property {Number | Number[]} [threshold]
 */
// for jsdoc

/**
 * @typedef IntersectionObserverEntry
 * @alias IntersectionObserverEntry
 * @property {DOMRectReadOnly} boundingClientRect
 * @property {Number} intersectionRatio
 * @property {DOMRectReadOnly} intersectionRect
 * @property {Boolean} isIntersecting
 * @property {DOMRectReadOnly | null} rootBounds
 * @property {Element} target
 * @property {Number} time
 */
// for jsdoc

/**
 * @callback callback
 * @param {IIntersectionChangeData} changeData
 */
// for jsdoc

/**
 * IntersectionObserver init options
 * @memberof IntersectionObserver
 * @alias IIntersectionObserverExtOption
 * @interface
 * @property {Element} target - 감지할 element
 * @property {Number} [visibleRatio] - 이벤트 visibleRatio 값
 * @property {Number} [throttle] - 이벤트 throttle 값
 * @property {callback} [callback] - 이벤트 callback
 * @property {IntersectionObserverInit} [options] - 세부 IntersectionObserver options
 * @see https://developer.mozilla.org/ko/docs/Web/API/IntersectionObserver/IntersectionObserver#%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98
 */
export interface IIntersectionObserverExtOption {
  target: Element;
  visibleRatio?: number;
  throttle?: number;
  callback?: (changeData: IIntersectionChangeData) => void;
  options?: IntersectionObserverInit;
};

/**
 * IntersectionObserver ChangeData
 * @memberof IntersectionObserver
 * @alias IIntersectionChangeData
 * @interface
 * @property {Element} currentTarget
 * @property {IntersectionObserverEntry} entry
 * @property {Number} intersectionRatio
 * @property {Boolean} isVisible
 * @property {INTERSECTION_DIRECTIONS} direction
 */
export interface IIntersectionChangeData {
  currentTarget: Element;
  entry: IntersectionObserverEntry;
  intersectionRatio: number;
  isVisible: boolean;
  direction: INTERSECTION_DIRECTIONS;
};

/**
 * PrefersColorSchemeStatus
 * @memberof PrefersColorSchemeObserver
 * @alias IPrefersColorSchemeStatus
 * @interface
 * @property {Boolean} isDark
 * @property {Boolean} isLight
 */
export interface IPrefersColorSchemeStatus {
  isDark: boolean;
  isLight: boolean;
};