Faits : A. A._ SA (ci-après: A._) a lancé une promotion immobilière à X._, portant sur la construction de dix villas jumelles. Sur le site internet de la société, il était mentionné que chaque villa présentait une surface de 219 m 2 sur deux niveaux avec mezzanine, soit notamment un salon/salle à manger de 50 m 2, une cuisine de 15 m 2et quatre chambres dont la principale mesurait 19 m 2; s'y ajoutait un sous-sol de 90 m 2. Chargé de la commercialisation du projet, C._ SA a fait paraître en 2007 des annonces publicitaires indiquant une superficie par villa de 219 m 2 sur deux niveaux avec mezzanine. Le 1 er mai 2007, A.B._ et B.B._ ont acquis la parcelle n° 751 de la commune de X._ pour le prix de 414'800 fr. Le même jour, ils ont conclu avec A._ un contrat d'entreprise portant sur "la réalisation d'une maison mitoyenne, sous-sol, rez-de-chaussée, 1 er étage, mezzanine, d'une superficie d'environ 219.70 m 2 + sous-sol d'environ 90.25 m 2 ", pour un prix forfaitaire de 835'200 fr. La villa devait être livrée au plus tard le 31 juillet 2008; une indemnité de 100 fr. par jour de retard était due, sauf en cas de force majeure, tel le mauvais temps. La norme SIA 118 (éd. 1977/1991) est intégrée au contrat. Selon les plans de masse (ou plans de vente) annexés au contrat et signés par les époux B._, la villa comporte un sous-sol de 90,3 m 2, un rez-de-chaussée de 88,8 m 2 (avec notamment une cuisine de 15 m 2, un séjour de 42,4 m 2et une salle à manger de 8,9 m 2 ), un premier étage de 90,3 m 2 (avec quatre chambres, soit: chambre n° 1 de 19,3 m 2, chambre n° 2 de 16 m 2 + mezzanine, chambre n° 3 de 12,4 m 2et chambre n° 4 de 16,5 m 2 + mezzanine) et une mezzanine de 40 m 2. Ces surfaces sont brutes, c'est-à-dire qu'elles comprennent les murs intérieurs et extérieurs de la villa; les plans ne le précisent pas. Les époux B._ ont signé un descriptif de construction, annexé au contrat. En page 7, ce document comporte le "détail des équipements", dont du carrelage notamment pour la "cuisine section 30 x 60 cm (12,5 m 2 ) " et du parquet pour les "chambre 1 selon plan (16.80 m 2 ), chambre 2 selon plan (33.00 m 2 ), chambre 3 selon plan (9 m 2 ) et chambre 4 selon plan (33.00 m 2 ) "; dans les chambres 2 et 4, la surface des mezzanines est comprise. Le contrat renvoie également aux plans d'autorisation de construire destinés à la commune, lesquels n'ont toutefois pas été remis aux maîtres de l'ouvrage, mais seulement tenus à leur disposition. Ces plans indiquent la surface nette de chaque pièce, c'est-à-dire la superficie à l'intérieur des murs de la pièce. Les plans d'exécution ont été soumis le 26 septembre 2007 aux époux B._, qui les ont signés; ils mentionnent les mêmes surfaces que celles figurant dans les plans de masse, soit des surfaces brutes. En juin 2008, A._ a informé les maîtres de l'ouvrage que la livraison de la villa était reportée au 30 septembre 2008 en raison des intempéries. Les époux B._ en ont pris note, en précisant que toute livraison postérieure à cette date devrait être indemnisée conformément au contrat. L'ouvrage a été livré finalement le 6 octobre 2008. A ce moment-là, le solde dû par les époux B._ était de 53'979 fr.02. Les maîtres de l'ouvrage ont alors opposé en compensation un montant de 25'000 fr. et réservé leurs droits. En décembre 2008, A._ a obtenu l'inscription provisoire d'une hypothèque légale des artisans et entrepreneurs sur la parcelle propriété des maîtres de l'ouvrage. Le 24 février 2009, les époux B._ ont informé A._ qu'ils avaient constaté que la surface de leur logement était de 179 m 2, soit inférieure de 40 m 2 à la superficie de 219 m 2 indiquée dans les plans; ils faisaient valoir à ce titre un défaut entraînant une moins-value pour laquelle ils demandaient réparation. Deux jours plus tard, A._ a fait notifier aux maîtres de l'ouvrage des commandements de payer pour le montant total de 53'979 fr.02. A.B._ et B.B._ ont formé opposition. B. Par acte expédié le 31 mars 2009, A._ a assigné les époux B._ en paiement de la somme de 53'979 fr.02, plus intérêts. Par ailleurs, elle concluait notamment à la mainlevée définitive des oppositions et à l'inscription définitive d'une hypothèque légale des artisans et entrepreneurs à due concurrence. A.B._ et B.B._ ont conclu au déboutement de A._ et, reconventionnellement, à la condamnation de l'entrepreneur à leur payer solidairement la somme de 410'895 fr.90, plus intérêts. Ce montant comportait une moins-value de 152'548 fr. liée à la différence de surface. A._ a reconnu devoir aux époux B._ un montant total de 18'656 fr.50 pour des travaux de réfection de peinture et la pose d'une barrière d'escalier par un tiers. Au surplus, elle niait un défaut résultant d'une différence de surface et, en tout état de cause, contestait toute moins-value liée à ce prétendu défaut. Le Tribunal de première instance du canton de Genève a ordonné une expertise judiciaire. Selon le rapport établi le 20 décembre 2012 par D._, la surface totale de la villa sans les murs extérieurs est de 275,67 m 2, dont 8,77 m 2 de murs intérieurs, isolations et gaines. Par jugement du 27 juin 2013, le tribunal a notamment condamné A._ à payer aux époux B._, pris conjointement et solidairement, le montant de 117'827 fr.48. Il a jugé la demande reconventionnelle fondée à concurrence de 171'806 fr.50 - dont 152'548 fr. à titre de moins-value résultant de la différence de surface - et a déduit du montant dû par l'entrepreneur le solde du prix des travaux par 53'979 fr.02. Statuant le 28 février 2014 sur appel de A._, la Chambre civile de la Cour de justice du canton de Genève a réformé le jugement de première instance en ce sens que A._ est condamnée à payer aux époux B._ le montant de 80'681 fr.25. Comme le premier juge, elle a admis un défaut lié à une différence entre la surface de l'ouvrage livré et la surface promise; elle est toutefois parvenue à une moins-value moins importante, soit 116'003 fr.75. C. A._ interjette un recours en matière civile. Elle demande l'annulation de l'arrêt cantonal et reprend les conclusions prises précédemment. Elle réclame notamment le paiement par les époux B._ de la somme de 53'979 fr.02, tout en reconnaissant leur devoir le montant de 18'656 fr.50. A.B._ et B.B._ proposent le rejet du recours. A._ s'est déterminée sur la réponse des intimés. Pour sa part, la cour cantonale se réfère aux considérants de son arrêt. Par ordonnance du 26 mai 2014, la Présidente de la cour de céans a rejeté la demande d'effet suspensif présentée par la recourante.