Citation: 4A_227/2014 E. 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.