Default#
This default UI can be used for debugging and to see the current features of clinguin.
Usage#
Can be used with any domain-files!
$ clinguin client-server --domain-files placement/instance.lp placement/encoding.lp --ui-files default/ui.lp
UI Files#
ui.lp#
% # Window
% -------
elem(w, window, root).
attr(w, class, ("d-flex"; "flex-column")).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% #General attributes
attr(main(S), class, ("d-flex"; "flex-row";"bg-opacity-25";"w-100";"p-2";"rounded";"m-2")):-elem(main(S),container,_).
attr(main(S), class, ("bg-info")):-elem(main(S),container,_),not _clinguin_unsat.
attr(main(S), class, ("bg-danger")):-elem(main(S),container,_), _clinguin_unsat.
attr(section(S), class, ("d-flex"; "flex-column"; "align-items-center";"rounded";"p-2";"m-2";"bg-light";"shadow")):-elem(section(S),container,_).
attr(title(T), class, ("h5";"pb-1")):-elem(title(T),label,_).
attr(title(T), order, 1):-elem(title(T),label,_).
attr(content(C), class, ("d-flex"; "flex-column";"w-100";"p-1";"border-top";"border-bottom")):-elem(content(C),container,_).
attr(content(C), order, 2):-elem(content(C),container,_).
attr(footer(C), class, ("d-flex"; "flex-column";"w-100";"p-1")):-elem(footer(C),container,_).
attr(footer(C), order, 3):-elem(content(C),container,_).
attr(footer_elem(C), class, ("d-flex";"flex-row-reverse")):- elem(footer_elem(C),container,_).
attr(footer_item(C), class, ("m-1";"btn-primary")):- elem(footer_item(C),button,_).
attr(footer_item(C), class, ("m-1")):- elem(footer_item(C),textfield,_).
attr(footer_item(C), class, ("m-1";"btn-outline-dark")):- elem(footer_item(C),dropdown_menu,_).
attr(elem_container(C), class, ("d-flex"; "flex-row"; "align-items-left";"justify-content-between")):-elem(elem_container(C),container,_).
attr(elem_title(C), order, 1):-elem(elem_title(C),_,_).
attr(elem_title(C), class, ("pe-5";"fst-italic")):-elem(elem_title(C),_,_).
attr(elem_title(C), height, "28pt"):-elem(elem_title(C),label,_).
attr(elem_val(C), order, 2):-elem(elem_val(C),_,_).
attr(elem_val(C), class, ("btn-outline";"btn-small";"fw-light")):-elem(elem_val(C),_,_).
attr(elem_val(C), class, ("pe-3";"pt-1";"pb-1")):-elem(elem_val(C),label,_).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
elem(main(state), container, w).
attr(main(state), order, 1).
% % ## Files
% % ------------
% elem(section(files), container, main(state)).
% elem(title(files), label, section(files)).
% attr(title(files), label, "Files").
% elem(content(files), container, section(files)).
% ## Constants
% ------------
elem(section(constants), container, main(state)).
elem(title(constants), label, section(constants)).
attr(title(constants), label, "Constants").
elem(content(constants), container, section(constants)).
elem(elem_container(const(C)), container, content(constants)):-_clinguin_const(C,V).
elem(elem_title(const(C)), label, elem_container(const(C))):-_clinguin_const(C,V).
attr(elem_title(const(C)), label, @format("#const {}",C)):-_clinguin_const(C,V).
elem(elem_val(const(C)), label, elem_container(const(C))):-_clinguin_const(C,V).
attr(elem_val(const(C)), label,V):-_clinguin_const(C,V).
attr(elem_val(const(C)), tooltip,@format("_clinguin_const({},{})",C,V)):-_clinguin_const(C,V).
% attr(const_label(C), class, "w-100"):-_clinguin_const(C,V).
elem(footer(constants), container, section(constants)).
elem(footer_elem(constants), container, footer(constants)).
elem(footer_item(const(name)),textfield,footer_elem(constants)).
attr(footer_item(const(name)),placeholder,"name").
attr(footer_item(const(name)),width,"60pt").
when(footer_item(const(name)),input,context,(const_name,_value)).
elem(footer_item(const(val)),textfield,footer_elem(constants)).
attr(footer_item(const(val)),placeholder,"value").
attr(footer_item(const(val)),width,"60pt").
when(footer_item(const(val)),input,context,(const_value,_value)).
elem(footer_item(const(btn)),button,footer_elem(constants)).
attr(footer_item(const(btn)),label,"Set constant").
attr(footer_item(const(btn)),tooltip,"▶︎▶︎ set_constant(_,_)").
when(footer_item(const(btn)),click,call, set_constant(_context_value(const_name),_context_value(const_value))).
% #Todo how do we pass the opt properly?
% ## Optimization
% -------------
elem(section(opt), container, main(state)).
elem(title(opt), label, section(opt)).
attr(title(opt), label, "Optimization").
elem(content(opt), container, section(opt)).
elem(elem_container(opt(cost)), container, content(opt)).
elem(elem_container(opt(optimizing)), container, content(opt)).
elem(elem_container(opt(optimal)), container, content(opt)).
elem(elem_title(opt(cost)), label, elem_container(opt(cost))).
attr(elem_title(opt(cost)), label, "Cost").
elem(elem_val(opt(cost)), label, elem_container(opt(cost))).
attr(elem_val(opt(cost)), icon, "fa-circle-check").
attr(elem_val(opt(cost)), label, Cost):-_clinguin_cost(Cost).
attr(elem_val(opt(cost)), tooltip, "_clinguin_cost(_)"):-_clinguin_cost(Cost).
elem(elem_title(opt(optimal)), label, elem_container(opt(optimal))).
attr(elem_title(opt(optimal)), label, "Optimal").
elem(elem_val(opt(optimal)), button, elem_container(opt(optimal))).
attr(elem_val(opt(optimal)), icon, "fa-circle-check").
attr(elem_val(opt(optimal)), class, ("disabled";"border-0";"opacity-100")).
attr(elem_val(opt(optimal)), icon, "fa-circle-check"):-_clinguin_optimal.
attr(elem_val(opt(optimal)), class, ("text-success")):-_clinguin_optimal.
attr(elem_val(opt(optimal)), tooltip, "_clinguin_optimal"):-_clinguin_optimal.
attr(elem_val(opt(optimal)), icon, "fa-circle-xmark"):-not _clinguin_optimal.
attr(elem_val(opt(optimal)), class, ("text-danger")):-not _clinguin_optimal.
attr(elem_val(opt(optimal)), tooltip, "not _clinguin_optimal"):-not _clinguin_optimal.
elem(elem_title(opt(optimizing)), label, elem_container(opt(optimizing))).
attr(elem_title(opt(optimizing)), label, "Optimizing").
elem(elem_val(opt(optimizing)), button, elem_container(opt(optimizing))).
attr(elem_val(opt(optimizing)), class, ("disabled";"border-0";"opacity-100")).
attr(elem_val(opt(optimizing)), icon, "fa-circle-check"):-_clinguin_optimizing.
attr(elem_val(opt(optimizing)), class, ("text-success")):-_clinguin_optimizing.
attr(elem_val(opt(optimizing)), icon, "fa-circle-xmark"):-not _clinguin_optimizing.
attr(elem_val(opt(optimizing)), class, ("text-danger")):-not _clinguin_optimizing.
attr(elem_val(opt(optimizing)), tooltip, "_clinguin_optimizing"):-_clinguin_optimizing.
attr(elem_val(opt(optimizing)), tooltip, "not _clinguin_optimizing"):-not _clinguin_optimizing.
% ## UNSAT
% ------------
elem(section(unsat), container, main(state)):-_clinguin_unsat.
elem(title(unsat), label, section(unsat)):-_clinguin_unsat.
attr(title(unsat), label, "UNSAT"):-_clinguin_unsat.
attr(title(unsat), class, "text-danger"):-_clinguin_unsat.
elem(content(unsat), container, section(unsat)):-_clinguin_unsat.
% #Todo add MUS
% ## SAT
% ------------
elem(section(sat), container, main(state)):-not _clinguin_unsat.
attr(section(sat), class, ("bg-success")):-not _clinguin_unsat.
elem(title(sat), label, section(sat)):-not _clinguin_unsat.
attr(title(sat), label, "SAT"):-not _clinguin_unsat.
attr(title(sat), class, "text-success"):-not _clinguin_unsat.
elem(content(sat), container, section(sat)):-not _clinguin_unsat.
elem(main(input), container, w).
attr(main(input), order, 2).
% ## Input Atoms
% ---------------
elem(section(atoms), container, main(input)).
elem(title(atoms), label, section(atoms)).
attr(title(atoms), label, "Added atoms").
elem(content(atoms), container, section(atoms)).
elem(elem_container(atom(A)), container, content(atoms)):-_clinguin_atom(A).
elem(elem_title(atom(A)), label, elem_container(atom(A))):-_clinguin_atom(A).
attr(elem_title(atom(A)), label, A):-_clinguin_atom(A).
attr(elem_title(atom(A)), class, "font-monospace"):-_clinguin_atom(A).
attr(elem_title(atom(A)), tooltip, @format("_clinguin_atom({})",A)):-_clinguin_atom(A).
elem(elem_val(atom(A)), button, elem_container(atom(A))):-_clinguin_atom(A).
% attr(elem_val(atom(A)), label, "remove"):-_clinguin_atom(A).
attr(elem_val(atom(A)), icon, "fa-trash"):-_clinguin_atom(A).
attr(elem_val(atom(A)), class, ("text-danger")):-_clinguin_atom(A).
attr(elem_val(atom(A)), tooltip, @format("▶︎▶︎ remove_atom({})",A)):-_clinguin_atom(A).
when(elem_val(atom(A)), click, call, remove_atom(A)):-_clinguin_atom(A).
elem(footer(atoms), container, section(atoms)).
elem(footer_elem(atoms), container, footer(atoms)).
elem(footer_item(atom(name)),textfield,footer_elem(atoms)).
attr(footer_item(atom(name)),placeholder,"atom").
when(footer_item(atom(name)),input,context,(atom_name,_value)).
elem(footer_item(atom(btn)),button,footer_elem(atoms)).
attr(footer_item(atom(btn)),label,"Add atom").
attr(footer_item(atom(btn)),tooltip,"▶︎▶︎ add_atom(_)").
when(footer_item(atom(btn)),click,call, add_atom(_context_value(atom_name))).
elem(footer_elem(clear_atoms), container, footer(atoms)).
elem(footer_item(clear_atoms), button, footer(atoms)).
attr(footer_item(clear_atoms), label, "Clear").
attr(footer_item(clear_atoms), class, "btn-danger").
attr(footer_item(clear_atoms), icon, "fa-trash").
attr(footer_item(clear_atoms), tooltip, "▶︎▶︎ clear_atoms()").
when(footer_item(clear_atoms), click, call, clear_atoms).
% ## Input Assumptions
% ---------------
elem(section(assumptions), container, main(input)).
elem(title(assumptions), label, section(assumptions)).
attr(title(assumptions), label, "Assumptions").
elem(content(assumptions), container, section(assumptions)).
elem(elem_container(assumption(A)), container, content(assumptions)):-_clinguin_assume(A,V).
elem(elem_title(assumption(A)), label, elem_container(assumption(A))):-_clinguin_assume(A,V).
attr(elem_title(assumption(A)), label, A):-_clinguin_assume(A,V).
attr(elem_title(assumption(A)), class, "text-success"):-_clinguin_assume(A,true).
attr(elem_title(assumption(A)), class, "text-danger"):-_clinguin_assume(A,false).
attr(elem_title(assumption(A)), class, "font-monospace"):-_clinguin_assume(A,V).
attr(elem_title(assumption(A)), tooltip, @format("_clinguin_assume({},{})",A,V)):-_clinguin_assume(A,V).
elem(elem_val(assumption(A)), button, elem_container(assumption(A))):-_clinguin_assume(A,V).
% attr(elem_val(assumption(A)), label, "remove"):-_clinguin_assume(A,V).
attr(elem_val(assumption(A)), icon, "fa-trash"):-_clinguin_assume(A,V).
attr(elem_val(assumption(A)), class, ("text-danger")):-_clinguin_assume(A,V).
attr(elem_val(assumption(A)), tooltip, @format("▶︎▶︎ remove_assumption({})",A)):-_clinguin_assume(A,V).
when(elem_val(assumption(A)), click, call, remove_assumption(A)):-_clinguin_assume(A,V).
elem(footer(assumptions), container, section(assumptions)).
elem(footer_elem(assumptions), container, footer(assumptions)).
elem(footer_item(assumption(name)),textfield,footer_elem(assumptions)).
attr(footer_item(assumption(name)),order,3).
attr(footer_item(assumption(name)),placeholder,"atom").
when(footer_item(assumption(name)),input,context,(assumption_name,_value)).
elem(footer_item(assumption(val)),dropdown_menu,footer_elem(assumptions)).
attr(footer_item(assumption(val)),order,2).
elem(footer_item(assumption(val,true)),dropdown_menu_item,footer_item(assumption(val))).
attr(footer_item(assumption(val,true)),label,true).
attr(footer_item(assumption(val,true)),class,"text-success").
when(footer_item(assumption(val,true)),click,context,(assumption_val,true)).
when(footer_item(assumption(val,true)),click, update,(footer_item(assumption(val)),selected,true)).
when(footer_item(assumption(val,true)),click, update,(footer_item(assumption(val)),class,"text-success")).
elem(footer_item(assumption(val,false)),dropdown_menu_item,footer_item(assumption(val))).
attr(footer_item(assumption(val,false)),class,"text-danger").
attr(footer_item(assumption(val,false)),label,false).
when(footer_item(assumption(val,false)),click,context,(assumption_val,false)).
when(footer_item(assumption(val,false)),click, update,(footer_item(assumption(val)),selected,false)).
when(footer_item(assumption(val,false)),click, update,(footer_item(assumption(val)),class,"text-danger")).
elem(footer_item(assumption(btn)),button,footer_elem(assumptions)).
attr(footer_item(assumption(btn)),order,1).
attr(footer_item(assumption(btn)),label,"Add assumption").
attr(footer_item(assumption(btn)),tooltip,"▶︎▶︎ add_assumption(_,_)").
when(footer_item(assumption(btn)),click,call, add_assumption(_context_value(assumption_name,const),_context_value(assumption_val))).
elem(footer_elem(clear_assumptions), container, footer(assumptions)).
elem(footer_item(clear_assumptions), button, footer(assumptions)).
attr(footer_item(clear_assumptions), label, "Clear").
attr(footer_item(clear_assumptions), class, "btn-danger").
attr(footer_item(clear_assumptions), icon, "fa-trash").
attr(footer_item(clear_assumptions), tooltip, "▶︎▶︎ clear_assumptions()").
when(footer_item(clear_assumptions), click, call, clear_assumptions).
% ## Input Externals
% ---------------
elem(section(externals), container, main(input)).
elem(title(externals), label, section(externals)).
attr(title(externals), label, "Externals").
elem(content(externals), container, section(externals)).
elem(elem_container(external(A)), container, content(externals)):-_clinguin_external(A,V).
elem(elem_title(external(A)), label, elem_container(external(A))):-_clinguin_external(A,V).
attr(elem_title(external(A)), label, A):-_clinguin_external(A,V).
% attr(elem_title(external(A)), class, "text-success"):-_clinguin_external(A,true).
% attr(elem_title(external(A)), class, "text-danger"):-_clinguin_external(A,false).
attr(elem_title(external(A)), class, "font-monospace"):-_clinguin_external(A,V).
attr(elem_title(external(A)), tooltip, @format("_clinguin_external({},{})",A,V)):-_clinguin_external(A,V).
elem(elem_val(external(A)), dropdown_menu, elem_container(external(A))):-_clinguin_external(A,V).
attr(elem_val(external(A)), selected, V):-_clinguin_external(A,V).
attr(elem_val(external(A)), class, "text-success"):-_clinguin_external(A,true).
attr(elem_val(external(A)), class, "text-danger"):-_clinguin_external(A,false).
% attr(elem_val(external(A)), label, "remove"):-_clinguin_external(A,V).
% attr(elem_val(external(A)), icon, "fa-trash"):-_clinguin_external(A,V).
% attr(elem_val(external(A)), class, ("text-danger")):-_clinguin_external(A,V).
% attr(elem_val(external(A)), tooltip, @format("▶︎▶︎ remove_external({})",A)):-_clinguin_external(A,V).
% when(elem_val(external(A)), click, call, remove_external(A)):-_clinguin_external(A,V).
elem(elem_val(external(A),true), dropdown_menu_item, elem_val(external(A))):-_clinguin_external(A,V).
attr(elem_val(external(A),true), label, "true"):-_clinguin_external(A,V).
attr(elem_val(external(A),true), class, "text-success"):-_clinguin_external(A,V).
when(elem_val(external(A),true), click, call, set_external(A,true)):-_clinguin_external(A,V).
elem(elem_val(external(A),false), dropdown_menu_item, elem_val(external(A))):-_clinguin_external(A,V).
attr(elem_val(external(A),false), label, "false"):-_clinguin_external(A,V).
attr(elem_val(external(A),false), class, "text-danger"):-_clinguin_external(A,V).
when(elem_val(external(A),false), click, call, set_external(A,false)):-_clinguin_external(A,V).
elem(elem_val(external(A),release), dropdown_menu_item, elem_val(external(A))):-_clinguin_external(A,V).
attr(elem_val(external(A),release), label, "release"):-_clinguin_external(A,V).
when(elem_val(external(A),release), click, call, set_external(A,release)):-_clinguin_external(A,V).
elem(main(model), container, w).
attr(main(model), order, 3).
% ## Model
% ---------------
elem(section(model), container, main(model)).
attr(section(model), order, 1):-_clinguin_browsing.
attr(section(model), class, "bg-primary"):-_clinguin_browsing.
elem(title(model), label, section(model)).
attr(title(model), label, "Current model").
elem(content(model), container, section(model)).
elem(elem_container(model(A)), container, content(model)):-_clinguin_model(A).
elem(elem_title(model(A)), label, elem_container(model(A))):-_clinguin_model(A).
% attr(elem_title(model(A)), label, A):-_clinguin_model(A).
attr(elem_title(model(A)), label, A):-_clinguin_model(A).
attr(elem_title(model(A)), class, "font-monospace"):-_clinguin_model(A).
attr(elem_title(model(A)), tooltip, A):-_clinguin_model(A).
attr(elem_title(model(A)), class, "opacity-25"):- _all(A), _clinguin_model(A).
attr(elem_title(model(A)), class, "text-primary"):- _clinguin_model(A), _clinguin_browsing.
elem(footer(model), container, section(model)).
elem(footer_elem(select), container, footer(model)).
attr(footer_elem(select), order, 2).
elem(footer_item(select(select_show)),textfield,footer_elem(select)).
attr(footer_item(select(select_show)),order,1).
attr(footer_item(select(select_show)),width,"315pt").
attr(footer_item(select(select_show)),placeholder,"Optional #show").
when(footer_item(select(select_show)),input,context,(select_show,_value)).
elem(footer_item(select(btn)),button,footer_elem(select)).
attr(footer_item(select(btn)),order,2).
attr(footer_item(select(btn)),label,"Select solution").
attr(footer_item(select(btn)),icon,"fa-hand-pointer").
attr(footer_item(select(btn)),class,"btn-success").
attr(footer_item(select(btn)),tooltip,"▶︎▶︎ select").
when(footer_item(select(btn)),click,call, select(_context_value(select_show,str," "))).
elem(footer_elem(download), container, footer(model)).
attr(footer_elem(download), order, 3).
elem(footer_item(download(download_show)),textfield,footer_elem(download)).
attr(footer_item(download(download_show)),order,2).
attr(footer_item(download(download_show)),placeholder,"Optional #show").
when(footer_item(download(download_show)),input,context,(download_show,_value)).
elem(footer_item(download(download_name)),textfield,footer_elem(download)).
attr(footer_item(download(download_name)),order,1).
attr(footer_item(download(download_name)),placeholder,"File name").
when(footer_item(download(download_name)),input,context,(download_name,_value)).
elem(footer_item(download(btn)),button,footer_elem(download)).
attr(footer_item(download(btn)),order,3).
attr(footer_item(download(btn)),label,"Download solution").
attr(footer_item(download(btn)),icon,"fa-download").
attr(footer_item(download(btn)),class,"btn-success").
attr(footer_item(download(btn)),tooltip,"▶︎▶︎ download").
when(footer_item(download(btn)),click,call, download(_context_value(download_show,str," "),_context_value(download_name,str,"file.lp"))).
elem(footer_elem(browse), container, footer(model)).
attr(footer_elem(browse), order, 1).
elem(footer_item(next_solution), button, footer_elem(browse)).
attr(footer_item(next_solution), order, 3).
attr(footer_item(next_solution), label, "Next").
attr(footer_item(next_solution), icon, "fa-forward-step").
attr(footer_item(next_solution), tooltip, "▶︎▶︎ next_solution()").
when(footer_item(next_solution), click, call, next_solution).
elem(footer_item(next_solution_opt), button, footer_elem(browse)).
attr(footer_item(next_solution_opt), order, 2).
attr(footer_item(next_solution_opt), label, "Next Optimizing").
attr(footer_item(next_solution_opt), icon, "fa-forward-fast").
attr(footer_item(next_solution_opt), tooltip, "▶︎▶︎ next_solution(optN)").
when(footer_item(next_solution_opt), click, call, next_solution(optN)).
elem(footer_item(stop), button, footer_elem(browse)).
attr(footer_item(stop), order, 1).
attr(footer_item(stop), label, "Stop Browsing").
attr(footer_item(stop), class, "btn-danger").
attr(footer_item(stop), class, "disabled"):-not _clinguin_browsing.
attr(footer_item(stop), icon, "fa-stop").
attr(footer_item(stop), tooltip, "▶︎▶︎ stop_browsing"):-_clinguin_browsing.
attr(footer_item(stop), tooltip, "not _clinguin_browsing"):-not _clinguin_browsing.
when(footer_item(stop), click, call, stop_browsing).
elem(section(brave), container, main(model)).
attr(section(brave), order, 2).
elem(title(brave), label, section(brave)).
attr(title(brave), label, "In Some Model (Brave)").
elem(content(brave), container, section(brave)).
elem(elem_container(brave(A)), container, content(brave)):-_any(A).
elem(elem_title(brave(A)), label, elem_container(brave(A))):-_any(A).
% attr(elem_title(brave(A)), label, A):-_any(A).
attr(elem_title(brave(A)), label, A):-_any(A).
attr(elem_title(brave(A)), class, "font-monospace"):-_any(A).
attr(elem_title(brave(A)), class, "opacity-25"):-_any(A), _all(A).
attr(elem_title(brave(A)), tooltip, @format("_any({})",A)):-_any(A).
attr(elem_title(brave(A)), class, "text-primary"):-_any_opt(A).
attr(elem_title(brave(A)), class, "fw-bold"):-_all_opt(A).
elem(elem_val(brave(A)), dropdown_menu, elem_container(brave(A))):-_any(A).
attr(elem_val(brave(A)), icon, "fa-plus"):-_any(A).
attr(elem_val(brave(A)), tooltip, @format("▶︎▶︎ add_assumption({},_)",A)):-_any(A).
elem(elem_val_true(brave(A)), dropdown_menu_item, elem_val(brave(A))):-_any(A).
attr(elem_val_true(brave(A)), label, true):-_any(A).
attr(elem_val_true(brave(A)), class, "text-success"):-_any(A).
when(elem_val_true(brave(A)), click, call, add_assumption(A,true)):-_any(A).
elem(elem_val_false(brave(A)), dropdown_menu_item, elem_val(brave(A))):-_any(A).
attr(elem_val_false(brave(A)), label, false):-_any(A).
attr(elem_val_false(brave(A)), class, "text-danger"):-_any(A).
when(elem_val_false(brave(A)), click, call, add_assumption(A,false)):-_any(A).
% elem(elem_val(brave(A)), button, elem_container(brave(A))):-_any(A), not _all(A).
% attr(elem_val(brave(A)), icon, "fa-plus"):-_any(A), not _all(A).
% attr(elem_val(brave(A)), class, ("text-primary")):-_any(A), not _all(A).
% attr(elem_val(brave(A)), tooltip, @format("▶︎▶︎ add_assumption({},true)",A)):-_any(A), not _all(A).
% when(elem_val(brave(A)), click, call, add_assumption(A,true)):-_any(A), not _all(A).
elem(section(cautious), container, main(model)).
attr(section(cautious), order, 3).
elem(title(cautious), label, section(cautious)).
attr(title(cautious), label, "In All Models (Cautious)").
elem(content(cautious), container, section(cautious)).
elem(elem_container(cautious(A)), container, content(cautious)):-_all(A).
elem(elem_title(cautious(A)), label, elem_container(cautious(A))):-_all(A).
% attr(elem_title(cautious(A)), label, A):-_all(A).
attr(elem_title(cautious(A)), label, A):-_all(A).
attr(elem_title(cautious(A)), class, "font-monospace"):-_all(A).
attr(elem_title(cautious(A)), tooltip, @format("_all({})",A)):-_all(A).
% # Menu bar
% -----------
elem(menu_bar, menu_bar, w).
attr(menu_bar, title, "Clinguin").
attr(menu_bar, icon, "fa-desktop").
elem(menu_bar_restart, button, menu_bar).
attr(menu_bar_restart, label, "Restart").
attr(menu_bar_restart, icon, "fa-arrows-rotate").
attr(menu_bar_restart, class, "btn-outline-danger").
attr(menu_bar_restart, class, "border-0").
when(menu_bar_restart, click, call, restart).