@use 'sass:map';
@use 'sass:meta';
@use '../context' as *;

@include layer(utilities, $use-css-layers, $layer-prefix) {
// aspect
@include spread-map-into-utilities(
	$map: $aspect-ratio,
	$class: aspect,
	$attribute: aspect-ratio,
	$prop: aspect,
	$bps: $breakpoints,
	$zero-specificity: $zero-specificity-for-utilities
);

// container
%container {
	width: 100%;
	max-width: var(--breakpoint-value, 100%);
}

@include wrap-with-where(
	$selector: '.container',
	$enabled: $zero-specificity-for-utilities
) {
	@extend %container;
}

// columns
@include spread-map-into-utilities(
	$map: $columns,
	$class: columns,
	$attribute: column-count,
	$bps: $breakpoints,
	$zero-specificity: $zero-specificity-for-utilities
);

// break-after
@include spread-map-into-utilities(
	$map: $break-after,
	$class: break-after,
	$attribute: break-after,
	$zero-specificity: $zero-specificity-for-utilities
);

// break-before
@include spread-map-into-utilities(
	$map: $break-before,
	$class: break-before,
	$attribute: break-before,
	$zero-specificity: $zero-specificity-for-utilities
);

// break-inside
@include spread-map-into-utilities(
	$map: $break-inside,
	$class: break-inside,
	$attribute: break-inside,
	$zero-specificity: $zero-specificity-for-utilities
);

// display
@include spread-map-into-utilities(
	$map: $display-without-breakpoints,
	$attribute: display,
	$zero-specificity: $zero-specificity-for-utilities
);
@include spread-map-into-utilities(
	$map: $display-with-breakpoints,
	$attribute: display,
	$bps: $breakpoints,
	$zero-specificity: $zero-specificity-for-utilities
);

// object-fit
@include spread-map-into-utilities(
	$map: $object-fit,
	$class: object,
	$attribute: object-fit,
	$zero-specificity: $zero-specificity-for-utilities
);

// object-position
@include spread-map-into-utilities(
	$map: $object-position,
	$class: object,
	$attribute: object-position,
	$zero-specificity: $zero-specificity-for-utilities
);

// overflow
@each $key, $value in $overflow {
	%overflow-#{$key} {
		overflow: #{$value};
	}

	@include wrap-with-where(
		$selector: '.overflow-#{$key}',
		$enabled: $zero-specificity-for-utilities
	) {
		@extend %overflow-#{$key};
	}

	@each $prefix in (x, y) {
		%overflow-#{$prefix}-#{$key} {
			overflow-#{$prefix}: #{$value};
		}

		@include wrap-with-where(
			$selector: '.overflow-#{$prefix}-#{$key}',
			$enabled: $zero-specificity-for-utilities
		) {
			@extend %overflow-#{$prefix}-#{$key};
		}
	}
}

// position
@include spread-map-into-utilities(
	$map: $position,
	$attribute: position,
	$bps: $breakpoints,
	$zero-specificity: $zero-specificity-for-utilities
);

// visibility
@include spread-map-into-utilities(
	$map: $visibility,
	$attribute: visibility,
	$bps: $breakpoints,
	$zero-specificity: $zero-specificity-for-utilities
);

// top / right / bottom / left
@each $size,
	$value in map.merge($placement, map.merge($spacing, $spacing-dynamic))
{
	$var: $value;

	@if not map.has-key($placement, $size) {
		// check if value is not a map (spacing-dynamic)
		$var: var(--spacing-#{$size});

		@if meta.type-of($value) != 'map' {
			$var: var(--spacing-#{$size}, #{$value});
		}
	}

	// all
	%inset-#{$size} {
		inset: #{$var};
	}

	@include wrap-with-where(
		$selector: '.inset-#{$size}',
		$enabled: $zero-specificity-for-utilities
	) {
		@extend %inset-#{$size};
	}

	// horizontal
	%inset-x-#{$size} {
		inset-inline: #{$var};
	}

	@include wrap-with-where(
		$selector: '.inset-x-#{$size}',
		$enabled: $zero-specificity-for-utilities
	) {
		@extend %inset-x-#{$size};
	}

	// vertical
	%inset-y-#{$size} {
		inset-block: #{$var};
	}

	@include wrap-with-where(
		$selector: '.inset-y-#{$size}',
		$enabled: $zero-specificity-for-utilities
	) {
		@extend %inset-y-#{$size};
	}

	// sides
	@each $direction in(top, right, bottom, left) {
		%#{$direction}-#{$size} {
			#{$direction}: #{$var};
		}

		@include wrap-with-where(
			$selector: '.#{$direction}-#{$size}',
			$enabled: $zero-specificity-for-utilities
		) {
			@extend %#{$direction}-#{$size};
		}
	}
}

// z-index
@include spread-map-into-utilities(
	$map: $z-index,
	$class: z,
	$attribute: z-index,
	$prop: z,
	$zero-specificity: $zero-specificity-for-utilities
);

}
