innerhtml(puzzle_generating_indicator,"generating") :- puzzle_generating
innerhtml(puzzle_generating_indicator,"not_generating") :- ~puzzle_generating
style(loading_container,"display",flex) :- puzzle_generating
style(loading_container,"display",none) :- ~puzzle_generating
innerhtml(cell_header(Column), ColumnName) :- ~puzzle_generating & column_name(Column, ColumnName)
innerhtml(cell_title(Row),Category) :- ~puzzle_generating & listpair(Row,Category)
% For every clue besides `is_at_certain_location`.
innerhtml(clue_ui_content(Index),Content) :- ~puzzle_generating & ordered_clue(Index,A,B) & distinct(B, is_at_certain_location) & decomposeRule(clue(A,B),Content)
% For `is_at_certain_location` clues.
innerhtml(clue_ui_content(Index),Content) :- ~puzzle_generating & ordered_clue(Index,[Emoji, Column],is_at_certain_location) & column_name(Column, ColumnName) & decomposeRule(clue([Emoji, ColumnName],is_at_certain_location),Content)
style(clue_ui_line(Index),"display",none) :- ~puzzle_generating & ~ordered_clue(Index,_,_)
style(clue_ui_line(Index),"display",block) :- ~puzzle_generating & ordered_clue(Index,_,_)
click(add_hint_button) & evaluate(choose(hidden_clue([Item,I2],ClueType),hidden_clue([Item,I2],ClueType)),hidden_clue([Item,I2],ClueType)) & clue_count(ClueCount) & evaluate(plus(ClueCount,1),ClueCountPlusOne) ==> ~hidden_clue([Item,I2],ClueType) & ordered_clue(ClueCount,[Item,I2],ClueType) & ~clue_count(ClueCount) & clue_count(ClueCountPlusOne)
value(picked(Row,Column), Emoji) :- ~puzzle_generating & emoji_title_picked(Row,Column,Emoji)
select(picked(Row,Column), Emoji) & distinct(Emoji, unselect) ==> emoji_title_picked(Row,Column,Emoji)
select(picked(Row,Column), Emoji) & emoji_title_picked(Row,Column,Emoji2) ==> ~emoji_title_picked(Row,Column,Emoji2)
innerhtml(canpick(Row,Col,Option),Emoji) :- ~puzzle_generating & category(All,Row) & puzzle_size(M,N) & number_list(NList,N) & member(Col,NList) & member(Option,NList) & getNthElement(All,Emoji,Option)
attribute(canpick(Row,Col,Option),"value",Title) :- ~puzzle_generating & category(All,Row) & puzzle_size(M,N) & number_list(NList,N) & member(Col,NList) & member(Option,NList) & getNthElement(All,Emoji,Option) & item(Category,Title,Emoji)
attribute(canpick(Row,Col,-1),"value",unselect) :- category(All,Row) & puzzle_size(M,N) & number_list(NList,N) & member(Col,NList)
innerhtml(titleemoji(Row,Option),Emoji) :- innerhtml(canpick(Row,0,Option),Emoji)
picked(Row,Column,Emoji) :- emoji_title_picked(Row,Column,EmojiTitle) & item(_,EmojiTitle,Emoji)
style(picked(Row,Column), "background-color", "#B1040E") :- conflict(Row,Column,_,_)
style(picked(Row,Column), "background-color", transparent) :- ~conflict(Row,Column,_,_)
style(cell_cell(Row,Column), "background-color", BackgroundColor) :- style(picked(Row,Column), "background-color", BackgroundColor)
conflict(Row, Column, Emoji, ConflictClue) :- ~puzzle_generating & ((picked(Row, Column, Emoji) & picked(Row,Column2,Emoji) & distinct(Column,Column2) & same(Emoji,Emoji) & same(ConflictClue, clue([], no_same_emoji_on_same_row))) | conflict_left(Row,Column,Emoji, is_to_left_of, ConflictClue) | conflict_right(Row, Column, Emoji, is_to_right_of, ConflictClue) | conflict_left_right(Row, Column, Emoji, ConflictClue) | conflict_location(Row, Column, Emoji, ConflictClue) | conflict_is(Row, Column, Emoji, ConflictClue))
conflict_left(Row, Column, Emoji, Rule_kind, clue([Emoji, OtherEmoji], Rule_kind)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row,Column,Emoji) & clue([Emoji, OtherEmoji], Rule_kind) & ((getPuzzleSizeZeroIndexed(_, NMinusOne) & same(Column,NMinusOne)) | (evaluate(plus(Column, 1),Column2) & picked(Row2, Column2, Emoji2) & distinct(Emoji2, OtherEmoji) & item(Category, _, OtherEmoji) & listpair(Row2,Category)))
conflict_left(Row, Column, OtherEmoji, Rule_kind, clue([Emoji, OtherEmoji], Rule_kind)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,OtherEmoji) & clue([Emoji, OtherEmoji], Rule_kind) & (same(Column, 0) | (evaluate(minus(Column, 1),Column2) & picked(Row2, Column2, Emoji2) & distinct(Emoji, Emoji2) & item(Category, _, Emoji) & listpair(Row2,Category)))
conflict_right(Row, Column, Emoji, Rule_kind, clue([Emoji, OtherEmoji], Rule_kind)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,Emoji) & clue([Emoji, OtherEmoji], Rule_kind) & (same(Column, 0) | (evaluate(minus(Column, 1),Column2) & picked(Row2, Column2, Emoji2) & distinct(Emoji2, OtherEmoji) & item(Category, _, OtherEmoji) & listpair(Row2,Category)))
conflict_right(Row, Column, OtherEmoji, Rule_kind, clue([Emoji, OtherEmoji], Rule_kind)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,OtherEmoji) & clue([Emoji, OtherEmoji], Rule_kind) & ((getPuzzleSizeZeroIndexed(_, NMinusOne) & same(Column,NMinusOne)) | (evaluate(plus(Column, 1),Column2) & picked(Row2, Column2, Emoji2) & distinct(Emoji2, Emoji) & item(Category, _, Emoji) & listpair(Row2,Category)))
conflict_left_right(Row, Column, Emoji, ConflictClue) :- conflict_left(Row, Column, Emoji, is_to_either_side_of, ConflictClue) & conflict_right(Row, Column, Emoji, is_to_either_side_of, ConflictClue)
conflict_location(Row, Column, Emoji, clue([Emoji, Rule_location], is_at_certain_location)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row,Column,Emoji) & clue([Emoji, Rule_location], is_at_certain_location) & distinct(Column, Rule_location)
conflict_is(Row, Column, Emoji, clue([Emoji, OtherEmoji], is)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,Emoji) & clue([Emoji, OtherEmoji], is) & item(Category, _, OtherEmoji) & listpair(Row2, Category) & picked(Row2, Column, Emoji2) & distinct(Emoji2, OtherEmoji)
conflict_is(Row, Column, OtherEmoji, clue([Emoji, OtherEmoji], is)) :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & picked(Row, Column,OtherEmoji) & clue([Emoji, OtherEmoji], is) & item(Category, _, Emoji) & listpair(Row2, Category) & member(Row2,MList) & picked(Row2, Column, Emoji2) & distinct(Emoji2, Emoji)
% Highlight conflicted rules
rule_conflict(ConflictClue) :- ~puzzle_generating & puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & number_list(NList,N) & member(Column,NList) & conflict(Row, Column, Emoji, ConflictClue)
style(clue_ui_content(Index), "color", "red") :- ~puzzle_generating & ordered_clue(Index,A,B) & rule_conflict(clue(A, B))
style(clue_ui_content(Index), "color", "inherit") :- ~puzzle_generating & ordered_clue(Index,A,B) & ~rule_conflict(clue(A, B))
is_one_cell_not_picked() :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & number_list(NList,N) & member(Column,NList) & ~picked(Row, Column, Emoji)
is_one_cell_conflicted() :- puzzle_size(M,N) & number_list(MList,M) & member(Row,MList) & number_list(NList,N) & member(Column,NList) & conflict(Row, Column, Emoji, _)
style(puzzle_solved_div, "display", "block") :- ~is_one_cell_not_picked() & ~is_one_cell_conflicted()
style(puzzle_solved_div, "display", "none") :- is_one_cell_not_picked() | is_one_cell_conflicted()