Faits : A. B._ SA, dont le siège est à..., a notamment pour but l'exploitation de cafés, restaurants et établissements analogues. Sous l'enseigne U._, elle exploitait trois établissements de restauration rapide à Genève, dont un à la rue xxx et un autre au boulevard zzz, ainsi qu'un établissement à Fribourg. YD._ est l'administratrice de B._ SA, ainsi que de la société U._ SA, dont le siège est à.... B._ SA a conclu avec A._ SA (ci-après: A._) un contrat d'assurance, police n°... du 13 septembre 2013. Aux termes de ce contrat, les valeurs pécuniaires des restaurants sis rue xxx et boulevard zzz étaient assurées contre le vol avec effraction et le détroussement pour un montant maximal de 5'000 fr. En outre, B._ SA a contracté avec A._ une assurance complémentaire pour le restaurant sis rue xxx, laquelle portait sur les valeurs pécuniaires se trouvant dans les coffres-forts de l'établissement à hauteur de 100'000 fr. pour chaque coffre-fort. Dans la nuit du 30 au 31 janvier 2014, les locaux du restaurant U._ à la rue xxx ont été cambriolés. Il ressort des images enregistrées par les caméras de sécurité que les voleurs se sont introduits dans le restaurant à 2 h 15, qu'ils se sont rendus dans la pièce contenant les coffres-forts, qu'ils en sont repartis avant de revenir à 4 h 00 avec du matériel pour meuler le coffre et de quitter les lieux vers 4 h 45. Les voleurs ont notamment détruit un coffre-fort d'environ 600 kg et des serrures, endommagé deux caméras de vidéo-surveillance et provoqué divers dommages aux locaux; ils ont laissé dans le coffre de la monnaie pour un montant total de 12'576 fr.55. B._ SA a déclaré le vol à A._, qui a dépêché sur place F._, inspecteur de sinistre. Lors de la séance tenue le 4 février 2014, ZD._, représentant B._ SA, a indiqué avoir changé, la semaine précédant le vol, un montant de 28'000 fr. de billets en monnaie auprès de l'agence de la BNS de Fribourg et avoir retiré 11'000 fr. en rouleaux, 4'000 fr. en billets et 12'500 fr. en billets du bureau de B._ SA de... pour les déposer dans le coffre-fort de Genève. Après avoir annoncé le vol à la police le 31 janvier 2014, ZD._ a déposé plainte pénale contre inconnu le 12 mars 2014, alléguant la disparition de 90'000 fr. en argent liquide et des dégâts pour 25'000 fr. Dans un courrier à l'assureur du 19 mars 2014, B._ SA a notamment décrit le contenu du coffre lors du cambriolage de la manière suivante: " 1) 6 fonds de caisse à 1'315.00 7'890.00 2) Contenu réserve billet et rouleau selon compte 73'020.40 3) Monnaie laissé (sic) par les voleurs 12'576.55 4) Bourse de notre acheteur, laissée dans une enveloppe au coffre 10'000.00 5) Recettes du 26, 27, 28 et 29 janvier 2014 cash 16'771.85 " B._ SA a fait parvenir à A._ différents documents pour établir le dommage, dont un extrait de compte 110025 mentionnant le contenu du coffre M2. Au titre du préjudice subi, elle a fait valoir les montants indiqués sous les points 1), 2), 4) et 5) décrits ci-dessus, ainsi qu'un montant de 265.06 euros s'ajoutant aux recettes en espèces; elle réclamait en outre 568 fr.20 pour les dégâts causés au système de surveillance du restaurant, 1'200 fr. pour la destruction d'un meuble de bureau et 1'110 fr. pour les travaux de réparation effectués à la suite des dégâts provoqués par les cambrioleurs. A._ a mis en oeuvre un expert privé, qui a rendu un rapport intermédiaire le 18 juin 2014 et un rapport final le 20 août 2014. Le premier document contient le passage suivant: " Le rapport entre les encaissements en espèces et les encaissements par cartes laisse la possibilité de dégager les liquidités. Dans notre cas, environ 50'000.00. (...) Les recettes en espèces doivent être considérées comme portables. Les 16'771.85 TTC pour 4 jours correspondent à une moyenne de 4'192.96 TTC. Pour la période du 01.01.2013 au 30.04.2014 (16 mois) nous arrivons à une moyenne journalière de 4'583.75 HT. (...) 3. Conclusion : Je ne mets pas en doute la bonne foi de Monsieur D._. Homme d'affaires il doit savoir que dans le monde de l'argent tout se fait contre preuve, contre garantie et par écrit. Même si sur les images on voit des voleurs qui mettent des billets dans des récipients, il va être difficile d'en déterminer la somme. Monsieur D._ doit être plus précis. " Dans son rapport final, l'expert n'admet finalement aucun dommage, "dans le doute et sans preuve". Dans un courrier du 22 août 2014, l'assureur a reproché à B._ SA de ne pas avoir été en mesure de prouver le préjudice subi à la suite du cambriolage; il offrait toutefois une indemnité globale de 37'500 fr., portée ultérieurement à 49'202 fr.70. En octobre 2014, B._ SA a refusé l'offre de A._ et formulé une contre-offre à 85'000 fr.; l'assureur a déclaré ensuite qu'il retirait son offre et ne fournirait aucune prestation. B. Après l'échec de la tentative de conciliation, B._ SA a déposé une demande datée du 5 février 2016, concluant à ce que A._ soit condamnée à lui verser un montant de 97'983 fr.90 avec intérêts à 5% dès le 19 mars 2014 et un montant de 290 fr.92 (équivalant à 265.06 euros) avec intérêts à 5% dès le 8 septembre 2014. Par jugement du 12 décembre 2016, le Tribunal d'arrondissement de La Côte a condamné A._ à verser à B._ SA la somme de 40'153 fr.50 avec intérêts à 5% l'an dès le 19 mars 2014. Il a admis que les montants suivants se trouvaient dans le coffre-fort la nuit du vol: - 7'890 fr. au titre de fonds de caisse; - 27'500 fr. au titre de «réserve de rouleaux»; - 16'771 fr.85 au titre des recettes en espèces. En ce qui concerne les frais de réparation, le tribunal a tenu compte uniquement des frais de remplacement de la caméra dans le local du coffre dévalisé par 478 fr.80 et 89 fr.40. Statuant le 18 mai 2018 sur appel de B._ SA et appel joint de A._, la Cour d'appel civile du Tribunal cantonal du canton de Vaud a confirmé le jugement de première instance. C. A._ interjette un recours en matière civile, concluant principalement au déboutement de B._ SA de toutes ses conclusions. Par ordonnance présidentielle, l'effet suspensif requis par la recourante a été conféré au recours. B._ SA conclut au rejet du recours dans la mesure de sa recevabilité. La Cour d'appel civile se réfère aux considérants de sa décision.