Latin Square

Abstract
Quoting common sources, “A Latin square is a k×k array filled with k different symbols, each occurring exactly once in each row and in each column.”
That definition reminds of a Sudoku grid without subdivision (3×3 boxes) constraints. In order to create puzzles, however, we need such regions; albeit arbitrarily shaped/positioned ones, because there won't be nicely tiling square boxes in grids other than sizes 4×4, 9×9, 16×16, et cetera, and our goal will be to construct 10×10 grids (using digits [0…9]) anyway.
On top of that, additional hints may be provided, just like in traditional/variant Sudoku.
Construction
The core algorithm for filling a k×k grid is relatively simple and compact, built on 3 helper arrays, 3 vars, and a function for array shuffling (here: amx()) only. Here the resulting grid is stored in array g:
//--- Declarations
const a=[],r=[],c=[];let i=k,o,j;
//--- Initialisation
while(i--)a.push(i);r.push(...amx(a));c.push(...amx(a));
//--- Calculation
for(i=k;i--;)for(o=r[i],j=k;j--;)g[c[++o%k]+i*k]=a[j];

Basic demo
This generator uses base36 for symbols ([0…9,a…v] or [1…9,a…w] respectively) to create a grid up to size 32×32 cells:
332
Start value0Size0

Regions
For the placement of 10 regions (in a 10×10 grid, as mentioned above, each containing all digits [0…9]), the following strategy is used:
For the seeding in step 2, there's at least two methods:
After all 10 seeds have been placed, the algorithm for step 3 (growth) loops through each region and does the following:
Here’s a step-by-step simulation of the process:
.
Seed method:

Region colours:
Free/region cells: /
Round