/** BookingCalendarDemo：布局数值与虚拟列表高度等（无演示种子数据）。 */

export var timeSliceMinutes = 60;
/** 未传 timelineRange 时默认营业日界钟 */
export var DEFAULT_CALENDAR_TIMELINE = {
  start: '02:00',
  end: '02:00'
};
export var frozenColWidth = 132;
export var dayColWidth = 92;
/**
 * 日历「资源视图」横向每一「日」列宽度（按月天数铺开）。
 * 略大于 {@link dayColWidth}，仅作用于资源视图；日视图时间轴仍用 dayColWidth。
 */
export var resourceViewDayColWidth = 102;
/**
 * 日/周视图空档虚线框：在父级为 column flex 且占满格高时 `flex-1 min-h-0` 纵向铺满剩余区域。
 */
export var CALENDAR_EMPTY_DASHED_SLOT_CLASSNAME = 'flex min-h-0 flex-1 w-full flex-col items-center justify-center rounded-lg border border-dashed px-2 py-1 text-xs';
/** 日视图无 overlay 时资源行默认高度；周视图 court 行与各日期格 `minHeight` 与之对齐 */
export var dayRowHeight = 44;
/**
 * 资源视图月格：单条预约卡片**实际 min-height** 与「行高估算」共用此值。
 * 调整此常量即可同步改变卡片显示高度与父行预留高度，避免行高与卡片高度不一致导致的截断 / 留白。
 */
export var RESOURCE_VIEW_BOOKING_CARD_EST_PX = 48;
/** 资源视图「+N」tile 的 min-height */
export var RESOURCE_VIEW_MORE_TILE_MIN_PX = 48;
/** 资源视图单元格 p-1 上下合计 */
export var RESOURCE_VIEW_CELL_PADDING_Y_PX = 8;
/** 资源视图 fullyBooked 占位块 min-height */
export var RESOURCE_VIEW_FULLY_BOOKED_BLOCK_PX = 28;
/**
 * 资源视图：单 court 行最多展示的 lane 数；超出 → 该天落入 cell 级 `+N` 溢出
 */
export var RESOURCE_VIEW_MAX_LANE = 3;
/**
 * 周视图：单 court 行最多展示的 lane 数（含 pill）。
 * 比资源视图小：周列宽 ≈ 1 天，行高过大会让 5/27–5/31 这种"中间天"出现大块底部空白
 * （短跨日 pill 只占 5/25–5/26 的 lane 2，但行高被全周 max 撑到 3 lane）。
 * 这里取 2 → 长跨日两条占顶 lane 0/1，短跨日和单日全部进 cell 级 +N tile，行高紧凑。
 */
export var WEEK_VIEW_MAX_LANE = 2;
/** 月视图：每周内最多展示的 lane 数；超出 → cell 级 `+N` 溢出（M1：跨自然周续画时端部加 ◀/▶） */
export var MONTH_VIEW_MAX_LANE = 3;
/** 月视图 banner 高度（细于周视图 pill，节省每个 cell 的垂直空间） */
export var MONTH_VIEW_BANNER_H = 22;
/** 月视图 banner 之间纵向间距 */
export var MONTH_VIEW_BANNER_GAP = 2;
/** 月视图 banner 区域顶部留白（cell header 已留 padding，这里只补 banner 自身上边距） */
export var MONTH_VIEW_BANNER_PAD_Y = 2;
/** 月视图 cell header 估算高度：日期数字 + 占用 dot，banner 起点的 top 偏移 */
export var MONTH_VIEW_DAY_HEADER_H = 52;
/** 月视图 +N tile 高度（与 banner 一致以对齐 lane 槽） */
export var MONTH_VIEW_MORE_TILE_PX = 22;

/** 月视图：给定可见 lane 数与是否有 +N，banner 区所需高度（px） */
export function monthWeekBannerContentHeightPx(visibleLanes, hasOverflow) {
  var h = MONTH_VIEW_BANNER_PAD_Y;
  if (visibleLanes > 0) {
    h += visibleLanes * MONTH_VIEW_BANNER_H + Math.max(0, visibleLanes - 1) * MONTH_VIEW_BANNER_GAP;
  }
  if (hasOverflow) {
    h += MONTH_VIEW_BANNER_GAP + MONTH_VIEW_MORE_TILE_PX;
  }
  return h;
}

/**
 * 月视图：在固定行高、不可滚动的前提下，根据 banner 区可用高度推算本行最多展示几条。
 * 超出部分走 cell 级 +N，避免底部 banner 被裁切却看不到 +N。
 */
export function monthViewEffectiveMaxLanes(bannerZoneHeightPx, totalLaneCount) {
  if (totalLaneCount <= 0) return 0;
  var cap = Math.min(MONTH_VIEW_MAX_LANE, totalLaneCount);
  for (var visible = cap; visible >= 1; visible -= 1) {
    var hasOverflow = totalLaneCount > visible;
    if (monthWeekBannerContentHeightPx(visible, hasOverflow) <= bannerZoneHeightPx) {
      return visible;
    }
  }
  return 1;
}

/** 日视图分组行默认高度（须容纳左侧折叠按钮等） */
export var groupRowHeight = 38;
export var dayHeaderHeight = 56;
/** 日视图 overlay 内单条预约卡片区最小高度（与 BookingCard、行高计算一致） */
export var DAY_BOOKING_CARD_MIN_PX = 64;
/** 日视图同一资源行内每条 lane 的最小高度（须 ≥ DAY_BOOKING_CARD_MIN_PX）；并行时抬高该行 */
export var DAY_OVERLAY_LANE_MIN_PX = DAY_BOOKING_CARD_MIN_PX;
export var DAY_OVERLAY_INNER_TOP = 8;
export var DAY_OVERLAY_INNER_BOTTOM = 8;
export var DAY_OVERLAY_LANE_GAP = 2;
/** 同一重叠簇内最多展示的预约条数；超出合并为第 4 行的 +N（与日/周时间轴 overlay 一致） */
export var DAY_OVERLAY_VISIBLE_BOOKING_CAP = 3;

/**
 * 日视图：某 court 行在「有预约 overlay」时的总高度（px），随并行展示条数 `displayLaneCount` 变高而变高（非固定常数）。
 * `displayLaneCount` 由 `effectiveDayOverlayDisplayLaneCount(最大并行数)` 得到，与 3+N 截断规则一致。
 */
export function dayCourtOverlayRowHeightPx(displayLaneCount) {
  var n = Math.max(1, displayLaneCount);
  return DAY_OVERLAY_INNER_TOP + DAY_OVERLAY_INNER_BOTTOM + n * DAY_OVERLAY_LANE_MIN_PX + (n - 1) * DAY_OVERLAY_LANE_GAP;
}

/**
 * 资源视图：按某一格「courtDaySummary」结果估算该格所需最小高度（px）。
 * 用于横向虚拟化仅挂载可见日期列时，仍按**全月**最大内容撑开行高，避免日程只在屏幕外列时出现行高塌陷。
 */
export function estimateResourceViewCourtCellHeightPx(summary) {
  var _summary$items$length, _summary$items;
  var pad = RESOURCE_VIEW_CELL_PADDING_Y_PX;
  if (summary.fullyBooked) {
    return RESOURCE_VIEW_FULLY_BOOKED_BLOCK_PX + pad;
  }
  var n = (_summary$items$length = (_summary$items = summary.items) === null || _summary$items === void 0 ? void 0 : _summary$items.length) !== null && _summary$items$length !== void 0 ? _summary$items$length : 0;
  if (n === 0) {
    return dayRowHeight;
  }
  var previewCount = Math.min(3, n);
  var moreCount = Math.max(0, n - 3);
  var showMoreTile = moreCount > 0 && previewCount > 0;
  var gap = 4;
  var content = previewCount * RESOURCE_VIEW_BOOKING_CARD_EST_PX + (previewCount > 1 ? (previewCount - 1) * gap : 0);
  if (showMoreTile) {
    content += gap + RESOURCE_VIEW_MORE_TILE_MIN_PX;
  }
  return pad + content;
}
/** 低于该宽度时日视图预约条内难以排下两行文案，默认用 Tooltip 展示完整信息 */
export var DAY_BOOKING_NARROW_PX = 88;
/** 低于该宽度时条内仅保留居中首字/圆点，避免文字竖排或完全不可读 */
export var DAY_BOOKING_MICRO_PX = 32;
/** 日视图横向：视口外多渲染的槽列数（减轻快速滚动白边） */
export var DAY_VIEW_COL_BUFFER = 5;
/** 日视图纵向：视口外多渲染的像素边距 */
export var DAY_VIEW_ROW_BUFFER_PX = 240;

/** 月/周/资源 +N 弹层内置列表行内容区高度（名称 + 时间） */
export var OVERFLOW_MODAL_SIMPLE_CARD_H = 56;
/** 日视图 lane +N：RoomCard 单行内容区高度（略大于格内条 min，可裁切次要信息） */
export var OVERFLOW_MODAL_DAY_CARD_H = 80;
export var OVERFLOW_MODAL_ROW_GAP = 8;
export var OVERFLOW_MODAL_SIMPLE_ROW_H = OVERFLOW_MODAL_SIMPLE_CARD_H + OVERFLOW_MODAL_ROW_GAP;
export var OVERFLOW_MODAL_DAY_ROW_H = OVERFLOW_MODAL_DAY_CARD_H + OVERFLOW_MODAL_ROW_GAP;
export var OVERFLOW_MODAL_LIST_MAX_H = 420;