```ts
/**
 * Spreads items across crates as evenly as possible.
 * @param items - The total number of items to distribute.
 * @param crates - The number of crates to fill.
 * @returns An array of crate sizes, largest first.
 */
export function crateFill(items: number, crates: number): number[] {
  if (crates <= 0) return [];
  const baseSize = Math.floor(items / crates);
  const remainder = items % crates;
  return Array(crates).fill(baseSize).map((size, i) => size + (i < remainder ? 1 : 0)).reverse();
}

/**
 * Sums up the sizes of a list of crates.
 * @param sizes - An array of crate sizes.
 * @returns The total number of items in all crates.
 */
export function crateTotal(sizes: number[]): number {
  return sizes.reduce((total, size) => total + size, 0);
}
```