Faits : A. A.a. Par contrat de travail daté du 28 janvier 2008 et prenant effet le 1 er août 2008, la société B._ SA a engagé A._, née en 1957, en qualité de gestionnaire senior à 100%, avec le titre de directrice adjointe. Selon l'article 4 paragraphe 1 du contrat, son salaire annuel brut était fixé à 300'000 fr., payable en treize fois. L'article 4 paragraphe 3 avait la teneur suivante: « En cas de résiliation ordinaire du contrat de travail prononcée par la Société, Madame A._ percevra une indemnité équivalente à deux ans de salaire fixe selon le paragraphe 1 de l'article 4, sous réserve de l'article 337 du Code des Obligations ou en cas de résiliation du contrat de travail pour cause de départ à la retraite. » Le contrat était résiliable pour la fin d'un mois, moyennant un préavis écrit de trois mois. Les parties ont en outre convenu d'une rémunération variable dans divers avenants. A.b. Lors d'un entretien du 9 octobre 2013, deux représentants de l'employeuse (dont X._, directeur de la gestion privée) ont proposé à l'employée de modifier son contrat de travail par une réduction de son taux d'occupation à 80% et de son salaire correspondant, au motif que ce dernier était trop élevé par rapport à la taille de son portefeuille. Entendu comme témoin, X._ a expliqué qu'il avait décidé avec un associé de la banque de réduire le taux d'activité de A._ et d'autres collaborateurs, plutôt que de les licencier. Le 22 octobre 2013, dans le cadre d'un nouvel entretien réunissant l'employée, X._ et Y._, directeur des ressources humaines, la mesure a été confirmée par écrit sous la forme d'un avenant au contrat de travail qui instituait une telle réduction dès le 1er février 2014. Un délai de réflexion de deux semaines a été accordé à l'employée. Lors d'un troisième entretien le 5 novembre 2013, l'employée a demandé un délai de réflexion supplémentaire, qui lui a été accordé jusqu'à la fin du mois. Le 20 novembre 2013, l'employée a adressé à X._ et Y._ un courriel indiquant qu'après avoir examiné tous les aspects liés à leur proposition de réduire son taux d'activité à 80%, elle était disposée à l'envisager, mais pas dans l'immédiat. Elle exposait ses préoccupations liées au changement de taux d'activité, sans aborder la question du maintien de l'indemnité de licenciement à 600'000 fr. Elle proposait de rediscuter ladite réduction dans un délai de six mois à un an, « à moins de trouver ensemble des solutions plus adaptées au contexte actuel». A.c. Le 22 novembre 2013, les parties ont signé un avenant au contrat de travail fixant le taux d'activité de l'employée à 80% dès le 1er février 2014 et le salaire annuel brut à 240'000 fr. Le droit aux vacances et l'article 3 du contrat de travail étaient modifiés. Les autres termes du contrat demeuraient applicables pour le surplus, «sous réserve du courrier du 21 décembre 2011 traitant de la rémunération variable». A.d. Le 25 novembre 2015, l'employeuse a adressé aux salariés un courriel les informant que dans le cadre du rachat d'une participation majoritaire dans le capital de C._ SA, elle avait conclu un plan social avec la délégation du personnel. L'art. II chiffre 1 du plan social prévoyait une indemnité de départ de 0,5 mois de salaire par année de service complète, le montant maximum de l'indemnité étant fixé à six mois de salaire et le montant minimum à deux mois. Le salaire pris en compte était le salaire mensuel de base. Le chiffre 3 du même article énonçait ce qui suit: «Les indemnités stipulées aux ch. 1 et 2 du présent article sont payables à réception par C._ SA ou B._ SA de la confirmation écrite de l'Employé qu'il n'a aucune prétention à faire valoir, à quelque titre que ce soit, contre C._ SA ou B._ SA. Ladite confirmation doit être formulée par l'Employé au plus tôt après l'écoulement d'un délai de trente jours après la fin des rapports de travail». A.e. Par courrier remis en main propre le 26 novembre 2015, l'employeuse a résilié le contrat de travail de l'employée pour le 29 février 2016, en raison des motifs économiques évoqués. L'employée était libérée de l'obligation de travailler avec effet immédiat. Il était précisé qu'en conformité avec son contrat de travail du 28 janvier 2008, l'employée recevrait en février 2016 une indemnité de 480'000 fr., correspondant à deux ans de salaire (chiffre 5). De plus, l'employeuse était disposée à lui verser, à bien plaire, une indemnité de départ de 150'000 fr. (chiffre 6) ainsi qu'une indemnité de 12'000 fr., à disposition pour des mesures d'accompagnement (chiffre 7). L'indemnité mentionnée au point 6 serait versée à la fin du mois d'avril 2016, à condition que le contrat ait effectivement pris fin le 29 février 2016 et que l'employée ait signé, au plus tard le 8 février 2016, une quittance pour solde de tout compte et de toute prétention envers la banque, document que l'employeuse lui ferait parvenir en temps utile (chiffre 8). A.f. Par courrier du 11 décembre 2015 rédigé par son conseil, l'employée a indiqué que dans la mesure où le contrat de travail initial prévoyait un salaire annuel de 300'000 fr. et où le taux d'activité avait été réduit à la demande de l'employeuse, le calcul de l'indemnité contractuelle devait à tout le moins être effectué sur la base de son salaire moyen pendant la durée du contrat, ce qui lui donnait droit à 568'000 fr.; la réduction de son taux d'activité équivalait selon elle à une résiliation partielle de son contrat de travail. Quant au paiement de l'indemnité de licenciement de 150'000 fr., il ne pouvait pas être différé à fin avril 2016, les rapports de travail prenant fin le 29 février 2016. Pour le surplus, les autres conditions étaient acceptées, «étant précisé que la quittance pour solde de tous comptes devra[it] naturellement intervenir de façon réciproque entre les parties». Par lettre du 15 janvier 2016, l'employeuse a exprimé son refus d'entrer en matière sur le calcul de l'indemnité contractuelle, tout en acceptant de payer la totalité des prestations contractuelles au 29 février 2016, y compris l'indemnité de licenciement de 150'000 fr., sous réserve de la signature d'une quittance pour solde de tout compte et de toute prétention envers elle. Dans une nouvelle missive du 10 février 2016, l'employée a expliqué que l'article 4 du contrat de travail n'avait subi aucune modification formelle, de sorte qu'elle pouvait prétendre à une indemnité fondée sur le salaire annuel initial de 300'000 fr. Elle avait accepté de limiter sa prétention en retenant un salaire au prorata de la durée de son emploi, mais ne pouvait pas accepter le calcul de l'employeuse basé uniquement sur le salaire réduit. Elle répétait que la quittance devrait valoir tant envers la banque qu'envers elle-même. B. B.a. L'employée a assigné l'employeuse par requête de conciliation du 4 mai 2016, puis a déposé une demande le 15 septembre 2016 devant le Tribunal des prud'hommes du canton de Genève. Elle concluait au paiement de 750'000 fr., soit 600'000 fr. à titre d'indemnité de licenciement fondée sur l'art. 4 du contrat de travail et 150'000 fr. à titre d'indemnité de départ basée sur le plan social. B.b. Par jugement du 8 juin 2017, le Tribunal des prud'hommes a condamné l'employeuse à payer à l'employée la somme nette de 480'000 fr., intérêts moratoires en sus. Interprétant l'article 4 du contrat de travail selon le principe de la confiance, le Tribunal a considéré que l'indemnité de licenciement contractuelle devait être calculée en fonction du salaire annuel fixe, soit le dernier salaire payé (240'000 fr.), par opposition au salaire initial (300'000 fr.). L'indemnité due était dès lors de 480'000 fr., et non de 600'000 fr. Quant à l'indemnité de départ, discrétionnaire, elle était notamment soumise à la condition que l'employée signe une quittance pour solde de tout compte avant le 8 février 2016, document que l'employeuse devait faire parvenir à l'employée. Comme son calcul de l'indemnité contractuelle avait été contesté à deux reprises, l'employeuse pouvait de bonne foi comprendre que l'employée ne renonçait pas à toute prétention à son égard. L'employée n'ayant pas rempli la condition posée au paiement de l'indemnité de départ, elle ne pouvait pas y prétendre. S'agissant enfin des frais de la procédure, le Tribunal a estimé que l'employeuse défenderesse n'avait pas fait preuve de témérité au sens de l'art. 115 CPC en s'opposant aux conclusions de la demanderesse, quand bien même elle aurait déjà pu verser le montant qu'elle reconnaissait devoir; elle n'avait pas non plus fait usage de manoeuvres dilatoires ni cherché à nuire à l'autre partie. Par conséquent, les frais judiciaires devaient être répartis entre les parties selon le sort des prétentions, la demanderesse en supportant 35% et la défenderesse 65%. B.c. Par arrêt du 21 décembre 2017, la Cour de justice du canton de Genève a rejeté l'appel formé par l'employée et a mis à sa charge les frais judiciaires, en précisant que le droit cantonal s'opposait à l'octroi de dépens (art. 22 al. 2 de la loi genevoise d'application du code civil [...]; [LaCC/GE; RSG E1 05]). C. L'employée a interjeté un recours en matière civile au Tribunal fédéral. Elle conclut, avec suite de frais et dépens des instances cantonales et fédérale, à ce que l'employeuse soit condamnée à lui verser 120'000 fr. supplémentaires à titre d'indemnité contractuelle de licenciement et 150'000 fr. au titre du plan social. L'autorité précédente s'est référée à son arrêt. L'employeuse a conclu au rejet du recours dans la mesure de sa recevabilité. L'employée a répliqué, suscitant une duplique de la partie adverse.