import type Collection from "../core/Collection.js";
import type CatalogLayer from "../layers/CatalogLayer.js";
import type KnowledgeGraphLayer from "../layers/KnowledgeGraphLayer.js";
import type MapImageLayer from "../layers/MapImageLayer.js";
import type TileLayer from "../layers/TileLayer.js";
import type CatalogLayerList from "./CatalogLayerList.js";
import type TableList from "./TableList.js";
import type Widget from "./Widget.js";
import type LayerListViewModel from "./LayerList/LayerListViewModel.js";
import type LayerListVisibleElements from "./LayerList/LayerListVisibleElements.js";
import type ListItem from "./LayerList/ListItem.js";
import type { Icon } from "@esri/calcite-components/components/calcite-icon";
import type { IdentifiableMixin, IdentifiableMixinProperties } from "../core/Identifiable.js";
import type { MapViewOrSceneView } from "../views/MapViewOrSceneView.js";
import type { CatalogLayerListProperties } from "./CatalogLayerList.js";
import type { TableListProperties } from "./TableList.js";
import type { WidgetProperties } from "./Widget.js";
import type { LayerListViewModelEvents, LayerListViewModelProperties } from "./LayerList/LayerListViewModel.js";
import type { Action, FilterPredicate, ListItemModifier, VisibilityAppearance } from "./LayerList/types.js";
import type { HeadingLevel } from "./support/types.js";
import type { LayerListVisibleElementsProperties } from "./LayerList/LayerListVisibleElements.js";

export interface LayerListProperties extends WidgetProperties, IdentifiableMixinProperties, Partial<Pick<LayerList, "catalogOptions" | "collapsed" | "dragEnabled" | "filterPlaceholder" | "filterPredicate" | "filterText" | "headingLevel" | "knowledgeGraphOptions" | "listItemCreatedFunction" | "minDragEnabledItems" | "minFilterItems" | "operationalItems" | "selectedItems" | "selectionMode" | "view" | "visibilityAppearance">> {
  /**
   * Icon which represents the widget. It is typically used when the widget is controlled by another
   * one (e.g. in the Expand widget).
   *
   * @default "layers"
   * @since 4.27
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  icon?: Icon["icon"] | null;
  /**
   * The widget's default label.
   *
   * @since 4.7
   */
  label?: string | null;
  /**
   * The view model for this widget. This is a class that contains all the logic
   * (properties and methods) that controls this widget's behavior. See the
   * [LayerListViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/LayerListViewModel/) class to access
   * all properties and methods on the widget.
   */
  viewModel?: LayerListViewModelProperties;
  /**
   * The visible elements that are displayed within the widget.
   * This property provides the ability to turn individual elements of the widget's display on/off.
   *
   * @since 4.15
   * @example
   * layerList.visibleElements = {
   *   catalogLayerList: true,
   *   closeButton: false,
   *   collapseButton: true,
   *   errors: true,
   *   filter: true,
   *   heading: true,
   *   statusIndicators: true
   * };
   */
  visibleElements?: LayerListVisibleElementsProperties;
}

/**
 * Represents a layer type that supports displaying associated tables within the LayerList.
 *
 * @see [openedLayers](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#openedLayers)
 * @since 5.0
 */
export type SubtablesLayer = KnowledgeGraphLayer | MapImageLayer | TileLayer;

/**
 * Represents a layer that can be displayed in a separate flow item within the LayerList.
 *
 * @see [openedLayers](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#openedLayers)
 * @since 5.0
 */
export type FlowLayer = SubtablesLayer | CatalogLayer;

export interface LayerListEvents extends LayerListViewModelEvents {}

/**
 * The LayerList widget provides a way to display a list of layers, and switch on/off their visibility.
 * The [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/) API provides access to each layer's properties, allows
 * the developer to configure actions related to the layer, and allows the developer to add content to the item related to the layer.
 *
 * > [!WARNING]
 * >
 * > **Notes**
 * >
 * > The LayerList does not emit an event when the visibility of a layer changes. To respond to layer visibility changes,
 * > watch the [Layer.visible](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/#visible) property or the [Map.allLayers](https://developers.arcgis.com/javascript/latest/references/core/Map/#allLayers) property with [reactiveUtils](https://developers.arcgis.com/javascript/latest/references/core/core/reactiveUtils/).
 * > To hide layers in the map from the LayerList widget, you must set the [Layer.listMode](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/#listMode) property on the desired layers to `hide`.
 * > When a [KnowledgeGraphLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/KnowledgeGraphLayer/) is present in the map, the LayerList widget will display the
 * > [KnowledgeGraphLayer.tables](https://developers.arcgis.com/javascript/latest/references/core/layers/KnowledgeGraphLayer/#tables) as a [tableList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#tableList) [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/).
 * > When a [CatalogLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CatalogLayer/) is present in the map, the LayerList widget will display the
 * > [CatalogLayer.dynamicGroupLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CatalogLayer/#dynamicGroupLayer) in a [catalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#catalogLayerList) [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/).
 *
 * @deprecated since version 5.0. Use the [Layer List](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-layer-list/) component instead. For information on widget deprecation, read about [Esri's move to web components](https://developers.arcgis.com/javascript/latest/components-transition-plan/).
 * @since 4.2
 * @see [Sample - LayerList widget](https://developers.arcgis.com/javascript/latest/sample-code/widgets-layerlist/)
 * @see [Sample - LayerList widget with actions](https://developers.arcgis.com/javascript/latest/sample-code/widgets-layerlist-actions/)
 * @see [LayerListViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/LayerListViewModel/)
 * @example
 * const layerList = new LayerList({
 *   view: view
 * });
 * // Adds widget below other elements in the top left corner of the view
 * view.ui.add(layerList, {
 *   position: "top-left"
 * });
 */
export default class LayerList extends LayerListSuperclass {
  /**
   * @deprecated
   * Do not directly reference this property.
   * Use EventNames and EventTypes helpers from \@arcgis/core/Evented
   */
  "@eventTypes": LayerListEvents;
  /**
   * @example
   * // typical usage
   * const layerlist = new LayerList({
   *   view
   * });
   */
  constructor(properties?: LayerListProperties);
  /**
   * The [CatalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/CatalogLayerList/) widget instance that displays a catalog layer's [dynamic group layer](https://developers.arcgis.com/javascript/latest/references/core/layers/CatalogLayer/#dynamicGroupLayer).
   * The catalog layer list will be displayed as an expandable [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/) in the LayerList widget.
   * This property is set when a catalog layer's dynamic group layer is expanded in the LayerList.
   * Otherwise, it is `null`.
   * This list item will only be displayed when catalog layers are loaded in the map and will be displayed as a child of the catalog layer.
   * This property is useful for listening to the [CatalogLayerList.@trigger-action](https://developers.arcgis.com/javascript/latest/references/core/widgets/CatalogLayerList/#event-trigger-action) event and managing selections in catalog layers.
   *
   * ![CatalogLayerList](https://developers.arcgis.com/javascript/latest/assets/references/core/widgets/catalog-layer-list.png)
   *
   * @since 4.30
   * @see [catalogOptions](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#catalogOptions)
   * @example
   * // Use reactiveUtils to respond to the layerList.catalogLayerList "trigger-action" event
   * reactiveUtils.on(
   *   () => layerList.catalogLayerList,
   *   "trigger-action",
   *   async (event) => {
   *     if (event.action.id === "add-layer") {
   *       // Get the parent catalog layer
   *       const parentCatalogLayer = catalogUtils.getCatalogLayerForLayer(event.item.layer);
   *       // Get the footprint from the parent catalog layer
   *       const footprint = parentCatalogLayer.createFootprintFromLayer(event.item.layer);
   *       // Get the layer from the footprint
   *       const layerFromFootprint = await parentCatalogLayer.createLayerFromFootprint(footprint);
   *       // Add the layer to the map
   *       map.add(layerFromFootprint);
   *       // back out of the catalog layer list to the main layer list
   *       layerList.openedLayers.pop();
   *     }
   *   }
   * );
   *
   * // Use reactiveUtils to watch for a selected item in the layerList.catalogLayerList
   * reactiveUtils.watch(
   *   () => layerList.catalogLayerList?.selectedItems.at(0)?.layer,
   *   (layer) => {
   *     // When a layer is selected log out its title
   *     if (layer) {
   *       console.log(layer.title);
   *     }
   *   }
   * );
   */
  get catalogLayerList(): CatalogLayerList | null | undefined;
  /**
   * [CatalogLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CatalogLayer/) specific properties.
   * Catalog layers will display their [CatalogLayer.dynamicGroupLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CatalogLayer/#dynamicGroupLayer) as an expandable [catalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#catalogLayerList) in the LayerList widget.
   * This list item will only be displayed when catalog layers with dynamic group layers are loaded in the map.
   * These are the properties that are used to configure the [catalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#catalogLayerList).
   *
   * @since 4.30
   * @see [catalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#catalogLayerList)
   * @example
   * const layerList = new LayerList({
   *   catalogOptions: {
   *     listItemCreatedFunction: (event) => {
   *       const { item } = event;
   *       item.actionsSections = [
   *         [
   *           {
   *             title: "Add layer to map",
   *             icon: "add-layer",
   *             id: "add-layer"
   *           }
   *         ]
   *       ];
   *     },
   *     selectionMode: "single",
   *     visibleElements: {
   *       filter: true
   *     }
   *   },
   *   view,
   * });
   */
  accessor catalogOptions: CatalogLayerListProperties | null | undefined;
  /**
   * Indicates whether the widget is collapsed.
   * When collapsed, only the collapse button and heading are displayed.
   *
   * @default false
   * @since 4.29
   * @see [visibleElements.collapseButton](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#visibleElements)
   * @example layerList.collapsed = true;
   */
  accessor collapsed: boolean;
  /**
   * Indicates whether [list items](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/) may be reordered within the list by dragging and dropping.
   * MapImageLayer [MapImageLayer.sublayers](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/#sublayers) can be reordered only within their parent MapImageLayer and can not be dragged out as a separate layer.
   * Drag won't be enabled until the number of list items is equal to or greater than than the value set set in [minDragEnabledItems](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#minDragEnabledItems).
   *
   * @default false
   * @since 4.29
   * @see [minDragEnabledItems](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#minDragEnabledItems)
   * @example layerList.dragEnabled = true;
   */
  accessor dragEnabled: boolean;
  /**
   * Placeholder text used in the filter input if [visibleElements.filter](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#visibleElements) is true.
   *
   * @default ""
   * @since 4.29
   * @see [visibleElements.filter](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#visibleElements)
   * @example layerList.filterPlaceholder = "Filter layers";
   */
  accessor filterPlaceholder: string;
  /**
   * Specifies a function to handle filtering [list items](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/).
   *
   * @since 4.32
   * @example layerList.filterPredicate = (item) => item.title.toLowerCase().includes("streets");
   */
  accessor filterPredicate: FilterPredicate | null | undefined;
  /**
   * The value of the filter input if [visibleElements.filter](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#visibleElements) is true.
   *
   * @default ""
   * @since 4.29
   * @see [visibleElements.filter](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#visibleElements)
   * @example
   * reactiveUtils.watch(
   *   () => layerList.filterText,
   *   (filterText) => console.log(filterText)
   * );
   */
  accessor filterText: string;
  /**
   * Indicates the heading level to use for the heading of the widget.
   * By default, the heading is rendered as a level 2 heading (e.g., `<h2>Layer List</h2>`).
   * Depending on the widget's placement in your app, you may need to adjust this heading for proper semantics.
   * This is important for meeting accessibility standards.
   *
   * @default 2
   * @since 4.29
   * @see [visibleElements.heading](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#visibleElements)
   * @example layerList.headingLevel = 3;
   */
  accessor headingLevel: HeadingLevel;
  /**
   * Icon which represents the widget. It is typically used when the widget is controlled by another
   * one (e.g. in the Expand widget).
   *
   * @default "layers"
   * @since 4.27
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  get icon(): Icon["icon"];
  set icon(value: Icon["icon"] | null | undefined);
  /**
   * [KnowledgeGraphLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/KnowledgeGraphLayer/) specific properties.
   * Knowledge graph layers will display [KnowledgeGraphLayer.tables](https://developers.arcgis.com/javascript/latest/references/core/layers/KnowledgeGraphLayer/#tables)
   * as an expandable [tableList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#tableList) in the LayerList widget.
   * This tables list item will only be displayed when knowledge graph layers with tables are loaded in the map.
   * These are the properties that are used to configure the [tableList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#tableList).
   *
   * @since 4.30
   * @see [tableList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#tableList)
   * @example
   * layerList.knowledgeGraphOptions = {
   *   filterPlaceholder: "Filter tables",
   *   listItemCreatedFunction: (event) => {
   *     const { item } = event;
   *     item.actionsSections = [
   *       [
   *         {
   *           icon: "table",
   *           id: "open-table",
   *           title: "Show table"
   *         },
   *         {
   *           icon: "information",
   *           id: "information",
   *           title: "Show information"
   *         }
   *       ]
   *     ];
   *   },
   *   minFilterItems: 1,
   *   visibleElements: {
   *     errors: true,
   *     filter: true,
   *     statusIndicators: true
   *   }
   * }
   */
  accessor knowledgeGraphOptions: TableListProperties | null | undefined;
  /**
   * The widget's default label.
   *
   * @since 4.7
   */
  get label(): string;
  set label(value: string | null | undefined);
  /**
   * A function that executes each time a [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/) is created.
   * Use this function to add actions and panels to list items, and to override
   * the default settings of a list item. Actions can be added to list items
   * using the [ListItem.actionsSections](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/#actionsSections)
   * property of the ListItem.
   *
   * @since 4.4
   * @see [Sample - LayerList widget with actions](https://developers.arcgis.com/javascript/latest/sample-code/widgets-layerlist-actions/)
   * @example
   * let layerList = new LayerList({
   *   view: view,
   *   // executes for each ListItem in the LayerList
   *   listItemCreatedFunction: async function (event) {
   *
   *     // The event object contains properties of the
   *     // layer in the LayerList widget.
   *
   *     let item = event.item;
   *
   *     // Wait for the layer to load and the item title to become available
   *     await item.layer.when();
   *
   *     if (item.title === "US Demographics") {
   *       // open the list item in the LayerList
   *       item.open = true;
   *       // change the title to something more descriptive
   *       item.title = "Population by county";
   *       // set an action for zooming to the full extent of the layer
   *       item.actionsSections = [[{
   *         title: "Go to full extent",
   *         className: "esri-icon-zoom-out-fixed",
   *         id: "full-extent"
   *       }]];
   *     }
   *   }
   * });
   */
  accessor listItemCreatedFunction: ListItemModifier | null | undefined;
  /**
   * The minimum number of list items required to enable drag and drop reordering with [dragEnabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#dragEnabled).
   *
   * @default 2
   * @since 4.29
   * @see [dragEnabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#dragEnabled)
   * @example
   * layerList.dragEnabled = true;
   * layerList.minDragEnabledItems = 5;
   */
  accessor minDragEnabledItems: number;
  /**
   * The minimum number of list items required to display the [visibleElements.filter](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/LayerListVisibleElements/) input box.
   *
   * @default 10
   * @since 4.29
   * @see [visibleElements.filter](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/LayerListVisibleElements/)
   * @example
   * layerList.visibleElements.filter = true;
   * layerList.minFilterItems = 5;
   */
  accessor minFilterItems: number;
  /**
   * A collection of [Layer](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/)s that are opened
   * in a [catalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#catalogLayerList) or [tableList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#tableList) flow item.
   * This property is useful for backing out of the catalog layer list or table list
   * programmatically to the parent layer list.
   *
   * @default []
   * @since 4.31
   * @see [catalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#catalogLayerList)
   * @see [tableList](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#tableList)
   * @example
   * // back out of the catalog layer list to the main layer list
   * layerList.openedLayers.pop();
   */
  get openedLayers(): Collection<FlowLayer>;
  /**
   * A collection of [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/)s representing operational layers.
   * To hide layers from the LayerList widget, set the
   * [Layer.listMode](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/#listMode) property on the layer(s) to `hide`.
   *
   * @see [Layer.listMode](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/#listMode)
   */
  accessor operationalItems: Collection<ListItem>;
  /**
   * A collection of selected [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/)s representing operational layers
   * selected by the user.
   *
   * @see [selectionMode](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#selectionMode)
   */
  accessor selectedItems: Collection<ListItem>;
  /**
   * Specifies the selection mode.
   * Selected items are available in the [selectedItems](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#selectedItems) property.
   *
   * | Value | Description |
   * | ----- | ----------- |
   * | multiple | Allows any number of items to be selected at once. This is useful when you want to apply an operation to multiple items at the same time. |
   * | none | Disables selection. Use this when you want to prevent selecting items. |
   * | single | Allows only one item to be selected at a time. If another item is selected, the previous selection is cleared. This is useful when you want to ensure that a maximum of one item is selected at a time. |
   * | single-persist | Allows only one item to be selected at a time and prevents de-selection. Once an item is selected, it remains selected until another item is selected. This is useful when you want to ensure that there is always exactly one selected item. |
   *
   * @default "none"
   * @since 4.29
   * @see [selectedItems](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#selectedItems)
   * @example layerList.selectionMode = "multiple";
   */
  accessor selectionMode: "multiple" | "single" | "none" | "single-persist";
  /**
   * The [TableList](https://developers.arcgis.com/javascript/latest/references/core/widgets/TableList/) widget instance that displays the tables associated with a [KnowledgeGraphLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/KnowledgeGraphLayer/).
   * The table list will be displayed as an expandable [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/) in the LayerList widget.
   * This property is set when a knowledge graph layer's tables [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/) is expanded in the LayerList.
   * Otherwise, it is `null`.
   * This list item will only be displayed when knowledge graph layers with tables are loaded in the map and will be displayed as a child of the knowledge graph layer.
   * This property is useful for listening to the [TableList.@trigger-action](https://developers.arcgis.com/javascript/latest/references/core/widgets/TableList/#event-trigger-action) event and managing selections in knowledge graph tables.
   *
   * ![tableList](https://developers.arcgis.com/javascript/latest/assets/references/core/widgets/layer-list-tableList.png)
   *
   * @since 4.30
   * @see [knowledgeGraphOptions](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#knowledgeGraphOptions)
   * @example
   * // Use reactiveUtils to respond to the layerList.tableList "trigger-action" event
   * reactiveUtils.on(
   *   () => layerList.tableList,
   *   "trigger-action",
   *   (event) => {
   *     if (event.action.id === "open-table") {
   *       // Open the table in the FeatureTable widget
   *       featureTable.layer = event.item.layer;
   *       // Back out of the table list to the layer list
   *       layerList.openedLayers.pop();
   *     }
   *   }
   * );
   *
   * // Use reactiveUtils to watch for a selected item in the layerList.tableList
   * reactiveUtils.watch(
   *   () => layerList.tableList?.selectedItems.at(0)?.layer,
   *   (layer) => {
   *     // When a layer is selected log out its title
   *     if (layer) {
   *        console.log(layer.title);
   *     }
   *   }
   * );
   */
  get tableList(): TableList | null | undefined;
  /** A reference to the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) or [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). Set this to link the widget to a specific view. */
  accessor view: MapViewOrSceneView | null | undefined;
  /**
   * The view model for this widget. This is a class that contains all the logic
   * (properties and methods) that controls this widget's behavior. See the
   * [LayerListViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/LayerListViewModel/) class to access
   * all properties and methods on the widget.
   */
  get viewModel(): LayerListViewModel;
  set viewModel(value: LayerListViewModelProperties);
  /**
   * Determines the icons used to indicate visibility.
   *
   * | Value | Description | Example |
   * | ----- | ----------- | ------- |
   * | default | Displays view icons on the far side. Icons are hidden except on hover or if they have keyboard focus. See [view-visible](https://developers.arcgis.com/calcite-design-system/icons/?icon=view-visible&library=Calcite%20UI&query=view) and [view-hide](https://developers.arcgis.com/calcite-design-system/icons/?icon=view-hide&library=Calcite%20UI&query=view) calcite icons. | ![visibilityAppearance-default](https://developers.arcgis.com/javascript/latest/assets/references/core/widgets/layer-list/visibilityAppearance-default.png) |
   * | checkbox | Displays checkbox icons on the near side. See [check-square-f](https://developers.arcgis.com/calcite-design-system/icons/?icon=check-square-f&library=Calcite%20UI&query=check) and [square](https://developers.arcgis.com/calcite-design-system/icons/?icon=square&library=Calcite%20UI&query=square) calcite icons. | ![visibilityAppearance-checkbox](https://developers.arcgis.com/javascript/latest/assets/references/core/widgets/layer-list/visibilityAppearance-checkbox.png) |
   *
   * @default "default"
   * @since 4.29
   * @example layerList.visibilityAppearance = "checkbox";
   */
  accessor visibilityAppearance: VisibilityAppearance;
  /**
   * The visible elements that are displayed within the widget.
   * This property provides the ability to turn individual elements of the widget's display on/off.
   *
   * @since 4.15
   * @example
   * layerList.visibleElements = {
   *   catalogLayerList: true,
   *   closeButton: false,
   *   collapseButton: true,
   *   errors: true,
   *   filter: true,
   *   heading: true,
   *   statusIndicators: true
   * };
   */
  get visibleElements(): LayerListVisibleElements;
  set visibleElements(value: LayerListVisibleElementsProperties);
  /**
   * Triggers the [@trigger-action](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/#event-trigger-action) event and executes
   * the given [action](https://developers.arcgis.com/javascript/latest/references/core/support/actions/ActionButton/) or [action toggle](https://developers.arcgis.com/javascript/latest/references/core/support/actions/ActionToggle/).
   *
   * @param action - The action to execute.
   * @param item - An item associated with the action.
   */
  triggerAction(action: Action, item: ListItem): void;
}
declare const LayerListSuperclass: typeof Widget & typeof IdentifiableMixin