diff --git a/README.md b/README.md index a87bfc9..d88b92a 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,14 @@ Clone the project: Install Zola. -Start: +Start with targeting `m-labs.hk` domain: ``` zola serve ``` +Environmental variable `DOMAINNAME` can be specified to [substitute links on the website](#domain-handling). + To build the .bundle.js from .jsx files: ``` @@ -27,4 +29,12 @@ To build the .bundle.js from .jsx files: ``` Development builds are also available. `npm run build-dev` to re/build once, or `npm run start-dev` for incremental -continuous builds as source files change. \ No newline at end of file +continuous builds as source files change. + +## Domain handling + +Environmental variable `DOMAINNAME` controls only the following links on the website: +* email `mailto:` links +* hook for the RFQ server (`window.API_RFQ`) variable + +If absent, `DOMAINNAME` defaults to `m-labs.hk`. diff --git a/content/about-us/clubmate.md b/content/about-us/clubmate.md index 2c05482..fa3e427 100644 --- a/content/about-us/clubmate.md +++ b/content/about-us/clubmate.md @@ -18,4 +18,4 @@ Selling drinks is not our main business and only a service we do to other Club M * In case of any dispute, the seller is always right. -Contact: [sb@m-labs.hk](mailto:sb@m-labs.hk) +Contact: {{ email(address="sb") }} diff --git a/content/about-us/jobs.md b/content/about-us/jobs.md index 7a6f9d8..40d5d00 100644 --- a/content/about-us/jobs.md +++ b/content/about-us/jobs.md @@ -83,5 +83,5 @@ Now is your chance to work on top-notch science and technology projects that get {% layout_centered_content() %} -##### Contact us at [jobs@m-labs.hk](mailto:jobs@m-labs.hk) or [jobs@m-labs.ph](mailto:jobs@m-labs.ph)! +##### Contact us at {{ email(address="jobs") }} or [jobs@m-labs.ph](mailto:jobs@m-labs.ph)! {% end %} diff --git a/content/experiment-control/control-loops.md b/content/experiment-control/control-loops.md index adbb602..3db9e8e 100644 --- a/content/experiment-control/control-loops.md +++ b/content/experiment-control/control-loops.md @@ -62,7 +62,7 @@ The

- To purchase this controller, email sales@m-labs.hk. We also offer firmware customizations and development of new features. Note that features that are not implemented in the open source code above (e.g. control from Kasli) are not supported unless purchased separately. + To purchase this controller, email {{ email(address="sales") }}. We also offer firmware customizations and development of new features. Note that features that are not implemented in the open source code above (e.g. control from Kasli) are not supported unless purchased separately.

diff --git a/content/experiment-control/funding.md b/content/experiment-control/funding.md index 71ae946..88b31a5 100644 --- a/content/experiment-control/funding.md +++ b/content/experiment-control/funding.md @@ -19,7 +19,7 @@ ARTIQ and the related components that we are developing ([Migen/MiSoC](/gateware {% layout_funding(position="center", title="Sponsors") %} -We acknowledge support from our partners below. Please get in touch ([sales@m-labs.hk](mailto:sales@m-labs.hk)) if you also want to move ARTIQ forward! +We acknowledge support from our partners below. Please get in touch ({{ email(address="sales") }}) if you also want to move ARTIQ forward! {% end %} diff --git a/content/experiment-control/resources.md b/content/experiment-control/resources.md index 6b21142..ff121f7 100644 --- a/content/experiment-control/resources.md +++ b/content/experiment-control/resources.md @@ -114,7 +114,7 @@ template = "page.html" **Sinara hardware purchases, ports to your hardware, feature development, technical support, bugfixing** -contact [sales@m-labs.hk](mailto:sales@m-labs.hk) +contact {{ email(address="sales") }} We welcome inquiries from research groups of all sizes.
[See what has been funded before](/experiment-control/funding) @@ -237,6 +237,6 @@ We welcome inquiries from research groups of all sizes.
[See what has been fu {% layout_div(css="col-12 text-center") %} -Want your project listed here? Write to [sb@m-labs.hk](mailto:sb@m-labs.hk). +Want your project listed here? Write to {{ email(address="sb") }}. {% end %} diff --git a/content/experiment-control/sinara-core.md b/content/experiment-control/sinara-core.md index e0660ac..7d54286 100644 --- a/content/experiment-control/sinara-core.md +++ b/content/experiment-control/sinara-core.md @@ -14,7 +14,7 @@ The first ARTIQ core devices used hardware built in-house by physicists (based o The Sinara hardware is in active development, and the latest information is available on the wiki of each project's page. Most of the hardware engineering is done at the Institute for Electronics Systems at the Warsaw University of Technology. -Kasli and EEMs can be ordered now. We can deliver a rack-mountable crate that contains all the cards, is fully tested, and is ready to be connected to your experiment and computer network. Use our [web-based configuration and ordering tool](../place-order), or contact sales@m-labs.hk with your requirements, and we will establish a quote. +Kasli and EEMs can be ordered now. We can deliver a rack-mountable crate that contains all the cards, is fully tested, and is ready to be connected to your experiment and computer network. Use our [web-based configuration and ordering tool](../place-order), or contact {{ email(address="sales") }} with your requirements, and we will establish a quote. {% end %} @@ -297,7 +297,7 @@ The 4624 AWG "Phaser" is a quad channel 1.25 GS/s RF generator card with dual IQ We can deliver a rack-mountable crate that contains all the cards, is fully tested, and is ready to be connected to your experiment and computer network. The lead time can be as short as a few working days and we will provide assistance to help you set up your new equipment with ARTIQ via the online helpdesk. Using our AFWS tool, you can keep the firmware of your M-Labs devices up-to-date easily, and benefit from the new features we continuously develop into ARTIQ. -Use our [web-based configuration and ordering tool](../place-order), or contact sales@m-labs.hk with your requirements, and we will establish a quote. +Use our [web-based configuration and ordering tool](../place-order), or contact <{{ email(address="sales") }} with your requirements, and we will establish a quote. {% end %} diff --git a/content/other/mixxeo.md b/content/other/mixxeo.md index 0fadc57..d53406b 100644 --- a/content/other/mixxeo.md +++ b/content/other/mixxeo.md @@ -30,7 +30,7 @@ Built on the MiSoC and Migen technologies that or The Mixxeo supported mixing from two DVI or HDMI sources up to 720p60, with crossfade, fade to black and potentially other effects with a latency of less than two frames. -Status (Aug 2014) - Main board and gateware have been mostly functional for a while, mechanical design and manufacturing for the case/mechatronics are progressing slowly. If you have the skills and would like to help out, email [sb@m-labs.hk](mailto:sb@m-labs.hk) or the mailing list. +Status (Aug 2014) - Main board and gateware have been mostly functional for a while, mechanical design and manufacturing for the case/mechatronics are progressing slowly. If you have the skills and would like to help out, email {{ email(address="sb") }} or the mailing list.


diff --git a/content/software/smoltcp.md b/content/software/smoltcp.md index 5dc82c4..626cfdd 100644 --- a/content/software/smoltcp.md +++ b/content/software/smoltcp.md @@ -26,6 +26,6 @@ smoltcp achieves on GitHub. -**Commercial support for smoltcp is available.** Email [sales@m-labs.hk](mailto:sales@m-labs.hk). +**Commercial support for smoltcp is available.** Email {{ email(address="sales") }}. {% end %} diff --git a/static/js/shop.bundle.js b/static/js/shop.bundle.js index 5b0ec80..e7ad151 100644 --- a/static/js/shop.bundle.js +++ b/static/js/shop.bundle.js @@ -1,2 +1,2 @@ /*! For license information please see shop.bundle.js.LICENSE.txt */ -(()=>{var e={513:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),l=Symbol.for("react.provider"),s=Symbol.for("react.context"),c=Symbol.for("react.server_context"),u=Symbol.for("react.forward_ref"),d=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),f=Symbol.for("react.memo"),m=Symbol.for("react.lazy");Symbol.for("react.offscreen");Symbol.for("react.module.reference"),t.isContextConsumer=function(e){return function(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case n:switch(e=e.type){case o:case i:case a:case d:case p:return e;default:switch(e=e&&e.$$typeof){case c:case s:case u:case m:case f:case l:return e;default:return t}}case r:return t}}}(e)===s}},749:(e,t,n)=>{"use strict";e.exports=n(513)},485:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],t=0;t{"use strict";var r=n(404),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||o}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,m=n?Symbol.for("react.suspense_list"):60120,g=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function E(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case l:case i:case f:return e;default:switch(e=e&&e.$$typeof){case c:case p:case h:case g:case s:return e;default:return t}}case o:return t}}}function x(e){return E(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=s,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=h,t.Memo=g,t.Portal=o,t.Profiler=l,t.StrictMode=i,t.Suspense=f,t.isAsyncMode=function(e){return x(e)||E(e)===u},t.isConcurrentMode=x,t.isContextConsumer=function(e){return E(e)===c},t.isContextProvider=function(e){return E(e)===s},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return E(e)===p},t.isFragment=function(e){return E(e)===a},t.isLazy=function(e){return E(e)===h},t.isMemo=function(e){return E(e)===g},t.isPortal=function(e){return E(e)===o},t.isProfiler=function(e){return E(e)===l},t.isStrictMode=function(e){return E(e)===i},t.isSuspense=function(e){return E(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===l||e===i||e===f||e===m||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===g||e.$$typeof===s||e.$$typeof===c||e.$$typeof===p||e.$$typeof===v||e.$$typeof===y||e.$$typeof===w||e.$$typeof===b)},t.typeOf=E},404:(e,t,n)=>{"use strict";e.exports=n(72)},311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},678:function(e,t,n){var r,o;r=function(){"use strict";Array.isArray||(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)});var e={},t={"==":function(e,t){return e==t},"===":function(e,t){return e===t},"!=":function(e,t){return e!=t},"!==":function(e,t){return e!==t},">":function(e,t){return e>t},">=":function(e,t){return e>=t},"<":function(e,t,n){return void 0===n?e=t?[]:r}};return e.is_logic=function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)&&1===Object.keys(e).length},e.truthy=function(e){return!(Array.isArray(e)&&0===e.length||!e)},e.get_operator=function(e){return Object.keys(e)[0]},e.get_values=function(t){return t[e.get_operator(t)]},e.apply=function(n,r){if(Array.isArray(n))return n.map((function(t){return e.apply(t,r)}));if(!e.is_logic(n))return n;var o,a,i,l,s,c=e.get_operator(n),u=n[c];if(Array.isArray(u)||(u=[u]),"if"===c||"?:"==c){for(o=0;o0){var d=String(c).split("."),p=t;for(o=0;o{"use strict";var r=n(925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},556:(e,t,n)=>{e.exports=n(694)()},925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},551:(e,t,n)=>{"use strict";var r=n(540),o=n(982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n