<Head>
<!-- Flatpickr用 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<body>内 app/views/layouts/application.html.erb
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/ja.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
flatpickr(".flatpickr", {
altInput: true,
altFormat: "Y年m月d日",
dateFormat: "Y-m-d",
locale: "ja",
// カレンダー描画時の処理
onReady: function(selectedDates, dateStr, instance) {
// カレンダー全体の背景と文字色
instance.calendarContainer.style.backgroundColor = "#1f2937"; // 背景
instance.calendarContainer.style.color = "#f9fafb"; // 文字色
// Todayボタン追加
const todayBtn = document.createElement("button");
todayBtn.textContent = "Today";
todayBtn.className = "mt-2 px-3 py-1 bg-indigo-600 text-white rounded shadow hover:bg-indigo-500";
todayBtn.addEventListener("click", function() {
instance.setDate(new Date());
});
instance.calendarContainer.appendChild(todayBtn);
},
// 日ごとの描画処理(色分けなど)
onDayCreate: function(dObj, dStr, fp, dayElem) {
const day = dayElem.dateObj.getDay();
// 土曜日は青、日曜日は赤
if (day === 0) {
dayElem.style.color = "#ef4444"; // 日曜赤
} else if (day === 6) {
dayElem.style.color = "#3b82f6"; // 土曜青
}
// 今日の日付は丸背景+文字白
const today = new Date();
if (
dayElem.dateObj.getFullYear() === today.getFullYear() &&
dayElem.dateObj.getMonth() === today.getMonth() &&
dayElem.dateObj.getDate() === today.getDate()
) {
dayElem.style.background = "linear-gradient(135deg, #6366f1, #8b5cf6)";
dayElem.style.color = "#ffffff";
dayElem.style.borderRadius = "0.5rem";
}
}
});
});
</script>
<style>
<style>
/* Flatpickrのカスタムテーマ */
.flatpickr-calendar {
background: #1e293b; /* ダークブルー寄りの背景 */
border: none;
border-radius: 1rem;
box-shadow: 0 10px 25px rgba(0,0,0,0.4);
color: #f8fafc; /* 白系文字 */
font-weight: 500;
}
.flatpickr-day {
color: #f8fafc;
}
.flatpickr-day:hover,
.flatpickr-day.today {
background: linear-gradient(135deg, #6366f1, #8b5cf6); /* 視認性高いグラデ */
color: white;
border-radius: 0.5rem;
}
.flatpickr-weekday {
color: #cbd5e1;
}
.flatpickr-month {
color: #f8fafc;
}
.flatpickr-weekdays {
border-bottom: 1px solid #334155;
}
.flatpickr-day.selected {
background: #10b981; /* エメラルドグリーンで選択 */
color: white;
}
</style>
text_field TailWind_CSS
<div class="relative">
<label class="block text-sm font-medium text-gray-300 mb-2">ツアー開始日</label>
<div class="relative group">
<!-- date input -->
<div class="relative w-full">
<%= f.text_field :start_date, class: "flatpickr w-full rounded-md bg-gray-900 border border-gray-700 pl-4 pr-14 py-2 text-white placeholder-gray-400 focus:ring-2 focus:ring-indigo-500 focus:outline-none" %>
<button type="button"
onclick="document.querySelector('.flatpickr')._flatpickr.open()"
class="absolute right-4 top-1/2 -translate-y-1/2 bg-gradient-to-r from-indigo-500 to-purple-600
hover:from-indigo-400 hover:to-purple-500 text-white p-2 rounded-md shadow-lg
transition transform hover:scale-110 focus:outline-none focus:ring-2 focus:ring-indigo-400">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" class="w-5 h-5">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M8 7V3m8 4V3m-9 8h10m-11 8h12a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
</svg>
</button>
</div>
</div>
</div>