/**
 * @module @twind/preset-tailwind/preflight
 */

import type { Preflight } from '@twind/core'

import defaultTheme from './defaultTheme'

const preflight: Preflight = {
  /*
    1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
    2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
    */
  '*,::before,::after': {
    boxSizing: 'border-box' /* 1 */,
    borderWidth: '0' /* 2 */,
    borderStyle: 'solid' /* 2 */,
    borderColor: 'theme(borderColor.DEFAULT, currentColor)' /* 2 */,
  },

  '::before,::after': { '--tw-content': "''" },

  /*
    1. Use a consistent sensible line-height in all browsers.
    2. Prevent adjustments of font size after orientation changes in iOS.
    3. Use a more readable tab size.
    4. Use the user's configured `sans` font-family by default.
    */
  html: {
    lineHeight: 1.5 /* 1 */,
    WebkitTextSizeAdjust: '100%' /* 2 */,
    MozTabSize: '4' /* 3 */,
    tabSize: 4 /* 3 */,
    fontFamily: `theme(fontFamily.sans, ${
      (defaultTheme.fontFamily as Record<string, string>).sans
    })` /* 4 */,
  },

  /*
    1. Remove the margin in all browsers.
    2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
    */
  body: { margin: '0' /* 1 */, lineHeight: 'inherit' /* 2 */ },

  /*
    1. Add the correct height in Firefox.
    2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
    3. Ensure horizontal rules are visible by default.
    */
  hr: { height: '0' /* 1 */, color: 'inherit', /* 2 */ borderTopWidth: '1px' /* 3 */ },

  /*
    Add the correct text decoration in Chrome, Edge, and Safari.
    */
  'abbr:where([title])': { textDecoration: 'underline dotted' },

  /*
    Remove the default font size and weight for headings.
    */
  'h1,h2,h3,h4,h5,h6': { fontSize: 'inherit', fontWeight: 'inherit' },

  /*
    Reset links to optimize for opt-in styling instead of opt-out.
    */
  a: { color: 'inherit', textDecoration: 'inherit' },

  /*
    Add the correct font weight in Edge and Safari.
    */
  'b,strong': { fontWeight: 'bolder' },

  /*
    1. Use the user's configured `mono` font family by default.
    2. Correct the odd `em` font sizing in all browsers.
    */
  'code,kbd,samp,pre': {
    fontFamily: `theme(fontFamily.mono, ${
      (defaultTheme.fontFamily as Record<string, string>).mono
    })`,
    fontSize: '1em',
  },

  /*
    Add the correct font size in all browsers.
    */
  small: { fontSize: '80%' },

  /*
    Prevent `sub` and `sup` elements from affecting the line height in all browsers.
    */
  'sub,sup': {
    fontSize: '75%',
    lineHeight: 0,
    position: 'relative',
    verticalAlign: 'baseline',
  },
  sub: { bottom: '-0.25em' },
  sup: { top: '-0.5em' },

  /*
    1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
    2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
    3. Remove gaps between table borders by default.
    */
  table: {
    textIndent: '0' /* 1 */,
    borderColor: 'inherit' /* 2 */,
    borderCollapse: 'collapse' /* 3 */,
  },

  /*
    1. Change the font styles in all browsers.
    2. Remove the margin in Firefox and Safari.
    3. Remove default padding in all browsers.
    */
  'button,input,optgroup,select,textarea': {
    fontFamily: 'inherit' /* 1 */,
    fontSize: '100%' /* 1 */,
    lineHeight: 'inherit' /* 1 */,
    color: 'inherit' /* 1 */,
    margin: '0' /* 2 */,
    padding: '0' /* 3 */,
  },

  /*
    Remove the inheritance of text transform in Edge and Firefox.
    */
  'button,select': { textTransform: 'none' },

  /*
    1. Correct the inability to style clickable types in iOS and Safari.
    2. Remove default button styles.
    */
  "button,[type='button'],[type='reset'],[type='submit']": {
    WebkitAppearance: 'button' /* 1 */,
    backgroundColor: 'transparent' /* 2 */,
    backgroundImage: 'none' /* 4 */,
  },

  /*
    Use the modern Firefox focus style for all focusable elements.
    */
  ':-moz-focusring': { outline: 'auto' },

  /*
    Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
    */
  ':-moz-ui-invalid': { boxShadow: 'none' },

  /*
    Add the correct vertical alignment in Chrome and Firefox.
    */
  progress: { verticalAlign: 'baseline' },

  /*
    Correct the cursor style of increment and decrement buttons in Safari.
    */
  '::-webkit-inner-spin-button,::-webkit-outer-spin-button': {
    height: 'auto',
  },

  /*
    1. Correct the odd appearance in Chrome and Safari.
    2. Correct the outline style in Safari.
    */
  "[type='search']": { WebkitAppearance: 'textfield' /* 1 */, outlineOffset: '-2px' /* 2 */ },

  /*
    Remove the inner padding in Chrome and Safari on macOS.
    */
  '::-webkit-search-decoration': { WebkitAppearance: 'none' },

  /*
    1. Correct the inability to style clickable types in iOS and Safari.
    2. Change font properties to `inherit` in Safari.
    */
  '::-webkit-file-upload-button': {
    WebkitAppearance: 'button' /* 1 */,
    font: 'inherit' /* 2 */,
  },

  /*
    Add the correct display in Chrome and Safari.
    */
  summary: { display: 'list-item' },

  /*
    Removes the default spacing and border for appropriate elements.
    */
  'blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre': {
    margin: '0',
  },
  fieldset: { margin: '0', padding: '0' },
  legend: { padding: '0' },
  'ol,ul,menu': { listStyle: 'none', margin: '0', padding: '0' },

  /*
    Prevent resizing textareas horizontally by default.
    */
  textarea: { resize: 'vertical' },

  /*
    1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
    2. Set the default placeholder color to the user's configured gray 400 color.
    */
  'input::placeholder,textarea::placeholder': {
    opacity: 1 /* 1 */,
    color: 'theme(colors.gray.400, #9ca3af)' /* 2 */,
  },

  /*
    Set the default cursor for buttons.
    */
  'button,[role="button"]': { cursor: 'pointer' },

  /*
    Make sure disabled buttons don't get the pointer cursor.
    */
  ':disabled': { cursor: 'default' },

  /*
    1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
    2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
      This can trigger a poorly considered lint error in some tools but is included by design.
    */
  'img,svg,video,canvas,audio,iframe,embed,object': {
    display: 'block' /* 1 */,
    verticalAlign: 'middle' /* 2 */,
  },

  /*
    Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
    */
  'img,video': { maxWidth: '100%', height: 'auto' },

  /* Make elements with the HTML hidden attribute stay hidden by default */
  '[hidden]': { display: 'none' },
}

export default preflight
