JSFiddle - React, Tailwind, and code Playground

HTML

<body ng-app="myApp">
    
    <div ng-controller="MainController">
        <p>{{ object.property }}</p>
        
        <radio-set radio-value="object.property">
            <radio-set-button button-value="public">Public</radio-set-button>
            <radio-set-button button-value="private">Private</radio-set-button>
            <radio-set-button button-value="protected">Protected</radio-set-button>
        </radio-set>
        
    </div>
    
</body>

CSS

.radioSetButton {
    display : block;
    padding : 10px;
    border : 1px solid black;
    float : left;
}

.radioSetButton:hover {
    cursor : pointer;
}

.radioSetButton.active {
    background-color : grey;
}

JavaScript

var app = angular.module('myApp', []);

app.controller('MainController', function($scope) {
    $scope.object = {
        'property' : 'public'
    };
});

app.directive('radioSet', function() {
    return {
        scope : {
            radioValue : '='
        },
        restrict : 'E',
        transclude : true,
        replace : true,
        template : '<div class="radioSet" ng-transclude></div>',
        controller : function($scope) {
            
            this.getRadioValue = function() {
                return $scope.radioValue;
            }
            
            this.setRadioValue = function(val) {
                $scope.$apply(function() {
                    $scope.radioValue = val
                });
            }
        }
    };
});

app.directive('radioSetButton', function() {
    return {
        restrict : 'E',
        transclude : true,
        replace : true,
        scope : true,
        template : '<div class="radioSetButton" ng-class="{active:isActive()}" ng-transclude></div>',
        require : '^radioSet',
        link : function(scope, elem, attrs, radioSetController, transclude) {
            scope.isActive = function() {
                return attrs.buttonValue === radioSetController.getRadioValue();
            };
            
            elem.on('click', function() {
                radioSetController.setRadioValue(attrs.buttonValue);
            });
        }
    };
});