Faits : A. A partir du 1 er mai 2000, A._ a travaillé comme employé de commerce à l'agence de R._ de la Banque X._ (ci-après: X._). Depuis septembre 2006, son statut était celui de conseiller à la clientèle dans les agences de S._. Lors de l'entretien de développement et de qualification annuel du 15 novembre 2010, la responsable d'agence s'est déclarée déçue du comportement de A._, qui avait pris certaines libertés; elle a exigé un changement d'attitude immédiat de la part de l'employé, qui devait s'abstenir à l'avenir de tenir de longues et fréquentes conversations téléphoniques privées, d'envoyer des sms et d'introduire régulièrement des tiers à l'intérieur des locaux normalement inaccessibles aux personnes extérieures à la banque. Le 25 avril 2012, en fin de journée, l'ex-amie de l'employé s'est rendue à l'agence de T._. Très énervée, elle a discuté environ une demi-heure avec A._, qui se trouvait alors derrière le guichet et a continué à exécuter son travail. Elle a ensuite pénétré dans les locaux internes de l'agence dans des circonstances qui seront examinées dans la partie en droit. Le déroulement des faits résulte en particulier des images enregistrées par le système de vidéosurveillance de la banque. Par lettre remise en mains propres le 27 avril 2012 à l'issue d'un entretien, A._ a été licencié avec effet immédiat; X._ invoquait une rupture irrévocable des rapports de confiance, provoquée par un manque total de diligence de l'employé dans l'exercice de ses fonctions. A._ a demandé une motivation écrite du congé, conformément à l'art. 335 al. 2 CO. Dans la réponse du 20 juin 2012, le conseil de la banque a indiqué que l'employé avait été licencié en raison de son comportement consistant à faire pénétrer son ex-amie dans les locaux internes de l'agence, en violation crasse des directives et malgré l'avertissement qui lui avait été signifié. B. Par demande du 22 mars 2013, A._ a ouvert action contre X._, concluant au paiement des montants de 27'481 fr.15 à titre de salaire et de 27'157 fr. à titre d'indemnité pour licenciement immédiat injustifié, le tout avec intérêts à 5% l'an dès le 27 avril 2012. Le 9 avril 2013, B._ Caisse de chômage a déposé une demande simplifiée, tendant à la condamnation de X._ à lui verser le montant de 7'384 fr.25, qui représentait les indemnités de chômage versées à A._ de juillet à octobre 2012. Les deux causes ont été jointes. Par jugement du 19 juin 2015, le Tribunal civil du Littoral et du Val-de-Travers a condamné X._ à verser à A._ la somme brute de 18'709 fr.90, sous déduction des charges légales et conventionnelles, et la somme nette de 19'847 fr.75, le tout avec intérêts à 5% dès le 27 avril 2012; B._ Caisse de chômage a vu sa prétention envers X._ entièrement admise. Statuant le 5 février 2016 sur appel de X._, la Cour d'appel civile du Tribunal cantonal du canton de Neuchâtel a admis très partiellement le recours; elle a réformé le jugement de première instance en ce sens que la somme brute due à titre de salaire était arrêtée à 15'401 fr.90 et l'a confirmé pour le surplus. C. X._ interjette un recours en matière civile. Elle conclut au rejet des demandes en paiement de A._ et de B._ Caisse de chômage. A._ propose le rejet du recours. B._ Caisse de chômage n'a pas d'observations à formuler. Pour sa part, la cour cantonale se réfère à son arrêt.