diff --git a/docs/source/index.rst b/docs/source/index.rst
index 3d917407..14f2e4d7 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -30,6 +30,7 @@ workflow.
reference/settings-example
reference/local-settings
reference/deployment
+ reference/migration
Indices and tables
diff --git a/docs/source/reference/migration.rst b/docs/source/reference/migration.rst
new file mode 100644
index 00000000..32640246
--- /dev/null
+++ b/docs/source/reference/migration.rst
@@ -0,0 +1,30 @@
+.. _migration_reference:
+
+Migration
+=========
+
+Migrating to v0.3.0
+-------------------
+
+v0.3.0 introduces a fresh styling for the DGPF portal. You can migrate to the
+new design by changing the following in your own `settings.py`.
+
+.. code-block:: python
+
+ # Changing base_template from v2 to v3
+ BASE_TEMPLATES = 'globus-portal-framework/v3/'
+
+You can overwrite the existing templates for the v3 version by replacing the template
+files (.html) and styling (.css) in `templates/globus-portal-framework/v3/` and
+`static/globus-portal-framework/v3/` respectively.
+
+.. note::
+
+ In case you want to revert back to the `v2` styling, simply undo the
+ `BASE_TEMPLATES` value in your `settings.py`.
+
+.. warning::
+
+ Breadcrumbs have been removed as part of the default `v3` styling, but users
+ are encouraged to add their own styling (if their use cases require the breadcrumb) and
+ uncomment the breadcrumb code segment in `templates/globus-portal-framework/v3/base.html`.
\ No newline at end of file
diff --git a/globus_portal_framework/static/globus-portal-framework/images/bg-header.svg b/globus_portal_framework/static/globus-portal-framework/images/bg-header.svg
new file mode 100644
index 00000000..87c59140
--- /dev/null
+++ b/globus_portal_framework/static/globus-portal-framework/images/bg-header.svg
@@ -0,0 +1,60 @@
+
+
+AAAsaGp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAACxCanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46dXVpZDpmOTk5NjEwZi0zNTllLTRhMTItYTFmZC0zMTA1MDM3NzUxMGIAAAABqGp1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAAMpqdW1iAAAAJmp1bWRjYm9yABEAEIAAAKoAOJtxA2MycGEuYWN0aW9ucwAAAACcY2JvcqFnYWN0aW9uc4GjZmFjdGlvbmtjMnBhLmVkaXRlZG1zb2Z0d2FyZUFnZW50bUFkb2JlIEZpcmVmbHlxZGlnaXRhbFNvdXJjZVR5cGV4Rmh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWEAAACtanVtYgAAAChqdW1kY2JvcgARABCAAACqADibcQNjMnBhLmhhc2guZGF0YQAAAAB9Y2JvcqVqZXhjbHVzaW9uc4GiZXN0YXJ0GQGHZmxlbmd0aBk7OGRuYW1lbmp1bWJmIG1hbmlmZXN0Y2FsZ2ZzaGEyNTZkaGFzaFggf2nFy9KWGdiwIrqZC3ttL07KvPuRr1y6P0vDEiI+WVtjcGFkSQAAAAAAAAAAAAAAAgtqdW1iAAAAJGp1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0AAAAB32Nib3KoaGRjOnRpdGxlb0dlbmVyYXRlZCBJbWFnZWlkYzpmb3JtYXRtaW1hZ2Uvc3ZnK3htbGppbnN0YW5jZUlEeCx4bXA6aWlkOmUyY2Q1ZTFiLWFkYzItNDk5MS1iYmI2LTU0ZjQ2NDc1MDBjZm9jbGFpbV9nZW5lcmF0b3J4NkFkb2JlX0lsbHVzdHJhdG9yLzI4LjAgYWRvYmVfYzJwYS8wLjcuNiBjMnBhLXJzLzAuMjUuMnRjbGFpbV9nZW5lcmF0b3JfaW5mb4G/ZG5hbWVxQWRvYmUgSWxsdXN0cmF0b3JndmVyc2lvbmQyOC4w/2lzaWduYXR1cmV4GXNlbGYjanVtYmY9YzJwYS5zaWduYXR1cmVqYXNzZXJ0aW9uc4KiY3VybHgnc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5hY3Rpb25zZGhhc2hYIOusZuFqg598YJzpOfX+1iNBgqddK8SSEhBG9CJk0CvBomN1cmx4KXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaGFzaC5kYXRhZGhhc2hYIHclsWo6tmD6yK6NSbGi3Td4OEapaSXK+Upz7na7BLwiY2FsZ2ZzaGEyNTYAAChAanVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAACgQY2JvctKERKEBOCSjZ3g1Y2hhaW6CWQYzMIIGLzCCBBegAwIBAgIQG1sLO9qw5F3y8w2eVNHa0jANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJVUzEjMCEGA1UEChMaQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQxHTAbBgNVBAsTFEFkb2JlIFRydXN0IFNlcnZpY2VzMSIwIAYDVQQDExlBZG9iZSBQcm9kdWN0IFNlcnZpY2VzIEczMB4XDTIzMDIwMTAwMDAwMFoXDTI0MDIwMTIzNTk1OVowgaExETAPBgNVBAMMCGNhaS1wcm9kMRwwGgYDVQQLDBNDb250ZW50IENyZWRlbnRpYWxzMRMwEQYDVQQKDApBZG9iZSBJbmMuMREwDwYDVQQHDAhTYW4gSm9zZTETMBEGA1UECAwKQ2FsaWZvcm5pYTELMAkGA1UEBhMCVVMxJDAiBgkqhkiG9w0BCQEWFWdycC1jYWktb3BzQGFkb2JlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO/TAKd9hj2WQcOzKStMbsViWdgcFzK5qW4Pm71QuPO/4WxNY4uDw2GvP1FPEj0R4Fu7dabt/i+o+xBh/GQSnTAhroNWYQ5mFsB5F9uHJtZD8Pha+9yTiYRlH5BmZOkifsdfrWBu0wUeUlTGRgFy0igC31MEAVvP13kiDZYbRuwff1vr/xRJecgiTgUHp20FFPXF4TBIO3A53VgGldc0EmZFYdc0llnzmh/a0FN6yD+Qy9Os4knFgNn3tTjXrBy9tWiaV56z41dRjf9kHjEf42xmKWzubVsva/aFKceIuipl5QqSVsdSZPhmmOtkJ224ixabmPY89cqvscpS4JtlJcECAwEABaOCAYwwggGIMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMB4GA1UdJQQXMBUGCSqGSIb3LwEBDAYIKwYBBQUHAwQwgY4GA1UdIASBhjCBgzCBgAYJKoZIhvcvAQIDMHMwcQYIKwYBBQUHAgIwZQxjWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHVzZSB0aGlzIExpY2Vuc2UgQ2VydGlmaWNhdGUgZXhjZXB0IGFzIHBlcm1pdHRlZCBieSB0aGUgbGljZW5zZSBhZ3JlZW1lbnQuMF0GA1UdHwRWMFQwUqBQoE6GTGh0dHA6Ly9wa2ktY3JsLnN5bWF1dGguY29tL2NhXzdhNWMzYTBjNzMxMTc0MDZhZGQxOTMxMmJjMWJjMjNmL0xhdGVzdENSTC5jcmwwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vcGtpLW9jc3Auc3ltYXV0aC5jb20wHwYDVR0jBBgwFoAUVyl6Mk3M/uQ1TsAfJHPOc1Or32owDQYJKoZIhvcNAQELBQADggIBAFeOUZrfIAr8aKOfqf8k1T0VmbvYw/q9zlzOtZ73LRP4RrC5G+GkPkR2LVOdeSul7ywySBKNMZ1tj7IaGrzOUJZB5c3X9pajcv1evW43Fj+hWkufS5ZZ+d8nvJH2AqX/Kgx+GPJ1Pi3V9ceL8yF+GtZJVEepfZTfVQUbP97b3w/aS/6+qHOkhSjVuP6OJu2g8swxBwI5O0qIk5OHijdVJmnBAMRELOj3U2QX4udmPBiXp8TlRIiSD+gKiiZfFI+mjDJsOtxEn2KVu0lwRHjz8saDDO/9zs5h2uifg+cRebUWQ5pWP5BF/s7CI1OLOieEjMtHlV+nRAc5a/9s/O8KM9B35evRDjTfZaVLFDCiy01MA+2hUBTg4LBUfcRyHfx6YnTT/p+QMJ2vsw3z/ifYtI2sxS9oERl2YuoMIGc7TZ1sWuamDelNzQWpFDgYv/zymNE1IzLm1T1KhCdIIZioiyN8vwDOA8QaJddGAAFhzW5d5x/j95rJvcrYw+zuGdZNtQqkcckjDGl03e9MZ1k1anP07F+6jd4QtCWRO8AIeCqRpeL8UBqcd7k8KGfp+vX/hw0XyCgPRu48CmBLfPPCqNGHGsfwhLA98mfwmrO6sxosMyedzXy0fNSIy1fveN/qheHu+gLFf9PgPecU+XFTeibZylwtDVZ3jTbrHXyuVIZHWQalMIIGoTCCBImgAwIBAgIQDKi2VHuJ5tIGiXXNi5uJ4jANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQGEwJVUzEjMCEGA1UEChMaQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQxHTAbBgNVBAsTFEFkb2JlIFRydXN0IFNlcnZpY2VzMRkwFwYDVQQDExBBZG9iZSBSb290IENBIEcyMB4XDTE2MTEyOTAwMDAwMFoXDTQxMTEyODIzNTk1OVowdTELMAkGA1UEBhMCVVMxIzAhBgNVBAoTGkFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkMR0wGwYDVQQLExRBZG9iZSBUcnVzdCBTZXJ2aWNlczEiMCAGA1UEAxMZQWRvYmUgUHJvZHVjdCBTZXJ2aWNlcyBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALcfLr29CbNcSGz+DIOubAHqUXglpIA+iaexsohk2vaJdoH5+R3zlfx4mI2Yjs/k7hxVPg1zWnfOsRKoFXhlTJbyBxnvxB3CgcbxA13ZU1wecyBJH5dP0hp+yer01/DDcm30oveXkA1DmfX4wmqvjwRY0uWX3jZs4v8kfjLANIyiqFmq0kQhRRQaVBUFnwIC8lzssTp10DkLnY8TY+lrtF9CAdd/iB9dVnCnFhFlzOI+I4eoS8tvQndxKFRt6MXFXpzBfxDIA9rV48eDVG0zQdf4PfjEejcOTIaeZP4N2rTRMQMYbboAvk90g0oUhCX7NqrookVB7V90YTnCtbNTiYE+bNrPcRsuf7sVaXACGitiogyV1t8cTfJ1z5pNTUlbv5sbX2qa+E70iW4a1O1AN6oUGPZ+Dp9rGx9V9U8Puy03pPCggOWQ4IThET4iKfybfPd6qL9WxOayZGoHFYNFqo4fPTYQmgQPFckbd6L5RsginTVdlC925+b3RbE5O6qpqfZmpM9f0rlV2MSH+i+vvEVzmrV1mj5JrnLixNUzznj+0tTeSU6BQrPNJdg9hLcaEFxgkePCv3E1Eec1f30PoXSDs6KNJxZ++2PGHXdpO/8fQRO/KZqHjJ8OlV2H1wrlhII+qe46Wy6MUDKFjAlc5YO9llTYSRZUsOGg/H3Ons3hAgMBAAGjggE0MIIBMDASBgNVHRMBAf8ECDAGAQH/AgEAMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwuYWRvYmUuY29tL2Fkb2Jlcm9vdGcyLmNybDAOBgNVHQ8BAf8EBAMCAQYwFAYDVR0lBA0wCwYJKoZIhvcvAQEHMFcGA1UdIARQME4wTAYJKoZIhvcvAQIDMD8wPQYIKwYBBQUHAgEWMWh0dHBzOi8vd3d3LmFkb2JlLmNvbS9taXNjL3BraS9wcm9kX3N2Y2VfY3BzLmh0bWwwJAYDVR0RBB0wG6QZMBcxFTATBgNVBAMTDFNZTUMtNDA5Ni0zMzAdBgNVHQ4EFgQUVyl6Mk3M/uQ1TsAfJHPOc1Or32owHwYDVR0jBBgwFoAUphzhbVQkTKiPSHK/bqmM1eTsMdQwDQYJKoZIhvcNAQELBQADggIBAHHO5QeMptwt3MjgO2VeAJKBleuVICSvn2k4Xcl88bjapU0AZTslwRhcnr5Zt9wbBjtZgyX6M7si8k9vuyFcVhb1ucmDFfuUtTXgoTFyGZws1jV57oiEEnZjw/NkxFQpJ3kKRRE+DQ8EsaPP8pH8Oh8fH4bis9MI4Y5FjF5it3TWVyLmFXG8pxy8iTswPr1lN7B9k9Iz7RaexTd/RmZ3uGBtGlTJZx4bR4cWl1Qor9kVaEeMNULbyh0Kc3zzm0edwpe+Ii0rRlRSj8Ai2EUqWEReyer1Uv18VuC87zdm+lRCjnLyZjdy4acRUZd2GM1vncJ8LW7h1uliZZo332y5tTMSxRpRveWgs99V/MM6mDbL2/fuQF3L/C5evbS15jtTrbGP98CCzVBKeFS2UxN8Kpt5/ITJwpWYoismQkuy+BNJgpW8fgUUjB93laOo4L3uNf3ytxUDOEAjSJKRrOxY4y8vqbQvicslqnH7zkaxVfxjoAeYQ/huYISXCKXooA/5R7AkWLDmubBXakRIcCFi5klrTcHy2XSd3ZAnO8kaZt4GpeqkX05GKcUzccSsrym5GiQ6MUfb7Vqwt4ja0HfVb8Qt017bs6B26rpnqoHAKnn1hfburJ0OEPRZF83riQKzbkrzyIYAY1bYIB9MNL5v5ZgkGIgv2NdhngsX4GJS9927ZnNpZ1RzdKFpdHN0VG9rZW5zgaFjdmFsWRdAMIIXPDADAgEAMIIXMwYJKoZIhvcNAQcCoIIXJDCCFyACAQMxDzANBglghkgBZQMEAgEFADCBggYLKoZIhvcNAQkQAQSgcwRxMG8CAQEGCWCGSAGG/WwHATAxMA0GCWCGSAFlAwQCAQUABCB8notdlB40w24e8XSI7WeZHDRBHdSZlCS6IjinMBjMlgIRAPgWUFkYgjG0Sz/O94C0i8QYDzIwMjMxMDE2MTUyMTAxWgIISHtLFaNtkdygghMJMIIGwjCCBKqgAwIBAgIQBUSv85SdCDmmv9s/X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAwMDAwMFoXDTM0MTAxMzIzNTk1OVowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKNTRYcdg45brD5UsyPgz5/X5dLnXaEOCdwvSKOXejsqnGfcYhVYwamTEafNqrJq3RApih5iY2nTWJw1cb86l+uUUI8cIOrHmjsvlmbjaedp/lvD1isgHMGXlLSlUIHyz8sHpjBoyoNC2vx/CSSUpIIa2mq62DvKXd4ZGIX7ReoNYWyd/nFexAaaPPDFLnkPG2ZS48jWPl/aQ9OE9dDH9kgtXkV1lnX+3RChG4PBuOZSlbVH13gpOWvgeFmX40QrStWVzu8IF+qCZE3/I+PKhu60pCFkcOvV5aDaY7Mu6QXuqvYk9R28mxyyt1/f8O52fTGZZUdVnUokL6wrl76f5P17cz4y7lI0+9S769SgLDSb495uZBkHNwGRDxy1Uc2qTGaDiGhiu7xBG3gZbeTZD+BYQfvYsSzhUa+0rRUGFOpiCBPTaR58ZE2dD9/O0V6MqqtQFcmzyrzXxDtoRKOlO0L9c33u3Qr/eTQQfqZcClhMAD6FaXXHg2TWdc2PEnZWpST618RrIbroHzSYLzrqawGw9/sqhux7UjipmAmhcbJsca8+uG+W1eEQE/5hRwqM/vC2x9XH3mwk8L9CgsqgcT2ckpMEtGlwJw1Pt7U20clfCKRwo+wK8REuZODLIivK8SgTIUlRfgZm0zu++uuRONhRB8qUt+JQofM604qDy0B7AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+eyG8wHQYDVR0OBBYEFKW27xPn783QZKHVVqllMaPe1eNJMFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGAMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUHMAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQADggIBAIEa1t6gqbWYF7xwjU+KPGic2CX/yyzkzepdIpLsjCICqbjPgKjZ5+PF7SaCinEvGN1Ott5s1+FgnCvt7T1IjrhrunxdvcJhN2hJd6PrkKoS1yeF844ektrCQDifXcigLiV4JZ0qBXqEKZi2V3mP2yZWK7Dzp703DNiYdk9WuVLCtp04qYHnbUFcjGnRuSvExnvPnPp44pMadqJpddNQ5EQSviANnqlE0PjlSXcIWiHFtM+YlRpUurm8wWkZus8W8oM3NG6wQSbd3lqXTzON1I13fXVFoaVYJmoDRd7ZULVQjK9WvUzF4UbFKNOt50MAcN7MmJ4ZiQPq1JE3701S88lgIcRWR+3aEUuMMsOI5ljitts++V+wQtaP4xeR0arAVeOGv6wnLEHQmjNKqDbUuXKWfpd5OEhfysLcPTLfddY2Z1qJ+Panx+VPNTwAvb6cKmx5AdzaROY63jg7B145WPR8czFVoIARyxQMfq68/qTreWWqaNYiyjvrmoI1VygWy2nyMpqy0tg6uLFGhmu6F/3Ed2wVbK6rr3M66ElGt9V/zLY4wNjsHPW2obhDLN9OTH0eaHDAdwrUAuBcYLso/zjlUlrWrBciI0707NMX+1Br/wd3H3GXREHJuEbTbDJ8WC9nR2XlG3O2mflrLAZG70Ee8PBf4NvZrZCARK+AEEGKMIIGrjCCBJagAwIBAgIQBzY3tyRUfNhHrP0oZipeWzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcNMzcwMzIyMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxoY1BkmzwT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+kiPNo+n3znIkLf50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+vaPcQXf6sZKz5C3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RBidx8ald68Dd5n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn7w6lY2zkpsUdzTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAxE6lXKZYnLvWHpo9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB3iIU2YIqx5K/oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNCaJ+2RrOdOqPVA+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklSUPRR8zZJTYsg0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP015LdhJRk8mMDDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXiYKNYCQEoAA6EVO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCPnshvMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULhsBguEE0TzzBTzr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAlNDFnzbYSlm/EUExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XNQ1/tYLaqT5Fmniye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ8NWKcXZl2szwcqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDnmPv7pp1yr8THwcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsdCEkPlM05et3/JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcma+Q4c6umAU+9Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+8kaddSweJywm228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6KYawmKAr7ZVBtzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAjfwAL5HYCJtnwZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucTDh3bNzgaoSv27dZ8/DCCBY0wggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orYWcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0clcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLimdwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZqbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59PesMHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rbII01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDGCA3YwggNyAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQBUSv85SdCDmmv9s/X+VhFjANBglghkgBZQMEAgEFAKCB0TAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIzMTAxNjE1MjEwMVowKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQUZvArMsLCyQ+CXc6qisnGTxmcz0AwLwYJKoZIhvcNAQkEMSIEIC2zH4KnFqRolnrqOXzb5MvJQZ8LWKE8D06m6C3MfsR/MDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEINL25G3tdCLM0dRAV2hBNm+CitpVmq4zFq9NGprUDHgoMA0GCSqGSIb3DQEBAQUABIICABpMzdratTe8WWdFUEUX+4+rjqyv1nQbIEn33a3triM6TJhfTPYpF+t39jCf/rjfSrbSJWHDCBag23zS0j07lFpkARpvxiZHhmXd/tioE/1aZBqrW2VD0pvVmQH8GgltdolNTjx/6DbxOWbrdadP+eMzSjrfzgoVLxFV1BJ+HuEPXpFwNC1dEWh2ZSIFr4mnGV73JWY5ejSjnsuznrfT01FHSHJCkkWnR2nugW4jijL6ohPnEaH0tA/0eazqwB/0rqyxP8MeNTVr6tS9FVf/L6h1bq8+Lj6smuTHUS/la7w+Qv82rs7yrDEYehjV42LRwyIqofNqjnKd5akZKwK58NK7m0WadmJXnt4vT0xpeZte6FymMPUEK2f4cuZRoPLrJbDKIz6SP+dlCw2RSROrzpaFyt1pN8FzlMIOXc2PzEkMdI5d7fSoLsDQZdJTmzTQccx5TLVYZM/raPMDQnQ6KpG4+0HLQt+maGLu/ANH+YLgs6hi5eFWBTgSnsm5dBmUuWKIXoENryYJjGy8mJyW95X6HuCgdyXtKXAF7XhS5M9ds3W3NqwWXQsgDcw+EsGAtg0Ma7OUrsmE7NXfOJiWldeNIclEcPG8YdzFs6vGrOeSQDiaQpOkp7CXv7AT41aUyqNPxqZ80/e22ewZhoaZ0L79pdbNcQFDZyaJsssCHCN5Y3BhZFkCswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2WQEAoA3TjRpZJmK2pCAzV3m+qE8lh+U4+L6oDr9gqJWXhUTFrVSA8Ha0uj+Ua1N+T5fABUXXZfXITmmk3necQ6/z5DPZp+1NZXLUdRYnNQAOnTePigWgf6wKsx9qiqS/K0cOmMqKfDUcRfcxfCNIhxwkEPrz7acZ+PHlAao3LBJGNWsiWpfmNsjGehR8tF3bpBFg6n2m0Z3a6PRN4F80yTlpAygMakyHt/jLEw2/rs7qzurMj3sau2t7pkqrT+pCDh0fAVlffDP9eDHejvGGosq1UL4fQeZJ9WopLNxUhf6CXwVdPUEle7P28fjKx9vw5RVyAmR3mhi4/g2QQqmTn/TuAA==
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/globus_portal_framework/static/globus-portal-framework/images/login.svg b/globus_portal_framework/static/globus-portal-framework/images/login.svg
new file mode 100644
index 00000000..8f13f393
--- /dev/null
+++ b/globus_portal_framework/static/globus-portal-framework/images/login.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/globus_portal_framework/static/globus-portal-framework/images/logout.svg b/globus_portal_framework/static/globus-portal-framework/images/logout.svg
new file mode 100644
index 00000000..2fd33295
--- /dev/null
+++ b/globus_portal_framework/static/globus-portal-framework/images/logout.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/globus_portal_framework/static/globus-portal-framework/v3/search.css b/globus_portal_framework/static/globus-portal-framework/v3/search.css
new file mode 100644
index 00000000..6ee51080
--- /dev/null
+++ b/globus_portal_framework/static/globus-portal-framework/v3/search.css
@@ -0,0 +1,321 @@
+/* General */
+html,
+body {
+ font-family: 'IBM Plex Sans', sans-serif;
+ font-weight: 300;
+ font-size: 14px;
+ color: #333;
+}
+
+.badge-primary {
+ background-color: #337ab7;
+}
+
+
+/*************************
+ Main
+*************************/
+/* search bar */
+
+#search-form {
+ display: flex;
+ flex-direction: row;
+ border: none;
+}
+
+#search-form #search-input,
+#search-form #search-btn {
+ font-size: 17px;
+ height: 42px;
+ text-indent: 10px;
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+}
+
+#search-form #search-btn {
+ color: #22bbff;
+ background-color: #00264c;
+}
+
+.title {
+ color: white;
+ font-weight: bold;
+ font-size: xx-large;
+}
+
+#search-form #search-input {
+ flex-grow: 2;
+ margin-right: -42px;
+ border: none;
+ border-style: solid;
+ border-color: #22bbff;
+ border-width: 1px;
+ border-radius: 10px;
+}
+
+#results #search-result .result-item em {
+ font-weight: bold;
+}
+
+/* Media Queries */
+@media (min-width: 768px) {
+ #search-form .input-group-btn {
+ display: none;
+ }
+
+ #search-form #search-input {
+ border-radius: 10px;
+ }
+}
+
+/* sidebar */
+#sidebar .card {
+ border-style: solid;
+ border-color: #cccccc;
+ border-width: 1px;
+}
+
+#sidebar .card-body {
+ color: #222222;
+}
+
+#sidebar .card-header {
+ color: #00264c;
+ font-size: 18px;
+ background-color: #eaeaea;
+ border: 0;
+}
+
+#sidebar .badge-secondary {
+ background-color: #777777;
+ font-size: 12px;
+}
+
+legend {
+ font-size: 16px;
+}
+
+fieldset.facet-fieldset legend {
+ border-bottom: 1px solid #ccc;
+}
+
+.fieldset-container {
+ max-height: 300px;
+}
+
+.navbar {
+ padding: 0px;
+ margin: 0px;
+ height: 116px;
+}
+
+.navbar-brand {
+ height: 116px;
+ padding-right: 0px;
+ padding-left: 0px;
+ padding-top: 15px;
+ padding-bottom: 10px;
+ margin: 0px;
+ margin-left: 50px;
+}
+
+.top-nav {
+ background-color: #00264c;
+}
+
+.nav-link-search {
+ width: 100px;
+ padding: 0px;
+ margin: 0px;
+ border-radius: 0;
+}
+
+.login {
+ height: 116px;
+ background-color: #004177;
+ color: white;
+}
+
+.navbar-image {
+ height: 100%;
+ color: green;
+}
+
+#navbarSupportedContent {
+ height: 86px;
+}
+
+.inverse {
+ filter: invert(100%);
+}
+
+.subnav {
+ background-image: url("/static/globus-portal-framework/images/bg-header.svg");
+ background-repeat: repeat-x;
+ background-size: cover;
+ height: 120px;
+ position: relative;
+}
+
+.subnav-button {
+ color: white;
+ margin-bottom: 0;
+ margin-top: 50%;
+}
+
+.active {
+ color: #004177 !important;
+ background-color: white !important;
+ font-size: 20px;
+ box-shadow: none !important;
+}
+
+.squared {
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ border-bottom: 0;
+ background-color: #00264c;
+ font-size: 20px;
+ margin-left: 10px;
+}
+
+.tag {
+ color: white;
+ font-size: 30px;
+ height: 29px;
+ padding-left: 50px;
+ padding-top: 20px;
+ position: relative;
+ top: 35px;
+}
+
+.nav-tabs {
+ height: 120px;
+ border-bottom: 0;
+ padding-bottom: 0;
+}
+
+#globe {
+ height: 50px;
+ width: 50px;
+}
+
+.list-group-item {
+ font-size: 16px;
+ color: #222222;
+}
+
+#results-header {
+ color: #00264c;
+ font-size: 28px;
+}
+
+#datasets-header {
+ color: #777777;
+ font-size: 16px;
+}
+
+#about {
+ font-size: 16px;
+}
+
+#content .card {
+ border: 0;
+ padding-bottom: 25px;
+}
+
+#content .card-header {
+ font-size: 18px;
+ color: #0076bf !important;
+ background-color: white;
+ border-left-color: #22bbff;
+ border-left-width: 3px;
+ border-bottom-color: #cccccc;
+ border-bottom-width: 1px;
+ border-right: 0;
+ border-top: 0;
+ border-style: solid;
+}
+
+#content .card-header a {
+ text-decoration: none;
+ color: #0076bf;
+}
+
+#content .card-body {
+ border-left-width: 3px;
+ border-left-color: #cccccc;
+ border-left-style: solid;
+ border-right-width: 0px;
+ border-top-width: 0px;
+ border-bottom-width: 0px;
+ padding-bottom: 0;
+}
+
+#content .card-body th {
+ color: #777777;
+ font-size: 14px;
+}
+
+#content .card-body td {
+ color: #222222;
+ font-size: 14px;
+}
+
+.table {
+ color: #222222;
+ font-size: 16px;
+}
+
+.fa-mag-glass {
+ content: '';
+ background: url("/static/globus-portal-framework/images/mag_glass.svg");
+ width: 32px;
+ height: 32px;
+ display: inline-block;
+}
+
+.borderless td,
+.borderless th {
+ border: none;
+}
+
+#logo {
+ height: 100%;
+}
+
+#caption-top {
+ caption-side: top;
+}
+
+#details .card-header {
+ font-size: 18px;
+ color: #0076bf !important;
+ background-color: white;
+ border-left-color: #22bbff;
+ border-left-width: 3px;
+ border-bottom-color: #cccccc;
+ border-bottom-width: 1px;
+ border-right: 0;
+ border-top: 0;
+ border-style: solid;
+}
+
+#details {
+ border-top: 0;
+}
+
+#details .card-body {
+ border-left-width: 3px;
+ border-left-color: #cccccc;
+ border-left-style: solid;
+ border-right-width: 0px;
+ border-top-width: 0px;
+ border-bottom-width: 0px;
+ padding-bottom: 0;
+}
+
+#details .card {
+ border: 0;
+ padding-bottom: 25px;
+}
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/allowed-groups.html b/globus_portal_framework/templates/globus-portal-framework/v3/allowed-groups.html
new file mode 100644
index 00000000..ad484a68
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/allowed-groups.html
@@ -0,0 +1,59 @@
+{%extends "globus-portal-framework/v3/base.html"%}
+
+{% load static %}
+{% load index_template %}
+
+{%block headextras%}
+
+{% endblock %}
+
+{%block title%}Request Groups Access{%endblock%}
+
+{%block body%}
+
+
+
+
+ {% index_template 'components/messages.html' as it_mess %}
+ {% include it_mess %}
+
+
+
+
+
+
+ {% block allowed_groups_list %}
+ {% for group in allowed_groups|dictsort:'name' %}
+
+ {{group.name}}
+ {% if group.is_member == True %}
+ {% block is_member_of_group %}
+ You are a member
+ {% endblock %}
+ {% else %}
+ {% block is_not_member_of_group %}
+ Request Access
+ {% endblock %}
+ {% endif %}
+
+ {% empty %}
+ {% block no_group_configured %}
+ No allowed groups configured, this portal does not restrict which users can login.
+ {% endblock %}
+ {% endfor %}
+ {% endblock %}
+
+ {% if not request.user.is_authenticated %}
+
+ If you are already a member of a group above, you can Login Now
+
+ {% endif %}
+
+
+
+
+{% endblock %}
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/base.html b/globus_portal_framework/templates/globus-portal-framework/v3/base.html
new file mode 100644
index 00000000..fd9cbdb7
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/base.html
@@ -0,0 +1,73 @@
+{% load static index_template is_active %}
+
+
+
+
+
+
+
+
+
+ {% block base_styling %}
+
+
+
+
+
+
+
+
+
+ {% endblock %}
+
+ {% block search_head %}{% endblock %}
+
+ {# Extras #}
+ {%block headextras%}
+ {% index_template 'globus-portal-framework/v3/components/base-head-extras.html' as bhe %}
+ {% include bhe %}
+ {%endblock%}
+
+ {%block title%}{%endblock%}
+
+
+
+
+
+ {% block base_nav %}
+ {% index_template 'globus-portal-framework/v3/components/base-nav.html' as base_nav %}
+ {% include base_nav %}
+ {% endblock %}
+
+
+ {% block breadcrumbs %}
+
+ {% endblock %}
+
+ {% block main_nav %}{% endblock %}
+
+ {%block base_messages %}
+
+ {% index_template 'globus-portal-framework/v3/components/messages.html' as it_messages %}
+ {% include it_messages %}
+
+ {%endblock%}
+
+
+ {%block body%}
+ {%endblock%}
+
+
+ {% index_template 'globus-portal-framework/v3/components/footer.html' as it_footer %}
+ {% include it_footer %}
+
+
+
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/base-head-extras.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/base-head-extras.html
new file mode 100644
index 00000000..6eea223d
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/base-head-extras.html
@@ -0,0 +1,4 @@
+{% comment %}
+If you have anything else you would like to include in the html
+section, you can specify it here.
+{% endcomment %}
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/base-nav.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/base-nav.html
new file mode 100644
index 00000000..4e2917b6
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/base-nav.html
@@ -0,0 +1,37 @@
+{% load static %}
+
+
+
+ {% block project_title %}
+ {% if globus_portal_framework.index_data.tagline %}
+ {{globus_portal_framework.index_data.name|default:'globus_portal_framework.index'}}: {{globus_portal_framework.index_data.tagline}}
+ {% else %}
+ {{globus_portal_framework.project_title}}
+ {% endif %}
+ {% endblock %}
+
+
+
+
+
+
+ {%if globus_portal_framework.auth_enabled and request.user.is_authenticated %}
+
+
+
+ LOG OUT
+
+
+ {% elif globus_portal_framework.auth_enabled %}
+
+
+
+ LOG IN
+
+
+ {% endif %}
+
+
+
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/copy-to-clipboard.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/copy-to-clipboard.html
new file mode 100644
index 00000000..9b07ad20
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/copy-to-clipboard.html
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/detail-dc-metadata.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/detail-dc-metadata.html
new file mode 100644
index 00000000..74d9b61f
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/detail-dc-metadata.html
@@ -0,0 +1,62 @@
+
+
+ {% block detail_overview_datacite %}
+
+ Creators
+
+ {% for creator in dc.creators %}
+ {{creator.creatorName}}
+ {% endfor %}
+
+
+
+ Contributors
+
+ {% for contributor in dc.contributors %}
+ {{contributor.contributorName}}
+ {% endfor %}
+
+
+
+ Dates
+
+ {% for d in dc.dates %}
+ {{d.dateType}}: {{d.date|date}}
+ {% endfor %}
+
+
+
+ Formats
+
+ {% for format in dc.formats %}
+ {{format}}
+ {% endfor %}
+
+
+
+ Publication Year
+ {{dc.publicationYear}}
+
+
+ Publisher
+ {{dc.publisher}}
+
+
+ Resource Type
+ {{dc.resourceType.resourceType}}
+
+
+ Subjects
+
+ {% for sub in dc.subjects %}
+ {{sub.subject}}
+ {% endfor %}
+
+
+
+ Version
+ {{dc.version}}
+
+ {% endblock %}
+
+
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/detail-general-metadata.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/detail-general-metadata.html
new file mode 100644
index 00000000..5cb08d23
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/detail-general-metadata.html
@@ -0,0 +1,16 @@
+
+{% block detail_general_metadata %}
+{% for key, value in project_metadata.items %}
+
+
+{% endfor %}
+{% endblock %}
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/detail-nav.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/detail-nav.html
new file mode 100644
index 00000000..4d82535c
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/detail-nav.html
@@ -0,0 +1,61 @@
+{% comment %}
+
+Requires the following fields:
+* https_url
+* title
+* globus_app_link
+{% endcomment %}
+
+
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/footer.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/footer.html
new file mode 100644
index 00000000..1a29d72a
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/footer.html
@@ -0,0 +1,3 @@
+
+
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/message.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/message.html
new file mode 100644
index 00000000..9a0b8d03
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/message.html
@@ -0,0 +1,16 @@
+{% comment %}
+Note Django Messages vs Bootstrap Alerts:
+https://docs.djangoproject.com/en/2.0/ref/contrib/messages/#django.contrib.messages.storage.base.Message
+https://getbootstrap.com/docs/4.0/components/alerts/
+{% endcomment %}
+
+ {{message}}
+
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/messages.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/messages.html
new file mode 100644
index 00000000..55af61ef
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/messages.html
@@ -0,0 +1,11 @@
+{% load index_template %}
+{% if messages %}
+{% for message in messages %}
+
+
+ {% index_template "globus-portal-framework/v3/components/message.html" as it_message %}
+ {% include it_message %}
+
+
+{% endfor %}
+{% endif %}
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/search-facets.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/search-facets.html
new file mode 100644
index 00000000..de5ccdb0
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/search-facets.html
@@ -0,0 +1,37 @@
+{% load static %}
+
+{% for facet in search.facets %}
+
+ {{facet.name}}
+
+ {% if facet.buckets %}
+ {% for field in facet.buckets %}
+
+
+ {% if field.filter_type == 'year' %}
+ {{field.datetime|date:'Y'}}
+ {% elif field.filter_type == 'month' %}
+ {{field.datetime|date:'F Y'}}
+ {% elif field.filter_type == 'day' %}
+ {{field.datetime|date:'M d Y'}}
+ {% elif field.filter_type in 'hour minute second' %}
+ {{field.datetime|date:'M d Y H:i:s T'}}
+ {% else %}
+ {{field.value}}
+ {% endif %}
+ ({{field.count}})
+
+ {% empty %}
+
No Data
+ {% endfor %}
+ {% elif facet.value %}
+
+ {% if facet.type == 'avg' %} Average {% elif facet.type == 'sum' %} Sum {% endif %}
+ ({{facet.value}})
+
+ {% endif %}
+
+
+{% endfor %}
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/search-nav.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/search-nav.html
new file mode 100644
index 00000000..09511831
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/search-nav.html
@@ -0,0 +1,14 @@
+{% load static is_active %}
+
+
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/components/search-results.html b/globus_portal_framework/templates/globus-portal-framework/v3/components/search-results.html
new file mode 100644
index 00000000..71aff494
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/components/search-results.html
@@ -0,0 +1,49 @@
+{% load static %}
+
+{% block headextras %}
+
+{% endblock %}
+
+
+
+
+ {% if search.total %}
+
+ {% endif %}
+
+
+
+
+ {% for result in search.search_results %}
+
+
+
+
+
+
+ {% for name in result.all.0.keys|slice:"0:5" %}
+ {{name}}
+ {% endfor %}
+
+
+ {% for value in result.all.0.values|slice:"0:2" %}
+ Present
+ {% endfor %}
+
+
+
+
Override this template by creating the following file:
+
+
+ templates/globus-portal-framework/v/components/search-results.html
+
+
+
+
+ {% endfor %}
+
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/detail-base.html b/globus_portal_framework/templates/globus-portal-framework/v3/detail-base.html
new file mode 100644
index 00000000..5c0e552e
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/detail-base.html
@@ -0,0 +1,62 @@
+{%extends "globus-portal-framework/v3/base.html"%}
+{% load static index_template %}
+
+{%block title%}Detail{%endblock%}
+
+{% block headextras %}
+{% block detail_head %}
+
+
+
+
+{% endblock %}
+{{block.super}}
+{% endblock %}
+
+{% block breadcrumb_items %}
+{{block.super}}
+
+ {{project_info.title}} Search
+
+{% endblock %}
+
+{% block body %}
+
+{% block detail_back_to_search %}
+{% if request.session.search %}
+
+{% endif %}
+{% endblock %}
+
+{% block body_content %}
+
+
+
+ {% block detail_nav %}
+ {% index_template 'globus-portal-framework/v3/components/detail-nav.html' as it_detail_nav %}
+ {% include it_detail_nav %}
+ {% endblock %}
+
+ {% block copy_to_clipboard %}
+ {% include 'globus-portal-framework/v3/components/copy-to-clipboard.html' %}
+ {% endblock %}
+
+ {%block detail_body %}
+ {%endblock%}
+
+
+
+
+
+{% endblock %}
+
+
+{% endblock %}
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/detail-overview.html b/globus_portal_framework/templates/globus-portal-framework/v3/detail-overview.html
new file mode 100644
index 00000000..2663f38c
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/detail-overview.html
@@ -0,0 +1,51 @@
+{% extends 'globus-portal-framework/v3/detail-base.html' %}
+
+
+{% block breadcrumb_items %}
+{{globus_portal_framework.project_title}}
+{{globus_portal_framework.index_data.name}}
+{{title|default:'Result Details'}}
+{% endblock %}
+
+
+{% block detail_body %}
+
+
+
+
+ {% block detail_search_content %}
+ {% if result.dc or result.files or result.project_metadata %}
+
General Info
+ {% with all|first as result %}
+
+
+ {% include 'globus-portal-framework/v3/components/detail-dc-metadata.html' %}
+
+
+ {% include 'globus-portal-framework/v3/components/detail-general-metadata.html' %}
+
+
+ {% endwith %}
+
+ {% else %}
+
+
+ This the default built-in detail page for Globus Portal Framework.
+ Create a file named templates/globus-portal-framework/v3/components/detail-overview.html
+ to override this template with your own, so you can customize this page to your liking.
+
+ Also, checkout the docs on 'fields' for Globus Portal Framework, which will tell you
+ how to configure the Transfer/Download/Link buttons above.
+
+
Default Detail Page
+ {% with all|first as project_metadata %}
+ {% include 'globus-portal-framework/v3/components/detail-general-metadata.html' %}
+ {% endwith %}
+ {% endif %}
+ {% endblock %}
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/detail-preview.html b/globus_portal_framework/templates/globus-portal-framework/v3/detail-preview.html
new file mode 100644
index 00000000..a311a7bb
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/detail-preview.html
@@ -0,0 +1,43 @@
+{%extends "detail-base.html"%}
+
+{% load index_template %}
+
+{# Silence regular messages so we can display them closer to preview #}
+{% block detail_messages %}
+{% endblock %}
+
+{% block detail_body %}
+
+
+
+
+
+
+
+ {% if globus_http_access == 'disabled' %}
+
+
Preview is not currently available
+
+ {% endif %}
+ {% if not request.user.is_authenticated %}
+
+
You must be logged in to view preview data.
+
+ {% else %}
+
{{preview_data|default:'No Data to Display'}}
+ {% endif %}
+
+
+
+
+
+
+{% endblock %}
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/detail-transfer.html b/globus_portal_framework/templates/globus-portal-framework/v3/detail-transfer.html
new file mode 100644
index 00000000..0483b36f
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/detail-transfer.html
@@ -0,0 +1,62 @@
+{%extends "detail-base.html"%}
+{% load index_template %}
+
+
+{% block detail_body %}
+
+{# Silence regular messages so we can display them closer to the transfer button #}
+{% block detail_messages %}
+{% endblock %}
+
+
+
+
+ {% if transfer_link %}
+
+
Your file is being transferred, you can check the status
+ here .
+
+
+ {% endif %}
+
+
+
+
+ {% for man in remote_file_manifest %}
+
Filename: {{man.filename}}
+
Length: {{man.length}}
+
URL: {{man.url}}
+
MD5: {{man.md5}}
+
SHA256: {{man.sha256}}
+
+ {% empty %}
+
No files have been listed for this search entry.
+ {% endfor %}
+
+
+
+
+
+
+{% endblock %}
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/index-selection.html b/globus_portal_framework/templates/globus-portal-framework/v3/index-selection.html
new file mode 100644
index 00000000..8198e340
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/index-selection.html
@@ -0,0 +1,55 @@
+{%extends "globus-portal-framework/v3/base.html"%}
+{% load static %}
+
+{%block headextras%}
+
+{% endblock %}
+
+
+{% block body %}
+
+
+
+
{{project_title}}
+
+
+
+{% block list_indexes %}
+{% for index, index_data in search_indexes.items %}
+
+
+
+
+ {% if index_data.test_index %}
+
+
Globus Portal Framework has been installed!
+
+
You can checkout our demo index, or continue setting up your own from the README
+
+ {% endif %}
+
+ {% block allowed_groups %}
+ {% if forloop.first and allowed_groups %}
+
+
Resources restricted to select users
+
+
You must be a group member before logging in. You can view groups and request access below.
+
+ View Groups and Request Access
+
+
+ {% endif %}
+ {% endblock %}
+
+ {% block index %}
+
+ {% endblock %}
+
+
+
+{% endfor %}
+{% endblock %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/landing-page.html b/globus_portal_framework/templates/globus-portal-framework/v3/landing-page.html
new file mode 100644
index 00000000..6609d425
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/landing-page.html
@@ -0,0 +1,52 @@
+{%extends "globus-portal-framework/v3/base.html"%}
+{% load static is_active %}
+
+{%block headextras%}
+
+{% endblock %}
+
+{% block breadcrumb_items %}
+{{globus_portal_framework.project_title}}
+About
+{% endblock %}
+
+
+{% block body %}
+
+
+
+
{{project_title}}
+
+
+
+
+
+
+
+
+
+
+
Globus Search
+
+ Globus Search is a service which allows users to store data with visibility
+ controls based on Globus Identities and Groups. Data may be public, or only
+ visible to certain sets of users. The primary features of the service are
+ APIs for storing and managing data, and visibility-filtered query APIs.
+
+
+
+ Continue reading about Globus Search
+
+
+
+
+
+
+
+{% endblock %}
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/search-about.html b/globus_portal_framework/templates/globus-portal-framework/v3/search-about.html
new file mode 100644
index 00000000..2943eef9
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/search-about.html
@@ -0,0 +1,43 @@
+{% extends "globus-portal-framework/v3/search-base.html" %}
+{% load is_active index_template is_active %}
+
+{% block breadcrumb_items %}
+{{block.super}}
+
+ {{project_info.title}} About
+
+{% endblock %}
+
+{% block body %}
+
+
+
+
{{project_title}}
+
+
+
+
+
+
+
+
+
+
About
+ {% block landing_page_about %}
+ Add something about your project here, in the landing_page_about block!
+ {% endblock %}
+
+
+
+
+
+
+{% endblock %}
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/search-base.html b/globus_portal_framework/templates/globus-portal-framework/v3/search-base.html
new file mode 100644
index 00000000..f5e62104
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/search-base.html
@@ -0,0 +1,20 @@
+{%extends "globus-portal-framework/v3/base.html"%}
+{% load static index_template is_active %}
+
+{%block title%}Search{%endblock%}
+
+{% block headextras %}
+{% block search_head %}
+
+{% endblock %}
+{{block.super}}
+{% endblock %}
+
+{% block main_nav %}
+ {% block search_nav %}
+ {% index_template 'globus-portal-framework/v3/components/search-nav.html' as search_nav %}
+ {% include search_nav %}
+ {% endblock %}
+{% endblock %}
+
+{% block body %}{%endblock%}
\ No newline at end of file
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/search-debug-detail.html b/globus_portal_framework/templates/globus-portal-framework/v3/search-debug-detail.html
new file mode 100644
index 00000000..6f43bfc9
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/search-debug-detail.html
@@ -0,0 +1,50 @@
+{%extends "base.html"%}
+{% load static %}
+{% load index_template %}
+
+{%block title%}Detail{%endblock%}
+
+{%block headextras%}
+
+
+{%endblock%}
+
+{%block body%}
+
+{% if request.session.search %}
+
+{% endif %}
+
+{%block detail_messages %}
+
+ {% index_template "components/messages.html" as it_messages %}
+ {% include it_messages %}
+
+{%endblock%}
+
+
+
+
+
+
+
+
+ {% for field_name, data in django_portal_framework_debug_fields.items %}
+
{{field_name}}:
+
{{data}}
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/search-debug.html b/globus_portal_framework/templates/globus-portal-framework/v3/search-debug.html
new file mode 100644
index 00000000..326401d4
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/search-debug.html
@@ -0,0 +1,55 @@
+{%extends "base.html"%}
+{% load static %}
+{% load index_template %}
+
+
+{%block title%}Detail{%endblock%}
+
+{%block headextras%}
+
+
+{%endblock%}
+
+{%block body%}
+
+{% if request.session.search %}
+
+{% endif %}
+
+{%block detail_messages %}
+
+ {% index_template "components/messages.html" as it_messages %}
+ {% include it_messages %}
+
+{%endblock%}
+
+
+
+
+
+
+
+
+
Results
+ {% for result in search.search_results %}
+
+ {% endfor %}
+
Facets
+
{{facets}}
+
+
+
+
+{% endblock %}
diff --git a/globus_portal_framework/templates/globus-portal-framework/v3/search.html b/globus_portal_framework/templates/globus-portal-framework/v3/search.html
new file mode 100644
index 00000000..befa94ee
--- /dev/null
+++ b/globus_portal_framework/templates/globus-portal-framework/v3/search.html
@@ -0,0 +1,90 @@
+{% extends 'globus-portal-framework/v3/search-base.html' %}
+{% load static index_template is_active %}
+
+{% block headextras %}
+{%block search_head%}
+{{block.super}}
+
+{%endblock%}
+{{block.super}}
+{% endblock %}
+
+{% block breadcrumb_items %}
+{{block.super}}
+
+ {{project_info.title}} Search
+
+{% endblock %}
+
+{%block body%}
+
+
+ {% block search_form %}
+
+ {% endblock %}
+
+
+ {% block search_facets %}
+
+ {% endblock %}
+
+
+
+
+ {% index_template 'globus-portal-framework/v3/components/search-results.html' as it_search_results %}
+ {% include it_search_results %}
+
+ {% block search_pagination %}
+
+
+
+
+
+ {% endblock %}
+
+
+
+
+
+{% endblock %}