Files
2026-07-13 12:12:04 +08:00

84 lines
2.0 KiB
CSS

/* === Focus Ring === */
@utility focus-ring {
@apply ring-2 ring-focus ring-offset-0 ring-offset-background outline-none;
/* Overrides the ring offset from the theme variables */
--tw-ring-offset-width: var(--ring-offset-width);
}
@utility focus-field-ring {
@apply ring-2 ring-focus ring-offset-0 outline-none;
/* No separation - ring sits directly against the element */
--tw-ring-offset-width: 0px;
}
@utility invalid-field-ring {
/* Unfocused: show 1px outline */
@apply outline-1 outline-danger outline-solid;
--tw-ring-offset-width: 3px;
/* Focused: show 2px ring in danger color, remove outline */
&:focus,
&:focus-visible,
&[data-focused="true"],
&[data-focus-visible="true"],
&:focus-within,
&[data-focus-within="true"] {
@apply ring-2 ring-danger ring-offset-0;
--tw-ring-offset-width: 0px;
}
}
@utility no-highlight {
-webkit-tap-highlight-color: transparent;
}
/* === Statuses === */
@utility status-focused {
@apply focus-ring;
}
@utility status-focused-field {
@apply focus-field-ring;
}
@utility status-invalid-field {
@apply invalid-field-ring;
}
@utility status-disabled {
opacity: var(--disabled-opacity);
cursor: var(--cursor-disabled);
pointer-events: none;
}
@utility status-pending {
@apply pointer-events-none;
}
/* === Scrollbars (standards-only; apply per scroll slot in component CSS) === */
@utility scrollbar {
scrollbar-width: var(--scrollbar-width);
scrollbar-color: var(--scrollbar-color);
scrollbar-gutter: var(--scrollbar-gutter);
}
@utility scrollbar-thin {
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
scrollbar-gutter: auto;
}
@utility scrollbar-default {
scrollbar-width: auto;
scrollbar-color: auto;
scrollbar-gutter: auto;
}
/* Direct properties only — does not inherit none to nested scroll slots */
@utility scrollbar-none {
scrollbar-width: none;
scrollbar-color: auto;
scrollbar-gutter: auto;
-ms-overflow-style: none;
}