.vkeyboard {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
  max-width: 340px;
  margin: 0 auto;
  padding: 16px;
  user-select: none;
  -webkit-user-select: none;
}

.vkey {
  width: 100%;
  aspect-ratio: 5 / 4;
  min-height: 64px;
  min-width: 48px;
  border: none;
  border-radius: 12px;
  font-size: 28px;
  font-weight: 500;
  background: #F5F5F5;
  color: var(--cls-color-text);
  cursor: pointer;
  transition: background 0.1s, transform 0.1s;
  user-select: none;
  -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent;
  display: flex;
  align-items: center;
  justify-content: center;
  outline: none;
  position: relative;
  overflow: hidden;
}

.vkey::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 0;
  height: 0;
  background: rgba(0, 0, 0, 0.08);
  border-radius: 50%;
  transform: translate(-50%, -50%);
  transition: width 0.3s, height 0.3s;
}

.vkey.ripple::after {
  width: 200%;
  height: 200%;
}

.vkey:active {
  background: #E0E0E0;
  transform: scale(0.95);
}

.vkey-delete {
  background: #FFEBEE;
  color: var(--cls-color-error);
  font-size: 22px;
}

.vkey-delete:active {
  background: #FFCDD2;
}

.vkey-empty {
  background: transparent;
  cursor: default;
  pointer-events: none;
  min-height: 64px;
}

.vkey-disabled {
  opacity: 0.4;
  pointer-events: none;
  cursor: not-allowed;
}

@media (max-height: 700px) {
  .vkeyboard { gap: 8px; padding: 8px; }
  .vkey { min-height: 52px; font-size: 24px; }
  .vkey-delete { font-size: 18px; }
}

@media (max-height: 550px) {
  .vkeyboard { gap: 6px; padding: 4px; }
  .vkey { min-height: 44px; font-size: 20px; border-radius: 8px; }
  .vkey-delete { font-size: 16px; }
}

@media (min-height: 900px) {
  .vkeyboard { gap: 16px; padding: 24px; max-width: 380px; }
  .vkey { min-height: 76px; font-size: 32px; }
  .vkey-delete { font-size: 26px; }
}
