/// <reference path="../../index.d.ts" />
import type SnappingOptions from "@arcgis/core/views/interactive/snapping/SnappingOptions.js";
import type { PublicLitElement as LitElement } from "@arcgis/lumina";
import type { ArcgisReferenceElement, IconName } from "../types.js";
import type { MapViewOrSceneView } from "@arcgis/core/views/MapViewOrSceneView.js";
import type { Icon } from "@esri/calcite-components/components/calcite-icon";
import type { SnappingControlsViewModelState } from "@arcgis/core/widgets/support/SnappingControls/SnappingControlsViewModel.js";

export abstract class ArcgisSnappingControls extends LitElement {
  /**
   * If true, the component will not be destroyed automatically when it is
   * disconnected from the document. This is useful when you want to move the
   * component to a different place on the page, or temporarily hide it. If this
   * is set, make sure to call the [destroy()](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-snapping-controls/#destroy) method when you are done to
   * prevent memory leaks.
   *
   * @default false
   */
  accessor autoDestroyDisabled: boolean;
  /**
   * Controls display of the "Enable snapping" toggle.
   *
   * @default false
   */
  accessor hideEnabledToggle: boolean;
  /**
   * Controls display of the "Feature to feature" toggle. This controls feature snapping.
   *
   * @default false
   */
  accessor hideFeatureEnabledToggle: boolean;
  /**
   * Controls display of the [arcgis-grid-controls](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-grid-controls/).
   *
   * @default false
   */
  accessor hideGridControls: boolean;
  /**
   * Controls display of the buttons to change the color of the grid.
   *
   * @default false
   */
  accessor hideGridControlsElementsColorSelection: boolean;
  /**
   * Controls display of the toggle that modifies [dynamicScaling](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-grid-controls/#dynamicScaling).
   *
   * @default false
   */
  accessor hideGridControlsElementsDynamicScaleToggle: boolean;
  /**
   * Controls display of the line interval input. The input sets the interval between major grid lines.
   *
   * @default false
   */
  accessor hideGridControlsElementsLineIntervalInput: boolean;
  /**
   * Controls display of the numeric inputs that allow for setting grid spacing and rotation
   *
   * @default false
   */
  accessor hideGridControlsElementsNumericInputs: boolean;
  /**
   * Controls display of the out of scale warning. This warning is displayed when the grid is not shown because it would be too small at the current scale and dynamic scaling is disabled.
   *
   * @default false
   */
  accessor hideGridControlsElementsOutOfScaleWarning: boolean;
  /**
   * Controls display of the grid placement buttons. These buttons allow the user to start interactive configuration of the grid.
   *
   * @default false
   */
  accessor hideGridControlsElementsPlacementButtons: boolean;
  /**
   * Controls display of the "Rotate grid with map" toggle. This toggle controls whether the grid rotates with the map.
   *
   * @default false
   */
  accessor hideGridControlsElementsRotateWithMapToggle: boolean;
  /**
   * Controls display of the "Snapping layers" dropdown. The list displays the available layers to configure snapping.
   *
   * @default false
   */
  accessor hideLayerList: boolean;
  /**
   * Controls display of the “Geometry guides” toggle. This toggle controls the self-snapping configuration which handles showing right-angle and parallel line indicators while constructing or modifying geometries.
   *
   * @default false
   */
  accessor hideSelfEnabledToggle: boolean;
  /**
   * Icon which represents the component.
   * Typically used when the component is controlled by another component (e.g. by the Expand component).
   *
   * @default "snap-to-point"
   * @since 5.0
   * @see [Calcite Icons](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  get icon(): Icon["icon"];
  set icon(value: IconName);
  /**
   * The component's default label.
   *
   * @since 5.0
   */
  accessor label: string;
  /**
   * By assigning the `id` attribute of the Map or Scene component to this property, you can position a child component anywhere in the DOM while still maintaining a connection to the Map or Scene.
   *
   * @see [Associate components with a Map or Scene component](https://developers.arcgis.com/javascript/latest/programming-patterns/#associate-components-with-a-map-or-scene-component)
   */
  accessor referenceElement: ArcgisReferenceElement | string | undefined;
  /**
   * Controls display of the "Enable grid" toggle. This toggle controls whether the grid is displayed.
   *
   * @default false
   */
  accessor showGridControlsElementsGridEnabledToggle: boolean;
  /**
   * Controls display of the header
   *
   * @default false
   */
  accessor showHeader: boolean;
  /**
   * The [SnappingOptions](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/)
   * that will be controlled by this component if the snapping toggle is enabled for display.
   * If SnappingOptions are provided, grid display will be automatically enabled or disabled to match snapping state.
   */
  accessor snappingOptions: SnappingOptions;
  /**
   * The current state of the component.
   *
   * @default "disabled"
   */
  get state(): SnappingControlsViewModelState;
  /**
   * The view associated with the component. 
   *   > **Note:** The recommended approach is to fully migrate applications to use map and scene components and avoid using MapView and SceneView directly. However, if you are migrating a large application from widgets to components, you might prefer a more gradual transition. To support this use case, the SDK includes this `view` property which connects a component to a MapView or SceneView. Ultimately, once migration is complete, the arcgis-snapping-controls component will be associated with a map or scene component rather than using the `view` property.
   */
  accessor view: MapViewOrSceneView | null | undefined;
  /** Permanently destroy the component. */
  destroy(): Promise<void>;
  "@setterTypes": {
    icon?: IconName;
  };
  /** Emitted when the value of a property is changed. Use this to listen to changes to properties. */
  readonly arcgisPropertyChange: import("@arcgis/lumina").TargetedEvent<this, { name: "snappingOptions" | "state"; }>;
  /** Emitted when the component associated with a map or scene view is ready to be interacted with. */
  readonly arcgisReady: import("@arcgis/lumina").TargetedEvent<this, void>;
  readonly "@eventTypes": {
    arcgisPropertyChange: ArcgisSnappingControls["arcgisPropertyChange"]["detail"];
    arcgisReady: ArcgisSnappingControls["arcgisReady"]["detail"];
  };
}