비활성 요소의 금지 커서 제거
index.css 의 전역 button:disabled { cursor: not-allowed } 규칙과 개별
컴포넌트의 disabled:cursor-not-allowed / cursor-not-allowed 클래스를 모두
제거해 비활성 상태에서 기본 화살표 커서를 유지한다. opacity 등 기존 시각
피드백은 유지.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
edbaaf09aa
commit
dc48f57501
11 changed files with 12 additions and 16 deletions
|
|
@ -15,7 +15,7 @@ export default function Checkbox({ checked, onChange, disabled, className = '',
|
||||||
tabIndex={tabIndex}
|
tabIndex={tabIndex}
|
||||||
onClick={(e) => { e.stopPropagation(); !disabled && onChange?.(!checked) }}
|
onClick={(e) => { e.stopPropagation(); !disabled && onChange?.(!checked) }}
|
||||||
className={`${sizeCls} shrink-0 rounded-md border-2 flex items-center justify-center ${
|
className={`${sizeCls} shrink-0 rounded-md border-2 flex items-center justify-center ${
|
||||||
disabled ? 'opacity-40 cursor-not-allowed' : 'cursor-pointer'
|
disabled ? 'opacity-40' : 'cursor-pointer'
|
||||||
} ${className}`}
|
} ${className}`}
|
||||||
style={checked ? {
|
style={checked ? {
|
||||||
borderColor: 'var(--accent)',
|
borderColor: 'var(--accent)',
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@ export default function DatePicker({ value, onChange, placeholder = '날짜 선
|
||||||
type="button"
|
type="button"
|
||||||
onClick={(e) => stop(e, viewMode === 'years' ? prevYearRange : prevMonth)}
|
onClick={(e) => stop(e, viewMode === 'years' ? prevYearRange : prevMonth)}
|
||||||
disabled={viewMode === 'years' ? !canGoPrevYearRange : (year === minYear && month === 0)}
|
disabled={viewMode === 'years' ? !canGoPrevYearRange : (year === minYear && month === 0)}
|
||||||
className="p-1.5 rounded hover:bg-[var(--row-hover-bg)] disabled:opacity-30 disabled:cursor-not-allowed"
|
className="p-1.5 rounded hover:bg-[var(--row-hover-bg)] disabled:opacity-30"
|
||||||
style={{ color: 'var(--text-muted)' }}
|
style={{ color: 'var(--text-muted)' }}
|
||||||
>
|
>
|
||||||
<ChevronIcon dir="left" size={18} />
|
<ChevronIcon dir="left" size={18} />
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ export default function AdminImages() {
|
||||||
<button
|
<button
|
||||||
onClick={requestDelete}
|
onClick={requestDelete}
|
||||||
disabled={selectedIds.size === 0}
|
disabled={selectedIds.size === 0}
|
||||||
className="rounded-lg px-3 py-2 text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed hover:bg-[var(--btn-danger-bg-hover)]"
|
className="rounded-lg px-3 py-2 text-sm font-medium disabled:opacity-50 hover:bg-[var(--btn-danger-bg-hover)]"
|
||||||
style={{
|
style={{
|
||||||
background: 'var(--btn-danger-bg)',
|
background: 'var(--btn-danger-bg)',
|
||||||
color: 'var(--btn-primary-text)',
|
color: 'var(--btn-primary-text)',
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,7 @@ export default function ImagePicker({ open, onClose, onSelect, currentImageId })
|
||||||
<button
|
<button
|
||||||
onClick={() => setPage((p) => Math.max(1, p - 1))}
|
onClick={() => setPage((p) => Math.max(1, p - 1))}
|
||||||
disabled={page === 1}
|
disabled={page === 1}
|
||||||
className="w-8 h-8 rounded border hover:bg-[var(--btn-bg-hover)] disabled:opacity-30 disabled:cursor-not-allowed flex items-center justify-center text-sm"
|
className="w-8 h-8 rounded border hover:bg-[var(--btn-bg-hover)] disabled:opacity-30 flex items-center justify-center text-sm"
|
||||||
style={{
|
style={{
|
||||||
background: 'var(--btn-bg)',
|
background: 'var(--btn-bg)',
|
||||||
borderColor: 'var(--btn-border)',
|
borderColor: 'var(--btn-border)',
|
||||||
|
|
@ -185,7 +185,7 @@ export default function ImagePicker({ open, onClose, onSelect, currentImageId })
|
||||||
<button
|
<button
|
||||||
onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
|
onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
|
||||||
disabled={page === totalPages}
|
disabled={page === totalPages}
|
||||||
className="w-8 h-8 rounded border hover:bg-[var(--btn-bg-hover)] disabled:opacity-30 disabled:cursor-not-allowed flex items-center justify-center text-sm"
|
className="w-8 h-8 rounded border hover:bg-[var(--btn-bg-hover)] disabled:opacity-30 flex items-center justify-center text-sm"
|
||||||
style={{
|
style={{
|
||||||
background: 'var(--btn-bg)',
|
background: 'var(--btn-bg)',
|
||||||
borderColor: 'var(--btn-border)',
|
borderColor: 'var(--btn-border)',
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ export default function Pagination({ page, totalPages, onChange }) {
|
||||||
<button
|
<button
|
||||||
onClick={() => onChange(page - 1)}
|
onClick={() => onChange(page - 1)}
|
||||||
disabled={page === 1}
|
disabled={page === 1}
|
||||||
className={`${baseBtn} disabled:opacity-30 disabled:cursor-not-allowed`}
|
className={`${baseBtn} disabled:opacity-30`}
|
||||||
style={btnStyle}
|
style={btnStyle}
|
||||||
>
|
>
|
||||||
‹
|
‹
|
||||||
|
|
@ -61,7 +61,7 @@ export default function Pagination({ page, totalPages, onChange }) {
|
||||||
<button
|
<button
|
||||||
onClick={() => onChange(page + 1)}
|
onClick={() => onChange(page + 1)}
|
||||||
disabled={page === totalPages}
|
disabled={page === totalPages}
|
||||||
className={`${baseBtn} disabled:opacity-30 disabled:cursor-not-allowed`}
|
className={`${baseBtn} disabled:opacity-30`}
|
||||||
style={btnStyle}
|
style={btnStyle}
|
||||||
>
|
>
|
||||||
›
|
›
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,7 @@ export default function UploadModal({ open, onClose, onUpload, uploading, existi
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
disabled={!canSubmit || uploading}
|
disabled={!canSubmit || uploading}
|
||||||
className="flex-1 rounded-lg px-4 py-2 text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed hover:bg-[var(--btn-primary-bg-hover)]"
|
className="flex-1 rounded-lg px-4 py-2 text-sm font-medium disabled:opacity-50 hover:bg-[var(--btn-primary-bg-hover)]"
|
||||||
style={{
|
style={{
|
||||||
background: 'var(--btn-primary-bg)',
|
background: 'var(--btn-primary-bg)',
|
||||||
color: 'var(--btn-primary-text)',
|
color: 'var(--btn-primary-text)',
|
||||||
|
|
|
||||||
|
|
@ -283,7 +283,7 @@ export default function BossForm() {
|
||||||
}}
|
}}
|
||||||
disabled={!v.enabled}
|
disabled={!v.enabled}
|
||||||
placeholder="결정 가격"
|
placeholder="결정 가격"
|
||||||
className="w-full rounded-lg border pl-4 pr-28 py-2 text-sm outline-none focus:border-[var(--input-border-focus)] disabled:opacity-50 disabled:cursor-not-allowed"
|
className="w-full rounded-lg border pl-4 pr-28 py-2 text-sm outline-none focus:border-[var(--input-border-focus)] disabled:opacity-50"
|
||||||
style={{
|
style={{
|
||||||
background: 'var(--input-bg)',
|
background: 'var(--input-bg)',
|
||||||
borderColor: priceErr ? 'var(--icon-danger-border)' : 'var(--input-border)',
|
borderColor: priceErr ? 'var(--icon-danger-border)' : 'var(--input-border)',
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ export function BossRow({ boss, sel, onChange, monthly = false, showDone = true
|
||||||
type="button"
|
type="button"
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
onClick={() => onChange({ done: !sel.done })}
|
onClick={() => onChange({ done: !sel.done })}
|
||||||
className="shrink-0 w-20 rounded-md h-8 text-xs font-semibold border disabled:cursor-not-allowed"
|
className="shrink-0 w-20 rounded-md h-8 text-xs font-semibold border"
|
||||||
style={disabled ? {
|
style={disabled ? {
|
||||||
borderColor: 'var(--panel-border)',
|
borderColor: 'var(--panel-border)',
|
||||||
color: 'var(--text-dim)',
|
color: 'var(--text-dim)',
|
||||||
|
|
|
||||||
|
|
@ -250,7 +250,7 @@ export default function WeeklyScheduler({ startDate, weeks: weeksProp, onChangeW
|
||||||
onClick={() => removeWeek(w.id)}
|
onClick={() => removeWeek(w.id)}
|
||||||
disabled={weeks.length <= 1}
|
disabled={weeks.length <= 1}
|
||||||
title={weeks.length <= 1 ? '최소 한 주차는 유지되어야 합니다' : '이 주차 삭제'}
|
title={weeks.length <= 1 ? '최소 한 주차는 유지되어야 합니다' : '이 주차 삭제'}
|
||||||
className="shrink-0 w-8 h-8 rounded-md hover:bg-[var(--danger-bg-hover)] hover:text-[var(--danger-text)] disabled:opacity-30 disabled:hover:bg-transparent disabled:cursor-not-allowed flex items-center justify-center"
|
className="shrink-0 w-8 h-8 rounded-md hover:bg-[var(--danger-bg-hover)] hover:text-[var(--danger-text)] disabled:opacity-30 disabled:hover:bg-transparent flex items-center justify-center"
|
||||||
style={{ color: 'var(--text-dim)' }}
|
style={{ color: 'var(--text-dim)' }}
|
||||||
>
|
>
|
||||||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none">
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none">
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,7 @@ function SymbolCard({ symbol, equipped, charId }) {
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => patch({ dailyDone: !dailyDone })}
|
onClick={() => patch({ dailyDone: !dailyDone })}
|
||||||
title="오늘 일퀘 완료 여부"
|
title="오늘 일퀘 완료 여부"
|
||||||
className="shrink-0 rounded-md h-8 px-3 text-xs font-semibold border disabled:opacity-40 disabled:cursor-not-allowed"
|
className="shrink-0 rounded-md h-8 px-3 text-xs font-semibold border disabled:opacity-40"
|
||||||
style={dailyDone ? {
|
style={dailyDone ? {
|
||||||
background: 'var(--selected-bg)',
|
background: 'var(--selected-bg)',
|
||||||
borderColor: 'var(--selected-border)',
|
borderColor: 'var(--selected-border)',
|
||||||
|
|
|
||||||
|
|
@ -354,10 +354,6 @@ a {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
button:disabled {
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* number input 화살표 숨기기 */
|
/* number input 화살표 숨기기 */
|
||||||
input[type="number"]::-webkit-inner-spin-button,
|
input[type="number"]::-webkit-inner-spin-button,
|
||||||
input[type="number"]::-webkit-outer-spin-button {
|
input[type="number"]::-webkit-outer-spin-button {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue