func SliceTypeProps(pr map[string]interface{}, key string) (PropSlice, bool) {
	sp, ok := kit.TypeProp(pr, key)
	if !ok {
		return nil, false
	}
	spp, ok := sp.(PropSlice)
	if ok {
		return spp, true
	}
	return nil, false
}
SliceTypeProps returns a value that contains a PropSlice, or nil and false if it doesn't
exist or isn't a PropSlice -- for TypeProps, uses locking
package ki
import (
	"bytes"
	"encoding/json"
	"fmt"
	"log"
	"reflect"
	"strings"
	"github.com/goki/ki/kit"
)
type Props map[string]interface{}
var KiT_Props = kit.Types.AddType(&Props{}, PropsProps)
var PropsProps = Props{
	"basic-type": true,  
}
func (pr *Props) Set(key string, val interface{}) {
	if *pr == nil {
		*pr = make(Props)
	}
	(*pr)[key] = val
}
func (pr Props) Prop(key string) interface{} {
	return pr[key]
}
func (pr Props) Delete(key string) {
	delete(pr, key)
}
func SubProps(pr map[string]interface{}, key string) (Props, bool) {
	sp, ok := pr[key]
	if !ok {
		return nil, false
	}
	spp, ok := sp.(Props)
	if ok {
		return spp, true
	}
	return nil, false
}
func SubTypeProps(pr map[string]interface{}, key string) (Props, bool) {
	sp, ok := kit.TypeProp(pr, key)
	if !ok {
		return nil, false
	}
	spp, ok := sp.(Props)
	if ok {
		return spp, true
	}
	return nil, false
}
func SetPropStr(pr Props, key, val string) {
	pr[key] = val
}
func SetSubProps(pr Props, key string, sp Props) {
	pr[key] = sp
}
var struTypeKey = "__type:"
var enumTypeKey = "__enum:"
type BlankProp struct{}
type PropStruct struct {
	Name  string
	Value interface{}
}
type PropSlice []PropStruct
func (ps *PropSlice) ElemLabel(idx int) string {
	return (*ps)[idx].Name
}
func SliceProps(pr map[string]interface{}, key string) (PropSlice, bool) {
	sp, ok := pr[key]
	if !ok {
		return nil, false
	}
	spp, ok := sp.(PropSlice)
	if ok {
		return spp, true
	}
	return nil, false
}