// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/*
// DOM shim. This file contains everything we need from the DOM API written as
// @staticInterop, so we don't need dart:html
// https://developer.mozilla.org/en-US/docs/Web/API/
//
// (To be replaced by `package:web`)
*/

import 'package:js/js.dart';

/// Document interface
@JS()
@staticInterop
abstract class DomHtmlDocument {}

/// Some methods of document
extension DomHtmlDocumentExtension on DomHtmlDocument {
  /// document.head
  external DomHtmlElement get head;

  /// document.createElement
  external DomHtmlElement createElement(String tagName);
}

/// An instance of an HTMLElement
@JS()
@staticInterop
abstract class DomHtmlElement {}

/// (Some) methods of HtmlElement
extension DomHtmlElementExtension on DomHtmlElement {
  /// Node.appendChild
  external DomHtmlElement appendChild(DomHtmlElement child);

  /// Element.remove
  external void remove();
}

/// An instance of an HTMLMetaElement
@JS()
@staticInterop
abstract class DomHtmlMetaElement extends DomHtmlElement {}

/// Some methods exclusive of Script elements
extension DomHtmlMetaElementExtension on DomHtmlMetaElement {
  external set name(String name);
  external set content(String content);
}

// Getters

/// window.document
@JS()
@staticInterop
external DomHtmlDocument get document;
