% Robust commands, paragraphs, brace groups, and leading zeros in user
% supplied text. The boards in this file are small, so the complete run
% stays on one page and no page is shipped out before the end marker.
\input regression-test.tex
\documentclass{article}
\usepackage[reference-date=2026-07-18,startdate=2026-07-01]{kanban-board}
\def\kbmacrodate{2026-07-18}
\def\kbrobustdate{\textsc{soon}}
\ExplSyntaxOn
\NewDocumentCommand \kbcheckboardcolumns {mm}
  {
    \str_if_eq:eeTF
      {\clist_use:Nn \l__kanban_board_columns_clist {,}} {#1}
      {\TYPE{#2~OK}}
      {\TYPE{#2~FAILED}}
  }
\ExplSyntaxOff
\begin{document}
\sbox0{\scriptsize $x$}% Load math font sizes outside captured output.
\START
\begingroup
  % Deadline diagnostics are issued when a task is declared. Capture them
  % semantically, because the console rendering of l3msg varies across TeX
  % Live releases. A robust command in a deadline is a neutral label and
  % must neither warn nor derail the run.
  \ExplSyntaxOn
  \cs_set_protected:Npn \msg_warning:nnn #1#2#3
    {\TYPE{KANBAN~WARNING:~#2~'#3'}}
  \ExplSyntaxOff
  \begin{kanban}[columns={Queue}]
    \kanbantask[due=\emph{soon}]{Queue}{A robust deadline}
    \kanbantask[due={\textbf{2026-07-18}}]{Queue}{A wrapped date}
    \kanbantask[due=\kbrobustdate]{Queue}{A macro to a robust command}
    \kanbantask[due=\kbmacrodate]{Queue}{A macro to a date}
    \kanbantask[late]{Queue}{A late task without a deadline}
    \kanbantask[due=M01]{Queue}{A leading-zero project month}
    \kanbantask[due=M000]{Queue}{An all-zero project month}
    \kanbantask[due=01.01.0000]{Queue}{A year zero date}
    \TYPE{KANBAN ROBUST DEADLINE DECLARATIONS OK}
  \end{kanban}
\endgroup
\TYPE{KANBAN ROBUST DEADLINE RENDERING OK}
\begin{kanban}[columns={Queue}]
  \kanbantask{Queue}{First paragraph.\par Second paragraph.}
  \kanbantask{Queue}{First paragraph.

    Second paragraph.}
  \makeatletter
  \ifnum\csuse{kanban@count@\kanban@boardgroup @1}=2\relax
    \TYPE{KANBAN PARAGRAPHS IN CARD TEXT OK}
  \else
    \TYPE{KANBAN PARAGRAPHS IN CARD TEXT FAILED}
  \fi
  \makeatother
\end{kanban}
\begin{kanban}[columns={\emph{Soon},Later}]
  \kbcheckboardcolumns{SOON,LATER}{KANBAN ROBUST COLUMN KEYS}
  \makeatletter
  \ifcsstring{kanban@name@1}{\emph{Soon}}
    {\TYPE{KANBAN ROBUST HEADING PRESERVED OK}}
    {\TYPE{KANBAN ROBUST HEADING PRESERVED FAILED}}
  \makeatother
  \kanbantask{soon}{A plain target for an emphasized heading}
  \kanbantask{\emph{soon}}{An emphasized target}
  \makeatletter
  \ifnum\csuse{kanban@count@\kanban@boardgroup @1}=2\relax
    \TYPE{KANBAN ROBUST COLUMN TARGETS OK}
  \else
    \TYPE{KANBAN ROBUST COLUMN TARGETS FAILED}
  \fi
  \makeatother
\end{kanban}
\begin{kanban}[columns={Q{1},Q{2}}]
  \kbcheckboardcolumns{Q1,Q2}{KANBAN BRACE GROUP COLUMN KEYS}
  \makeatletter
  \ifcsstring{kanban@name@2}{Q{2}}
    {\TYPE{KANBAN BRACE GROUP HEADING PRESERVED OK}}
    {\TYPE{KANBAN BRACE GROUP HEADING PRESERVED FAILED}}
  \makeatother
  \kanbantask{Q{1}}{A brace group target}
  \kanbantask{q{2}}{A lowercase brace group target}
  \makeatletter
  \ifnum\csuse{kanban@count@\kanban@boardgroup @2}=1\relax
    \TYPE{KANBAN BRACE GROUP COLUMN TARGETS OK}
  \else
    \TYPE{KANBAN BRACE GROUP COLUMN TARGETS FAILED}
  \fi
  \makeatother
\end{kanban}
\END
\end{document}
