La squadra di Derek McInnes era andata sotto nel primo tempo a Tynecastle per una conclusione deviata di Dujon Sterling.
Ma gli Hearts hanno reagito nell’intervallo: Stephen Kingsley ha trovato il pareggio e poi il gol decisivo di Shankland ha scatenato la festa sugli spalti.
I Jambos, reduci da tre vittorie consecutive, ora sono a +3 sul secondo posto occupato dal Celtic e vantano una migliore differenza reti.
Il vantaggio sugli stessi Rangers, terzi, è salito a sette punti quando mancano solo tre partite alla fine di una corsa al titolo avvincente.
"Il modo in cui i ragazzi hanno tirato fuori questa vittoria è stato magnifico," ha dichiarato McInnes. "Abbiamo cambiato approccio, cambiato mentalità, c’era tutto da fare."
"Avevamo bisogno di un grande secondo tempo e, per fortuna, ci siamo organizzati abbastanza da ritrovare fiducia nella partita."
Gli Hearts sognano di diventare il primo club, dopo Celtic e Rangers, a vincere il titolo scozzese dai tempi dell’Aberdeen nel 1985.
Affronteranno il Celtic nell’ultima giornata in una possibile sfida decisiva per il titolo, ma potrebbero chiudere i giochi anche prima.

"Abbiamo chiesto ai giocatori di prendersi più responsabilità," ha aggiunto McInnes.
"Dovevamo iniziare a dimostrare di essere la squadra in testa al campionato, perché all’inizio eravamo lontani da quel livello."
L’allenatore dei Rangers Danny Rohl ha commentato: "Per vincere una partita così, non basta giocare 45 minuti ad alto livello, bisogna farlo per tutti i 90 minuti."
"Se siamo onesti, nelle ultime tre partite non abbiamo sempre fatto abbastanza per ottenere tre vittorie."
Venerdì McInnes aveva espresso il desiderio di vedere Tynecastle "in tutto il suo splendore" per una delle partite più importanti della storia del club.
Il suo desiderio si è avverato: la squadra è entrata in campo accolta da una marea granata e bianca e da un boato assordante.
I Rangers hanno sprecato una grande occasione al 19’, quando Tochi Chukwuani ha colpito di testa da solo su calcio d’angolo di James Tavernier, ma la palla è finita alta.
La squadra di Rohl ha gelato il pubblico di casa al 23’: la rimessa lunga di Tavernier è stata respinta solo fino a Sterling, che ha calciato al volo da otto metri trovando la deviazione di Michael Steinwender per il vantaggio.
McInnes ha risposto inserendo Blair Spittal a inizio ripresa e la mossa ha dato la scossa agli Hearts.
Shankland ha visto un tiro potente respinto da Emmanuel Fernandes, poi Claudio Braga ha costretto Jack Butland al suo primo intervento.
Il pareggio è arrivato al 54’: Alexandros Kyziridis si è accentrato da destra e ha calciato a giro sul secondo palo, colpendo il legno; Kingsley, ben appostato, ha insaccato il tap-in appena fuori dall’area piccola.
Il gol decisivo degli Hearts è arrivato al 71’: Spittal ha lanciato Kingsley sulla sinistra, il cui cross basso è stato deviato da Tavernier.
La palla è finita sui piedi di Shankland, che ha battuto Butland con un rasoterra preciso, facendo esplodere Tynecastle.
