forked from M-Labs/web2019
Compare commits
51 Commits
136-downlo
...
master
Author | SHA1 | Date | |
---|---|---|---|
8fc3f3086d | |||
c92e4c5488 | |||
feda1c2942 | |||
c9190565a0 | |||
3ccbd41ef2 | |||
037cadbe6d | |||
68828c65d3 | |||
a083a4f3ab | |||
4af4e4c055 | |||
573fd4a848 | |||
3daa02c5bb | |||
7841bd804a | |||
47e8999927 | |||
ee29235b74 | |||
1efcdc11d3 | |||
5fdf5f1ea0 | |||
4ee4e5fb23 | |||
2df8078988 | |||
7220ee0e68 | |||
5856369684 | |||
a5a8589b28 | |||
bb42788fd3 | |||
f29807a913 | |||
9d9a4c9f5a | |||
92f7428ac8 | |||
a163a269b9 | |||
f087a00cee | |||
f69102fa0e | |||
0d978c1e22 | |||
76bc87ce5c | |||
3987343e16 | |||
8a12d35c06 | |||
d2ae816cb0 | |||
bcdf005896 | |||
b53e191528 | |||
52c05c2e2a | |||
c7b0d5568c | |||
68677dce6e | |||
b0ef9d07fc | |||
cedf853301 | |||
c5c723ae40 | |||
ff56f369af | |||
580dd1964c | |||
a2e672ffc9 | |||
950518ba97 | |||
c6696f5098 | |||
c63249e8a0 | |||
95304cfd61 | |||
cba6ab72c4 | |||
d3cc86dfa5 | |||
69cd11e3f1 |
15
README.md
15
README.md
@ -12,12 +12,14 @@ Clone the project:
|
|||||||
|
|
||||||
Install Zola.
|
Install Zola.
|
||||||
|
|
||||||
Start:
|
Start with targeting `m-labs.hk` domain:
|
||||||
|
|
||||||
```
|
```
|
||||||
zola serve
|
zola serve
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Environmental variable `DOMAINNAME` can be specified to [substitute links on the website](#domain-handling).
|
||||||
|
|
||||||
To build the .bundle.js from .jsx files:
|
To build the .bundle.js from .jsx files:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -25,3 +27,14 @@ To build the .bundle.js from .jsx files:
|
|||||||
npm install
|
npm install
|
||||||
npm run build
|
npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## 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`.
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
base_url = "/"
|
base_url = "https://m-labs.hk"
|
||||||
title = "M-Labs"
|
title = "M-Labs"
|
||||||
description = "Open tools for open physics."
|
description = "Open tools for open physics."
|
||||||
|
|
||||||
compile_sass = true
|
compile_sass = true
|
||||||
insert_anchor_links = true
|
|
||||||
build_search_index = false
|
build_search_index = false
|
||||||
|
|
||||||
[markdown]
|
[markdown]
|
||||||
|
@ -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.
|
* In case of any dispute, the seller is always right.
|
||||||
|
|
||||||
|
|
||||||
Contact: [sb@m-labs.hk](mailto:sb@m-labs.hk)
|
Contact: {{ email(address="sb") }}
|
||||||
|
112
content/about-us/faq.md
Normal file
112
content/about-us/faq.md
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
+++
|
||||||
|
title = "FAQ"
|
||||||
|
weight = 3
|
||||||
|
template = "page.html"
|
||||||
|
+++
|
||||||
|
|
||||||
|
##### Why are you in Hong Kong?
|
||||||
|
|
||||||
|
Low taxes, efficient infrastructure, no import/export fees and red tape for most products including high-tech items, good quality of life.
|
||||||
|
|
||||||
|
##### Why are you in Manila?
|
||||||
|
|
||||||
|
For the convenience of our customers who may be discouraged from doing business with companies registered in Hong Kong.
|
||||||
|
|
||||||
|
##### Where will my Sinara order be manufactured and where will it ship from?
|
||||||
|
|
||||||
|
M-Labs can manufacture Sinara hardware orders in Hong Kong, or, upon request, in Manila, Philippines. Additional fees, minimum quantities, and/or extended lead times may apply to orders to be made in the Philippines. Shipping is from the manufacturing place.
|
||||||
|
|
||||||
|
##### Do I need to pay additional import fees?
|
||||||
|
|
||||||
|
M-Labs ships orders according to FCA or DAP terms as defined by the International Commercial Terms (Incoterms<sup>®</sup>) published by the International Chamber of Commerce, edition 2020.
|
||||||
|
|
||||||
|
According to these terms, you are responsible for resolving problems created by customs at the destination country or territory, at your own expense.
|
||||||
|
|
||||||
|
If you are a credit customer (eligible for Net 15 or Net 30 payment), upon your request and for your convenience, we may ask UPS to deal with customs on your behalf and we will add the fees to your final invoice.
|
||||||
|
|
||||||
|
Import fees are determined by customs at the time of import in the destination country or territory, and are outside our control.
|
||||||
|
|
||||||
|
##### My institution cannot import your products. Do you have a distributor in my country?
|
||||||
|
|
||||||
|
Typical countries where this situation happens and suitable distributor contacts are as follows:
|
||||||
|
|
||||||
|
* China (mainland): kitty-zheng@kehua-trade.com
|
||||||
|
* Japan: hishida@symphotony.com or h_yamamoto@autex-inc.co.jp
|
||||||
|
* India: sale.sannidhi@gmail.com
|
||||||
|
* Thailand: info@irct.co.th or thayika@ryts-instruments.co.th
|
||||||
|
|
||||||
|
You are responsible for paying distributor fees and we do not grant discounts on the basis of requiring a distributor. On our side, we do not mandate the use of any distributor and we can ship directly to you or via another distributor of your choosing not listed here. Generally, you may solve the import problems created by customs and other bureaucracy in any way that you deem acceptable.
|
||||||
|
|
||||||
|
##### How will my order be shipped?
|
||||||
|
|
||||||
|
M-Labs ships with UPS by default, and we also offer FedEx or DHL shipping for an additional fee. We can ship on your courier account and you may also arrange your own pickup and shipping. For orders exceeding USD 200.00, there is no handling fee.
|
||||||
|
|
||||||
|
##### Can I have a discount?
|
||||||
|
|
||||||
|
M-Labs offers discounts in the following cases:
|
||||||
|
* 10% discount plus free DAP shipping if the research supported by our equipment is made public and exclusively published in a non-predatory scientific journal. A non-predatory journal is defined as an open access journal with an article processing fee of USD 650.00 or less.
|
||||||
|
* Volume discounts (applies to new orders and not retroactively, volume is determined over the 365 days prior to the new order, the new order is included in the amount compared against the threshold):
|
||||||
|
- 2% discount with an order volume exceeding USD 100,000.00.
|
||||||
|
- 4% discount with an order volume exceeding USD 250,000.00.
|
||||||
|
* Use of our equipment exclusively in jurisdictions outside the World Bank's "High Income" group, and where the R&D expenditure is less than 2% of GDP as determined by the World Bank, and which do not possess nuclear weapons.
|
||||||
|
* Equipment with cosmetic or other minor damage - please enquire.
|
||||||
|
* Advanced hobbyist and amateur use. Please describe your project when applying for the discount and provide supporting evidence (e.g. publications of past projects, personal website, copy of amateur radio license, ...).
|
||||||
|
|
||||||
|
We reserve the right of final decision regarding discount eligibility and amount.
|
||||||
|
|
||||||
|
##### I am on a really tight budget, what can I do?
|
||||||
|
|
||||||
|
You can build a useful ARTIQ system and spend very little money by running the open-source code on mass-produced low-cost electronics that were not made for this purpose. For example, in theory the [Colorlight-75E](https://hackaday.com/2020/01/24/new-part-day-led-driver-is-fpga-dev-board-in-disguise/) and [EBAZ4205](https://github.com/xjtuecho/EBAZ4205) can be used as core devices, and the Taobao shop [ZONRI](https://world.taobao.com/dianpu/73267337.htm) sells many inexpensive boards that can be useful as I/O peripherals such as DDS and data converters.
|
||||||
|
|
||||||
|
This is not a turn-key solution; experience with electronics, FPGA, and software development is required, and you will have to spend some time studying the code, porting it to these boards, writing drivers, and building hardware adapters.
|
||||||
|
|
||||||
|
See also [193THz.com](https://193THz.com) for ideas about low-cost homebrew laser systems.
|
||||||
|
|
||||||
|
##### Do you have a warranty?
|
||||||
|
|
||||||
|
For most products, we offer a 1-year warranty against manufacturing defects.
|
||||||
|
|
||||||
|
##### What should I do if I need technical support, or there is a problem with my order?
|
||||||
|
|
||||||
|
Please contact us at helpdesk@m-labs.hk.
|
||||||
|
|
||||||
|
If you have contacted the helpdesk and your issue cannot be satisfactorily resolved, then contact sb@m-labs.hk or text +852 65873703. Mention your helpdesk ticket number.
|
||||||
|
|
||||||
|
##### What are your payment terms?
|
||||||
|
|
||||||
|
For most established institutions (determined at our discretion), we offer Net 15 and Net 30 terms after delivery. Please enquire from your institutional email address to help us determine your eligibility for these terms.
|
||||||
|
|
||||||
|
For all others, payment is due 100% in advance before shipment.
|
||||||
|
|
||||||
|
Letters of credit are not an option.
|
||||||
|
|
||||||
|
##### What currency can I pay in?
|
||||||
|
|
||||||
|
We accept all major currencies including USD, EUR, RMB, GBP, BTC and XMR.
|
||||||
|
|
||||||
|
##### Can I pay by credit card?
|
||||||
|
|
||||||
|
Yes, however processing credit cards is expensive and you need to cover the costs. 4\% card processing fee applies for payment by credit card in Hong Kong dollars. 7\% card processing and exchange fee applies for payment by credit card in US dollars.
|
||||||
|
|
||||||
|
##### We are a distributor. Can we have exclusive rights to your products?
|
||||||
|
|
||||||
|
Exclusivity is subject to contractual minimum order volumes determined at our discretion, but generally exceeding USD 300,000.00 per year for most countries.
|
||||||
|
|
||||||
|
##### What is m-labs-intl.com?
|
||||||
|
|
||||||
|
[m-labs-intl.com](https://m-labs-intl.com) is a mirror site operated by us and hosted in the USA by Hetzner. It is useful in situations where your institution or local authorities block access to Hong Kong websites (.hk domains and/or Hong Kong IP addresses). To our knowledge, no internet blocking is done on the Hong Kong side other than through ISP DNS resolvers, which we do not use and which does not affect your access to our website.
|
||||||
|
|
||||||
|
Some features are currently not available on the mirror site, and you may use a VPN or another circumvention measure of your choice to access these as required.
|
||||||
|
|
||||||
|
##### Why are you ignoring my emails?
|
||||||
|
|
||||||
|
If you are using the email server of a large institution, be aware that some may silently drop emails sent to .hk email addresses and/or to servers located in Hong Kong.
|
||||||
|
|
||||||
|
Try sending your message from your personal address (for example Gmail, Outlook and Yahoo do not block our email system), or to the same email address at the m-labs-intl.com domain (for example, sales@m-labs-intl.com or sb@m-labs-intl.com).
|
||||||
|
|
||||||
|
Alternatively, you may use our [contact phone numbers](../office/), which are also registered with several popular messaging apps.
|
||||||
|
|
||||||
|
##### We are a recruitment firm. Can we help you find talent?
|
||||||
|
|
||||||
|
No.
|
||||||
|
|
@ -83,5 +83,5 @@ Now is your chance to work on top-notch science and technology projects that get
|
|||||||
|
|
||||||
|
|
||||||
{% layout_centered_content() %}
|
{% 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 %}
|
{% end %}
|
||||||
|
@ -37,7 +37,7 @@ The <a href="https://github.com/quartiq/stabilizer" target="_blank" rel="noopene
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% layout_html(css='row d-flex align-items-top mt-5 mb-5') %}
|
<div class="row d-flex align-items-top mt-5 mb-5">
|
||||||
|
|
||||||
<div class="col-12 col-md-3">
|
<div class="col-12 col-md-3">
|
||||||
<ul>
|
<ul>
|
||||||
@ -62,11 +62,11 @@ The <a href="https://github.com/quartiq/stabilizer" target="_blank" rel="noopene
|
|||||||
|
|
||||||
<div class="col-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<p>
|
<p>
|
||||||
To purchase this controller, email <a href="mailto:sales@m-labs.hk">sales@m-labs.hk</a>. 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.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% end %}
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ ARTIQ and the related components that we are developing ([Migen/MiSoC](/gateware
|
|||||||
|
|
||||||
{% layout_funding(position="center", title="Sponsors") %}
|
{% 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 %}
|
{% end %}
|
||||||
|
|
||||||
|
@ -13,25 +13,25 @@ template = "page.html"
|
|||||||
{% layout_card(title="ARTIQ manual", sameheight=100) %}
|
{% layout_card(title="ARTIQ manual", sameheight=100) %}
|
||||||
<small>Stable version</small>
|
<small>Stable version</small>
|
||||||
|
|
||||||
<a href="https://m-labs.hk/artiq/manual.pdf" target="_blank">PDF</a> | <a href="https://m-labs.hk/artiq/manual/" target="_blank" rel="noopener noreferrer">HTML</a>
|
<a href="https://m-labs.hk/artiq/manual.pdf" target="_blank" itemprop="url">PDF</a> | <a href="https://m-labs.hk/artiq/manual/" target="_blank" rel="noopener noreferrer" itemprop="url">HTML</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="SiPyCo manual", sameheight=100) %}
|
{% layout_card(title="SiPyCo manual", sameheight=100) %}
|
||||||
<small>Starting with ARTIQ-5, this library replaces <tt>artiq.protocols</tt>.</small>
|
<small>Starting with ARTIQ-5, this library replaces <tt>artiq.protocols</tt>.</small>
|
||||||
|
|
||||||
<a href="https://m-labs.hk/artiq/sipyco-manual.pdf" target="_blank">PDF</a> | <a href="https://m-labs.hk/artiq/sipyco-manual/" target="_blank" rel="noopener noreferrer">HTML</a>
|
<a href="https://m-labs.hk/artiq/sipyco-manual.pdf" target="_blank" itemprop="url">PDF</a> | <a href="https://m-labs.hk/artiq/sipyco-manual/" target="_blank" rel="noopener noreferrer" itemprop="url">HTML</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="ARTIQ manual", sameheight=100) %}
|
{% layout_card(title="ARTIQ manual", sameheight=100) %}
|
||||||
<small>Beta (development) version</small>
|
<small>Beta (development) version</small>
|
||||||
|
|
||||||
<a href="https://m-labs.hk/artiq/manual-beta.pdf" target="_blank">PDF</a> | <a href="https://m-labs.hk/artiq/manual-beta/" target="_blank" rel="noopener noreferrer">HTML</a>
|
<a href="https://m-labs.hk/artiq/manual-beta.pdf" target="_blank" itemprop="url">PDF</a> | <a href="https://m-labs.hk/artiq/manual-beta/" target="_blank" rel="noopener noreferrer" itemprop="url">HTML</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="ARTIQ manual", sameheight=100) %}
|
{% layout_card(title="ARTIQ manual", sameheight=100) %}
|
||||||
<small>Legacy version</small>
|
<small>Legacy version</small>
|
||||||
|
|
||||||
<a href="https://m-labs.hk/artiq/manual-legacy.pdf" target="_blank">PDF</a> | <a href="https://m-labs.hk/artiq/manual-legacy/" target="_blank" rel="noopener noreferrer">HTML</a>
|
<a href="https://m-labs.hk/artiq/manual-legacy.pdf" target="_blank" itemprop="url">PDF</a> | <a href="https://m-labs.hk/artiq/manual-legacy/" target="_blank" rel="noopener noreferrer" itemprop="url">HTML</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
@ -39,14 +39,14 @@ template = "page.html"
|
|||||||
{% layout_card(title="Slideshow", sameheight=100) %}
|
{% layout_card(title="Slideshow", sameheight=100) %}
|
||||||
<small>The ARTIQ experiment control system</small>
|
<small>The ARTIQ experiment control system</small>
|
||||||
|
|
||||||
<a href="/docs/artiq/artiq_overview.pdf" target="_blank" rel="noopener noreferrer">View slides</a>
|
<a href="/docs/artiq/artiq_overview.pdf" target="_blank" rel="noopener noreferrer" itemprop="url">View slides</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(title="Slideshow", sameheight=100) %}
|
{% layout_card(title="Slideshow", sameheight=100) %}
|
||||||
<small>Timing control in ARTIQ</small>
|
<small>Timing control in ARTIQ</small>
|
||||||
|
|
||||||
<a href="/docs/artiq/slides_timing.pdf" target="_blank" rel="noopener noreferrer">View slides</a>
|
<a href="/docs/artiq/slides_timing.pdf" target="_blank" rel="noopener noreferrer" itemprop="url">View slides</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -64,40 +64,40 @@ template = "page.html"
|
|||||||
<div class="row mt-5">
|
<div class="row mt-5">
|
||||||
|
|
||||||
{% layout_card(src="images/mattermost@2x.png", css="col-12 col-md-4 text-center") %}
|
{% layout_card(src="images/mattermost@2x.png", css="col-12 col-md-4 text-center") %}
|
||||||
<a href="http://chat.m-labs.hk/" target="_blank" rel="noopener noreferrer">Mattermost live chat</a>
|
<a href="http://chat.m-labs.hk/" target="_blank" rel="noopener noreferrer" itemprop="url">Mattermost live chat</a>
|
||||||
|
|
||||||
<small>(bridged to IRC)</small>
|
<small>(bridged to IRC)</small>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(src="images/forum@2x.png", css="col-12 col-md-4 text-center") %}
|
{% layout_card(src="images/forum@2x.png", css="col-12 col-md-4 text-center") %}
|
||||||
<a href="https://forum.m-labs.hk/" target="_blank" rel="noopener noreferrer">Forum</a>
|
<a href="https://forum.m-labs.hk/" target="_blank" rel="noopener noreferrer" itemprop="url">Forum</a>
|
||||||
|
|
||||||
<small> </small>
|
<small> </small>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(src="images/irc@2x.png", css="col-12 col-md-4 text-center") %}
|
{% layout_card(src="images/irc@2x.png", css="col-12 col-md-4 text-center") %}
|
||||||
<a href="https://webchat.oftc.net/" target="_blank" rel="noopener noreferrer">IRC: #m-labs</a>
|
<a href="https://webchat.oftc.net/" target="_blank" rel="noopener noreferrer" itemprop="url">IRC: #m-labs</a>
|
||||||
|
|
||||||
<small>on OFTC</small>
|
<small>on OFTC</small>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(src="images/press@2x.png", css="col-12 col-md-4 text-center") %}
|
{% layout_card(src="images/press@2x.png", css="col-12 col-md-4 text-center") %}
|
||||||
<a href="https://www.nist.gov/news-events/news/2015/01/open-source-software-quantum-information" target="_blank" rel="noopener noreferrer">NIST ARTIQ press release</a>
|
<a href="https://www.nist.gov/news-events/news/2015/01/open-source-software-quantum-information" target="_blank" rel="noopener noreferrer" itemprop="url">NIST ARTIQ press release</a>
|
||||||
|
|
||||||
<small> </small>
|
<small> </small>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(src="images/git@2x.png", css="col-12 col-md-4 text-center") %}
|
{% layout_card(src="images/git@2x.png", css="col-12 col-md-4 text-center") %}
|
||||||
<a href="https://github.com/m-labs/artiq" target="_blank" rel="noopener noreferrer">ARTIQ source code repository</a>
|
<a href="https://github.com/m-labs/artiq" target="_blank" rel="noopener noreferrer" itemprop="url">ARTIQ source code repository</a>
|
||||||
|
|
||||||
<small>on GitHub</small>
|
<small>on GitHub</small>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(src="images/git@2x.png", css="col-12 col-md-4 text-center") %}
|
{% layout_card(src="images/git@2x.png", css="col-12 col-md-4 text-center") %}
|
||||||
<a href="https://git.m-labs.hk" target="_blank" rel="noopener noreferrer">Gitea</a>
|
<a href="https://git.m-labs.hk" target="_blank" rel="noopener noreferrer" itemprop="url">Gitea</a>
|
||||||
|
|
||||||
<small> </small>
|
<small> </small>
|
||||||
{% end %}
|
{% end %}
|
||||||
@ -114,7 +114,7 @@ template = "page.html"
|
|||||||
|
|
||||||
**Sinara hardware purchases, ports to your hardware, feature development, technical support, bugfixing**
|
**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.<br>[See what has been funded before](/experiment-control/funding)
|
We welcome inquiries from research groups of all sizes.<br>[See what has been funded before](/experiment-control/funding)
|
||||||
|
|
||||||
@ -129,114 +129,113 @@ We welcome inquiries from research groups of all sizes.<br>[See what has been fu
|
|||||||
{% layout_card(title="Entangler core", sameheight=120) %}
|
{% layout_card(title="Entangler core", sameheight=120) %}
|
||||||
<small>A FPGA core written in Migen with ARTIQ interface, for controlling remote quantum entanglement of trapped ions.</small>
|
<small>A FPGA core written in Migen with ARTIQ interface, for controlling remote quantum entanglement of trapped ions.</small>
|
||||||
|
|
||||||
<a href="https://github.com/OxfordIonTrapGroup/entangler-core" target="_blank" rel="noopener noreferrer">Repository</a> | <a href="https://arxiv.org/abs/1911.10841" target="_blank" rel="noopener noreferrer">Paper</a>
|
<a href="https://github.com/OxfordIonTrapGroup/entangler-core" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a> | <a href="https://arxiv.org/abs/1911.10841" target="_blank" rel="noopener noreferrer" itemprop="url">Paper</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(title="ndscan", sameheight=120) %}
|
{% layout_card(title="ndscan", sameheight=120) %}
|
||||||
<small>N-dimensional scans for ARTIQ</small>
|
<small>N-dimensional scans for ARTIQ</small>
|
||||||
|
|
||||||
<a href="https://github.com/OxfordIonTrapGroup/ndscan" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/OxfordIonTrapGroup/ndscan" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(title="Oxford routines", sameheight=120) %}
|
{% layout_card(title="Oxford routines", sameheight=120) %}
|
||||||
<small>Oxford Ion-Trap Group routines</small>
|
<small>Oxford Ion-Trap Group routines</small>
|
||||||
|
|
||||||
<a href="https://github.com/OxfordIonTrapGroup/oitg" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/OxfordIonTrapGroup/oitg" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="UCLA routines", sameheight=120) %}
|
{% layout_card(title="UCLA routines", sameheight=120) %}
|
||||||
<small>ARTIQ experiments in use at UCLA AMO</small>
|
<small>ARTIQ experiments in use at UCLA AMO</small>
|
||||||
|
|
||||||
<a href="https://github.com/EGGS-Experiment/LAX_exp" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/EGGS-Experiment/LAX_exp" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="nvOS", sameheight=120) %}
|
{% layout_card(title="nvOS", sameheight=120) %}
|
||||||
<small>A quantum operating system built around ARTIQ and NV centers in diamond.</small>
|
<small>A quantum operating system built around ARTIQ and NV centers in diamond.</small>
|
||||||
|
|
||||||
<a href="https://github.com/vontell/nvOS" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/vontell/nvOS" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="Haeffner Lab routines", sameheight=120) %}
|
{% layout_card(title="Haeffner Lab routines", sameheight=120) %}
|
||||||
<small>Haeffner Lab (Berkeley) routines</small>
|
<small>Haeffner Lab (Berkeley) routines</small>
|
||||||
|
|
||||||
<a href="https://github.com/HaeffnerLab/artiq-work-lattice" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/HaeffnerLab/artiq-work-lattice" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="Birmingham examples", sameheight=120) %}
|
{% layout_card(title="Birmingham examples", sameheight=120) %}
|
||||||
<small>A repository of simple examples of ARTIQ code</small>
|
<small>A repository of simple examples of ARTIQ code</small>
|
||||||
|
|
||||||
<a href="https://github.com/cnourshargh/Bham-ARTIQ-examples" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/cnourshargh/Bham-ARTIQ-examples" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(title="Deltaflow-on-ARTIQ", sameheight=120) %}
|
|
||||||
<small>Run programs in the Deltaflow language from Riverlane on simulated ARTIQ</small>
|
|
||||||
|
|
||||||
<a href="https://github.com/riverlane/deltaflow-on-artiq" target="_blank" rel="noopener noreferrer">Repository</a>
|
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="DAX - Duke ARTIQ extensions", sameheight=120) %}
|
{% layout_card(title="DAX - Duke ARTIQ extensions", sameheight=120) %}
|
||||||
<small>A library to provide tools for system organization/abstraction and to improve usability by automating common functionality.</small>
|
<small>A library to provide tools for system organization/abstraction and to improve usability by automating common functionality.</small>
|
||||||
|
|
||||||
<a href="https://gitlab.com/duke-artiq" target="_blank" rel="noopener noreferrer">Repositories</a>
|
<a href="https://gitlab.com/duke-artiq" target="_blank" rel="noopener noreferrer" itemprop="url">Repositories</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(title="Argent", sameheight=120) %}
|
{% layout_card(title="Argent", sameheight=120) %}
|
||||||
<small>High-level sequence control interface for ARTIQ.</small>
|
<small>High-level sequence control interface for ARTIQ.</small>
|
||||||
|
|
||||||
<a href="https://github.com/robertfasano/argent" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/robertfasano/argent" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="flake8-artiq", sameheight=120) %}
|
{% layout_card(title="flake8-artiq", sameheight=120) %}
|
||||||
<small>A Flake8 plugin for checking ARTIQ code</small>
|
<small>A Flake8 plugin for checking ARTIQ code</small>
|
||||||
|
|
||||||
<a href="https://gitlab.com/duke-artiq/flake8-artiq" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://gitlab.com/duke-artiq/flake8-artiq" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="GenericSCPIDriver", sameheight=120) %}
|
{% layout_card(title="GenericSCPIDriver", sameheight=120) %}
|
||||||
<small>A generic Python driver for SCPI devices driven over serial connections. Compatible with ARTIQ.</small>
|
<small>A generic Python driver for SCPI devices driven over serial connections. Compatible with ARTIQ.</small>
|
||||||
|
|
||||||
<a href="https://github.com/charlesbaynham/GenericSCPIDriver" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/charlesbaynham/GenericSCPIDriver" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="artiq_influx_generic", sameheight=120) %}
|
{% layout_card(title="artiq_influx_generic", sameheight=120) %}
|
||||||
<small>RPC interface to InfluxDB with support for generic data logging.</small>
|
<small>RPC interface to InfluxDB with support for generic data logging.</small>
|
||||||
|
|
||||||
<a href="https://gitlab.com/charlesbaynham/artiq_influx_generic" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://gitlab.com/charlesbaynham/artiq_influx_generic" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="DP700", sameheight=120) %}
|
{% layout_card(title="DP700", sameheight=120) %}
|
||||||
<small>ARTIQ NDSP for RIGOL DP700 Series power supplies.</small>
|
<small>ARTIQ NDSP for RIGOL DP700 Series power supplies.</small>
|
||||||
|
|
||||||
<a href="https://github.com/OregonIons/DP700" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/OregonIons/DP700" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_card(title="AGUC8", sameheight=120) %}
|
{% layout_card(title="AGUC8", sameheight=120) %}
|
||||||
<small>ARTIQ NDSP for Newport AG-UC8 piezo motor controller.</small>
|
<small>ARTIQ NDSP for Newport AG-UC8 piezo motor controller.</small>
|
||||||
|
|
||||||
<a href="https://github.com/OregonIons/AGUC8" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/OregonIons/AGUC8" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(title="TSICam", sameheight=120) %}
|
{% layout_card(title="TSICam", sameheight=120) %}
|
||||||
<small>ARTIQ NDSP for Thorlabs Scientific Imaging cameras.</small>
|
<small>ARTIQ NDSP for Thorlabs Scientific Imaging cameras.</small>
|
||||||
|
|
||||||
<a href="https://github.com/OregonIons/TSICam" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/OregonIons/TSICam" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
{% layout_card(title="U Toronto examples", sameheight=120) %}
|
{% layout_card(title="U Toronto examples", sameheight=120) %}
|
||||||
<small>A repository of examples of ARTIQ code and instructions</small>
|
<small>A repository of examples of ARTIQ code and instructions</small>
|
||||||
|
|
||||||
<a href="https://github.com/vuthalab/artiq" target="_blank" rel="noopener noreferrer">Repository</a>
|
<a href="https://github.com/vuthalab/artiq" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
|
{% end %}
|
||||||
|
|
||||||
|
{% layout_card(title="OffsetStabilizer", sameheight=120) %}
|
||||||
|
<small>Stabilizer firmware for laser frequency offset stabilization</small>
|
||||||
|
|
||||||
|
<a href="https://github.com/PhBrb/OffsetStabilizer" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% layout_div(css="col-12 text-center") %}
|
{% 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 %}
|
{% end %}
|
||||||
|
@ -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 <a href="https://github.com/sinara-hw" target="_blank" rel="noopener noreferrer">on the wiki of each project's page</a>. Most of the hardware engineering is done at the <a href="https://www.ise.pw.edu.pl/" target="_blank" rel="noopener noreferrer">Institute for Electronics Systems</a> at the Warsaw University of Technology.
|
The Sinara hardware is in active development, and the latest information is available <a href="https://github.com/sinara-hw" target="_blank" rel="noopener noreferrer">on the wiki of each project's page</a>. Most of the hardware engineering is done at the <a href="https://www.ise.pw.edu.pl/" target="_blank" rel="noopener noreferrer">Institute for Electronics Systems</a> 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 <a href="mailto:sales@m-labs.hk">sales@m-labs.hk</a> 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 %}
|
{% end %}
|
||||||
|
|
||||||
@ -28,6 +28,10 @@ One of the main devices in the Sinara family is the 1124 Carrier (codenamed Kasl
|
|||||||
|
|
||||||
<a href="https://github.com/sinara-hw/Kasli/wiki" target="_blank" rel="noopener noreferrer">More information</a>
|
<a href="https://github.com/sinara-hw/Kasli/wiki" target="_blank" rel="noopener noreferrer">More information</a>
|
||||||
|
|
||||||
|
<p style="padding-top: 8px">
|
||||||
|
<span class='doc-icon'></span> <a href="/docs/sinara-datasheets/1124.pdf" target="_blank" rel="noopener noreferrer">1124 Carrier Kasli 2.0 datasheet</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_text_img(src="images/kasli-soc@2x.png", popup="images/origin/kasli-soc.jpg", alt="", textleft=true, shadow=false) %}
|
{% layout_text_img(src="images/kasli-soc@2x.png", popup="images/origin/kasli-soc.jpg", alt="", textleft=true, shadow=false) %}
|
||||||
@ -40,6 +44,10 @@ See our paper <a href="https://arxiv.org/abs/2111.15290" target="_blank" rel="no
|
|||||||
|
|
||||||
<a href="https://github.com/sinara-hw/Kasli-SoC/wiki" target="_blank" rel="noopener noreferrer">More information</a>
|
<a href="https://github.com/sinara-hw/Kasli-SoC/wiki" target="_blank" rel="noopener noreferrer">More information</a>
|
||||||
|
|
||||||
|
<p style="padding-top: 8px">
|
||||||
|
<span class='doc-icon'></span> <a href="/docs/sinara-datasheets/1125.pdf" target="_blank" rel="noopener noreferrer">1125 Carrier Kasli SoC datasheet</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
{% layout_text_img(src="images/isolated-ttl@2x.png", popup="images/origin/dio.jpg", alt="", shadow=false) %}
|
{% layout_text_img(src="images/isolated-ttl@2x.png", popup="images/origin/dio.jpg", alt="", shadow=false) %}
|
||||||
@ -167,6 +175,11 @@ Comparing Mirny to Urukul:
|
|||||||
|
|
||||||
<a href="https://github.com/sinara-hw/mirny/wiki" target="_blank" rel="noopener noreferrer">More information</a>
|
<a href="https://github.com/sinara-hw/mirny/wiki" target="_blank" rel="noopener noreferrer">More information</a>
|
||||||
|
|
||||||
|
<p style="padding-top: 8px">
|
||||||
|
<span class='doc-icon'></span> <a href="/docs/sinara-datasheets/4456.pdf" target="_blank" rel="noopener noreferrer">4456 Synthesizer Mirny datasheet</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
@ -233,6 +246,11 @@ In SU-Servo mode, the 5108 Sampler can be used in combination with the 4410 DDS
|
|||||||
|
|
||||||
Note that update rate specification on this page is for the hardware only; ARTIQ kernel and RTIO overhead make the effective sample rate lower. Typically, only with gateware (e.g. SU-Servo) can the maximum bandwidth be achieved. SU-Servo is part of the regular ARTIQ firmware; development of other gateware can be purchased separately.
|
Note that update rate specification on this page is for the hardware only; ARTIQ kernel and RTIO overhead make the effective sample rate lower. Typically, only with gateware (e.g. SU-Servo) can the maximum bandwidth be achieved. SU-Servo is part of the regular ARTIQ firmware; development of other gateware can be purchased separately.
|
||||||
|
|
||||||
|
<p style="padding-top: 8px">
|
||||||
|
<span class='doc-icon'></span> <a href="/docs/sinara-datasheets/5108.pdf" target="_blank" rel="noopener noreferrer">5108 ADC Sampler datasheet</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
@ -259,6 +277,11 @@ The Sinara 7210 is a low-noise clock distribution module that can be used to dis
|
|||||||
|
|
||||||
<a href="https://github.com/sinara-hw/Clocker/wiki" target="_blank" rel="noopener noreferrer">More information</a>
|
<a href="https://github.com/sinara-hw/Clocker/wiki" target="_blank" rel="noopener noreferrer">More information</a>
|
||||||
|
|
||||||
|
<p style="padding-top: 8px">
|
||||||
|
<span class='doc-icon'></span> <a href="/docs/sinara-datasheets/7210.pdf" target="_blank" rel="noopener noreferrer">7210 Clocker datasheet</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
|
|
||||||
@ -270,6 +293,7 @@ The 4624 AWG "Phaser" is a quad channel 1.25 GS/s RF generator card with dual IQ
|
|||||||
|
|
||||||
- 2x 1.25 GS/s IQ upconverters.
|
- 2x 1.25 GS/s IQ upconverters.
|
||||||
- dual IQ mixer + 0.3 GHz to 4.8 GHz VCO + PLL.
|
- dual IQ mixer + 0.3 GHz to 4.8 GHz VCO + PLL.
|
||||||
|
- up to 16 dynamic tones per channel using <a href="https://github.com/quartiq/miqro-sim" target="_blank" rel="noopener noreferrer">MIQRO gateware</a> (available separately from QUARTIQ).
|
||||||
- 31.5 dB range digital step attenuator (similar to Urukul).
|
- 31.5 dB range digital step attenuator (similar to Urukul).
|
||||||
- 2 channels of 5 MS/s ADC (similar to Sampler).
|
- 2 channels of 5 MS/s ADC (similar to Sampler).
|
||||||
- Artix-7 FPGA.
|
- Artix-7 FPGA.
|
||||||
@ -297,7 +321,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.
|
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 <a href="mailto:sales@m-labs.hk">sales@m-labs.hk</a> 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 %}
|
{% end %}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ Built on the <a href="/gateware/migen/">MiSoC and Migen</a> 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.
|
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.
|
||||||
|
|
||||||
<b>Status (Aug 2014)</b> - Main board and gateware have been <a href="/images/mixxeo_result.jpg">mostly functional</a> 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.
|
<b>Status (Aug 2014)</b> - Main board and gateware have been <a href="/images/mixxeo_result.jpg">mostly functional</a> 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.
|
||||||
|
|
||||||
<center><img src="/images/mixxeo_menu.png"><br /><br /><img src="/images/mixxeo_board.jpg" class="picimg"></center>
|
<center><img src="/images/mixxeo_menu.png"><br /><br /><img src="/images/mixxeo_board.jpg" class="picimg"></center>
|
||||||
|
|
||||||
|
@ -26,6 +26,6 @@ smoltcp achieves <a href="https://github.com/smoltcp-rs/smoltcp#examplesbenchmar
|
|||||||
|
|
||||||
The source code is available <a href="https://github.com/smoltcp-rs/smoltcp" rel="noopener noreferrer">on GitHub</a>.
|
The source code is available <a href="https://github.com/smoltcp-rs/smoltcp" rel="noopener noreferrer">on GitHub</a>.
|
||||||
|
|
||||||
**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 %}
|
{% end %}
|
||||||
|
2763
package-lock.json
generated
2763
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
57
package.json
57
package.json
@ -6,45 +6,52 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
"start": "npx webpack --watch",
|
"start": "npx webpack --watch",
|
||||||
"build": "npx webpack"
|
"build": "npx webpack",
|
||||||
|
"start-dev": "npx webpack --watch --mode=development --devtool=inline-source-map",
|
||||||
|
"build-dev": "npx webpack --mode=development --devtool=inline-source-map",
|
||||||
|
"optimize-bootstrap": "zola build -o tmp_out && npx purgecss --css static/css/bootstrap-5.3.0.min.css --content 'tmp_out/**/*.html' -o static/css/bootstrap-5.3.0.opt.css --safelist modal-backdrop && rm -rf tmp_out"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.m-labs.hk/M-Labs/web2019.git"
|
"url": "https://git.m-labs.hk/M-Labs/web2019.git"
|
||||||
},
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@hello-pangea/dnd": "^16.6.0",
|
||||||
|
"bootstrap": "^5.3.3",
|
||||||
|
"json-logic-js": "^2.0.5",
|
||||||
|
"react": "^18.3.1",
|
||||||
|
"react-bootstrap": "^2.10.4",
|
||||||
|
"uuid": "^9.0.1",
|
||||||
|
"zustand": "^4.5.4"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/cli": "^7.23.9",
|
"@babel/cli": "^7.24.8",
|
||||||
"@babel/core": "^7.24.0",
|
"@babel/core": "^7.25.2",
|
||||||
"@babel/preset-env": "^7.24.0",
|
"@babel/preset-env": "^7.25.3",
|
||||||
"@babel/preset-react": "^7.23.3",
|
"@babel/preset-react": "^7.24.7",
|
||||||
|
"@uidotdev/usehooks": "^2.4.1",
|
||||||
"babel-loader": "^9.1.3",
|
"babel-loader": "^9.1.3",
|
||||||
"babel-preset-minify": "^0.5.2",
|
"babel-preset-minify": "^0.5.2",
|
||||||
"bootstrap": "^5.3.3",
|
"webpack": "^5.93.0",
|
||||||
"jquery": "^3.7.1",
|
|
||||||
"react": "^18.2.0",
|
|
||||||
"react-bootstrap": "^2.10.2",
|
|
||||||
"@hello-pangea/dnd": "^16.5.0",
|
|
||||||
"react-dom": "^18.2.0",
|
|
||||||
"uuid": "^9.0.1",
|
|
||||||
"webpack": "^5.90.3",
|
|
||||||
"webpack-cli": "^5.1.4",
|
"webpack-cli": "^5.1.4",
|
||||||
"json-logic-js": "^2.0.2",
|
"webpack-preprocessor-loader": "^1.3.0",
|
||||||
"zustand": "^4.5.2",
|
"purgecss": "^7.0.2"
|
||||||
"@uidotdev/usehooks":"^2.4.1",
|
|
||||||
"webpack-preprocessor-loader": "^1.3.0"
|
|
||||||
},
|
},
|
||||||
"babel": {
|
"babel": {
|
||||||
"presets": [
|
"presets": [
|
||||||
"@babel/preset-react",
|
"@babel/preset-react",
|
||||||
["@babel/preset-env", {
|
[
|
||||||
"targets": {
|
"@babel/preset-env",
|
||||||
"browsers": [
|
{
|
||||||
">0.25%",
|
"targets": {
|
||||||
"not dead",
|
"browsers": [
|
||||||
"not op_mini all"
|
">0.25%",
|
||||||
]
|
"not dead",
|
||||||
|
"not op_mini all"
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -90,28 +90,52 @@ a {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar-light .navbar-nav .nav-link,
|
.navbar {
|
||||||
.dropdown-item {
|
.navbar-light .navbar-nav .nav-link,
|
||||||
outline: none;
|
.dropdown-item {
|
||||||
color: $color-primary;
|
outline: none;
|
||||||
text-decoration: none;
|
|
||||||
|
|
||||||
&:visited {
|
|
||||||
color: $color-primary;
|
color: $color-primary;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:visited {
|
||||||
|
color: $color-primary;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $color-secondary;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
.navbar-light .navbar-nav .active>.nav-link,
|
||||||
|
.navbar-light .navbar-nav .nav-link.active,
|
||||||
|
.navbar-light .navbar-nav .nav-link.show,
|
||||||
|
.navbar-light .navbar-nav .show>.nav-link {
|
||||||
color: $color-secondary;
|
color: $color-secondary;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-light .navbar-nav .active>.nav-link,
|
.dropdown-menu {
|
||||||
.navbar-light .navbar-nav .nav-link.active,
|
border: none;
|
||||||
.navbar-light .navbar-nav .nav-link.show,
|
}
|
||||||
.navbar-light .navbar-nav .show>.nav-link {
|
.dropdown-item {
|
||||||
color: $color-secondary;
|
&:hover,
|
||||||
}
|
&:active {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.dropdown-item.active {
|
||||||
|
color: $color-secondary;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-toggler {
|
||||||
|
outline: none;
|
||||||
|
|
||||||
|
&:focus,
|
||||||
|
&:hover {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -127,22 +151,6 @@ a {
|
|||||||
border: 1px solid transparent;
|
border: 1px solid transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown-menu {
|
|
||||||
border: none;
|
|
||||||
margin-top: 0;
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
.dropdown-item {
|
|
||||||
&:hover,
|
|
||||||
&:active {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.dropdown-item.active {
|
|
||||||
color: $color-secondary;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-primary {
|
.btn-primary {
|
||||||
background-color: $btn-primary-2;
|
background-color: $btn-primary-2;
|
||||||
color: #fff !important;
|
color: #fff !important;
|
||||||
@ -155,18 +163,11 @@ a {
|
|||||||
border: 1px solid $btn-secondary-2 !important;
|
border: 1px solid $btn-secondary-2 !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-lg {
|
.btn-lg {
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
padding: 1rem 1.25rem;
|
padding: 1rem 1.25rem;
|
||||||
}
|
}
|
||||||
.navbar-toggler {
|
|
||||||
outline: none;
|
|
||||||
|
|
||||||
&:focus,
|
|
||||||
&:hover {
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.th {
|
ul.th {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
@ -200,6 +201,63 @@ ul:not(.navbar-nav) li {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.download-selector {
|
||||||
|
display: inline-flex;
|
||||||
|
|
||||||
|
.divider {
|
||||||
|
border-right: solid 1px white;
|
||||||
|
margin: 0.125rem 0;
|
||||||
|
height: inherit;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-menu {
|
||||||
|
border: none;
|
||||||
|
margin-top: 0;
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
background-color: $btn-primary-2;
|
||||||
|
&:hover {
|
||||||
|
background-color: $btn-secondary-2;
|
||||||
|
}
|
||||||
|
&:after {
|
||||||
|
align-self: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
&[aria-expanded='true']:after {
|
||||||
|
transform: rotate(-180deg);
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
margin-left: 0!important;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
a {
|
||||||
|
padding: 0.75rem 0.5rem 0.75rem 1.25rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
li::before {
|
||||||
|
content: none;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.bg-white-shadow {
|
.bg-white-shadow {
|
||||||
background: url(../images/migen-links@2x.png);
|
background: url(../images/migen-links@2x.png);
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
|
@ -107,10 +107,14 @@ h3, h2, h1 {
|
|||||||
padding: .4rem; }
|
padding: .4rem; }
|
||||||
|
|
||||||
|
|
||||||
p ~ h5 {
|
p ~ h5, div.desc-wrapper ~ h5 {
|
||||||
margin-top: 3rem;
|
margin-top: 3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.desc-wrapper {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
img.kf25 {
|
img.kf25 {
|
||||||
width: 310px;
|
width: 310px;
|
||||||
}
|
}
|
||||||
|
@ -186,6 +186,13 @@ button {
|
|||||||
.catalog-container {
|
.catalog-container {
|
||||||
padding-bottom: 4rem;
|
padding-bottom: 4rem;
|
||||||
|
|
||||||
|
.no-results {
|
||||||
|
color: rgba(255, 255, 255, 0.58);
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0rem 1.5rem;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
.catalog-bar {
|
.catalog-bar {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
5
static/css/bootstrap-5.3.0.opt.css
vendored
Normal file
5
static/css/bootstrap-5.3.0.opt.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
static/docs/sinara-datasheets/1124.pdf
Normal file
BIN
static/docs/sinara-datasheets/1124.pdf
Normal file
Binary file not shown.
BIN
static/docs/sinara-datasheets/1125.pdf
Normal file
BIN
static/docs/sinara-datasheets/1125.pdf
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
static/docs/sinara-datasheets/4456.pdf
Normal file
BIN
static/docs/sinara-datasheets/4456.pdf
Normal file
Binary file not shown.
BIN
static/docs/sinara-datasheets/5108.pdf
Normal file
BIN
static/docs/sinara-datasheets/5108.pdf
Normal file
Binary file not shown.
Binary file not shown.
BIN
static/docs/sinara-datasheets/5518-5528.pdf
Normal file
BIN
static/docs/sinara-datasheets/5518-5528.pdf
Normal file
Binary file not shown.
BIN
static/docs/sinara-datasheets/5568.pdf
Normal file
BIN
static/docs/sinara-datasheets/5568.pdf
Normal file
Binary file not shown.
BIN
static/docs/sinara-datasheets/7210.pdf
Normal file
BIN
static/docs/sinara-datasheets/7210.pdf
Normal file
Binary file not shown.
1
static/images/icons/icon-windows.svg
Normal file
1
static/images/icons/icon-windows.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="48" height="48" version="1.1" viewBox="0 0 12.7 12.7" xmlns="http://www.w3.org/2000/svg"><g fill="#fff" stroke-linecap="round" stroke-opacity=".6" stroke-width=".35269"><path d="m0.52917 0.52917h5.5563v5.5563h-5.5563z"/><path d="m6.6146 0.52917h5.5563v5.5563h-5.5563z"/><path d="m0.52917 6.6146h5.5563v5.5563h-5.5563z"/><path d="m6.6146 6.6146h5.5563v5.5563h-5.5563z"/></g></svg>
|
After Width: | Height: | Size: 392 B |
3
static/images/shop/graphic-03_Fast-Servo.svg
Normal file
3
static/images/shop/graphic-03_Fast-Servo.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 46 KiB |
3
static/images/shop/graphic-03_HVAMP32.svg
Normal file
3
static/images/shop/graphic-03_HVAMP32.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 31 KiB |
3
static/images/shop/graphic-03_Kirdy.svg
Normal file
3
static/images/shop/graphic-03_Kirdy.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 33 KiB |
2
static/images/shop/graphic-03_MCX-IDC32.svg
Normal file
2
static/images/shop/graphic-03_MCX-IDC32.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 117 KiB |
5
static/images/shop/graphic-03_Thermostat2ch.svg
Normal file
5
static/images/shop/graphic-03_Thermostat2ch.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 35 KiB |
@ -1,32 +0,0 @@
|
|||||||
(function () {
|
|
||||||
|
|
||||||
var swRegistration;
|
|
||||||
var newWorker;
|
|
||||||
var isRefreshing = false;
|
|
||||||
var pathname = window.location.pathname;
|
|
||||||
var deferredPrompt;
|
|
||||||
|
|
||||||
if ('serviceWorker' in navigator) {
|
|
||||||
console.info('Service Worker is supported');
|
|
||||||
|
|
||||||
window.addEventListener('load', function () {
|
|
||||||
navigator.serviceWorker.register('/sw.js', {
|
|
||||||
updateViaCache: 'all',
|
|
||||||
}).then(function (registration) {
|
|
||||||
swRegistration = registration;
|
|
||||||
console.log('[SW] registration successful with scope: ', swRegistration.scope);
|
|
||||||
console.log('[SW] is waiting: ', swRegistration.waiting);
|
|
||||||
|
|
||||||
navigator.serviceWorker.addEventListener('controllerchange', function () {
|
|
||||||
if (isRefreshing) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
window.location.reload();
|
|
||||||
isRefreshing = true;
|
|
||||||
});
|
|
||||||
}, function (err) {
|
|
||||||
console.log('[SW] registration failed: ', err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})();
|
|
2
static/js/jquery-3.7.0.min.js
vendored
2
static/js/jquery-3.7.0.min.js
vendored
File diff suppressed because one or more lines are too long
2
static/js/jquery-3.7.0.slim.min.js
vendored
2
static/js/jquery-3.7.0.slim.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -20,7 +20,8 @@ export function Catalog() {
|
|||||||
|
|
||||||
const onClickToggleMobileSideMenu = useShopStore((state) => state.switchSideMenu);
|
const onClickToggleMobileSideMenu = useShopStore((state) => state.switchSideMenu);
|
||||||
const isMobile = useShopStore((state) => state.isMobile);
|
const isMobile = useShopStore((state) => state.isMobile);
|
||||||
const showSearch = useShopStore((state) => state.listed_cards.length > 0);
|
const showSearch = useShopStore((state) => state.listed_cards.length > 0 && state.search_bar_value.length > 0);
|
||||||
|
const noResults = useShopStore((state) => state.listed_cards.length === 0 && state.search_bar_value.length > 0);
|
||||||
|
|
||||||
// #!render_count
|
// #!render_count
|
||||||
console.log("Catalog renders: ", renderCount)
|
console.log("Catalog renders: ", renderCount)
|
||||||
@ -36,8 +37,6 @@ export function Catalog() {
|
|||||||
ref={provided.innerRef}
|
ref={provided.innerRef}
|
||||||
{...provided.droppableProps}>
|
{...provided.droppableProps}>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div className="catalog-bar">
|
<div className="catalog-bar">
|
||||||
<SearchBar/>
|
<SearchBar/>
|
||||||
|
|
||||||
@ -50,7 +49,9 @@ export function Catalog() {
|
|||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{showSearch ? <CatalogSearchResult/> : <CatalogGroups/>}
|
{(showSearch && <CatalogSearchResult/>) ||
|
||||||
|
(noResults && <p className="no-results">No results</p>) ||
|
||||||
|
<CatalogGroups/>}
|
||||||
|
|
||||||
{provided.placeholder && (
|
{provided.placeholder && (
|
||||||
<div style={{display: 'none'}}>
|
<div style={{display: 'none'}}>
|
||||||
|
13
static/js/shop/Domained.jsx
Normal file
13
static/js/shop/Domained.jsx
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import React from "react";
|
||||||
|
import {DOMAIN} from "./utils";
|
||||||
|
|
||||||
|
|
||||||
|
export function DomainedEmail({address}) {
|
||||||
|
const target = `${address}@${DOMAIN}`;
|
||||||
|
return <a href={"mailto:" + target}>{target}</a>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const DomainedRFQMessages = {
|
||||||
|
OK: <>We've received your request and will be in contact soon.</>,
|
||||||
|
ERROR: <>We cannot receive your request. Try using the export by coping the configuration and send it to us at <DomainedEmail address="sales"/></>
|
||||||
|
}
|
@ -6,9 +6,33 @@ import {useShopStore} from "./shop_store";
|
|||||||
// #!render_count
|
// #!render_count
|
||||||
import {useRenderCount} from "@uidotdev/usehooks";
|
import {useRenderCount} from "@uidotdev/usehooks";
|
||||||
|
|
||||||
|
|
||||||
|
function DatasheetLink({datasheet_file, datasheet_name}) {
|
||||||
|
return datasheet_file && datasheet_name && (<div className="ds">
|
||||||
|
<span className='doc-icon'></span>
|
||||||
|
<a href={datasheet_file} target="_blank" rel="noopener noreferrer">
|
||||||
|
{datasheet_name}
|
||||||
|
</a>
|
||||||
|
</div>)
|
||||||
|
}
|
||||||
|
|
||||||
|
function CardSpecs({specs}) {
|
||||||
|
return specs && specs.length > 0 && (<ul>
|
||||||
|
{specs.map((spec, index) =>
|
||||||
|
<li key={index}>{spec}</li>
|
||||||
|
)}
|
||||||
|
</ul>)
|
||||||
|
}
|
||||||
|
|
||||||
|
function AddButton({onAdd}) {
|
||||||
|
return <button onClick={onAdd}>
|
||||||
|
<img src="/images/shop/icon-add.svg" alt="add"/>
|
||||||
|
</button>
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component that renders a product.
|
* Component that renders a product.
|
||||||
* Used in the aside (e.g catalog of product)
|
* Used in the aside (e.g catalog of products)
|
||||||
*/
|
*/
|
||||||
export function ProductItem({card_index}) {
|
export function ProductItem({card_index}) {
|
||||||
// #!render_count
|
// #!render_count
|
||||||
@ -16,33 +40,14 @@ export function ProductItem({card_index}) {
|
|||||||
|
|
||||||
const getCardDescription = useShopStore((state) => state.getCardDescription);
|
const getCardDescription = useShopStore((state) => state.getCardDescription);
|
||||||
const currency = useShopStore((state) => state.currency);
|
const currency = useShopStore((state) => state.currency);
|
||||||
const onAddCard = useShopStore((state) => state.addCardFromCatalog);
|
const addCardFromCatalog = useShopStore((state) => state.addCardFromCatalog);
|
||||||
const card = getCardDescription(card_index);
|
const card = getCardDescription(card_index);
|
||||||
|
|
||||||
// #!render_count
|
// #!render_count
|
||||||
console.log("ProductItem renders: ", renderCount)
|
console.log("ProductItem renders: ", renderCount)
|
||||||
|
|
||||||
|
|
||||||
const render_specs = (card.specs && card.specs.length > 0 && (
|
|
||||||
<ul>
|
|
||||||
{card.specs.map((spec, index) =>
|
|
||||||
<li key={index}>{spec}</li>
|
|
||||||
)}
|
|
||||||
</ul>
|
|
||||||
));
|
|
||||||
|
|
||||||
const render_datasheet_link = (card.datasheet_file && card.datasheet_name && (
|
|
||||||
<div className="ds">
|
|
||||||
<span className='doc-icon'></span>
|
|
||||||
<a href={card.datasheet_file} target="_blank" rel="noopener noreferrer">
|
|
||||||
{card.datasheet_name}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
));
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="productItem">
|
<section className="productItem">
|
||||||
|
|
||||||
<div className="content">
|
<div className="content">
|
||||||
<h3 style={{'marginBottom': card.name_codename ? '5px' : '20px'}}>{card.name_number} {card.name}</h3>
|
<h3 style={{'marginBottom': card.name_codename ? '5px' : '20px'}}>{card.name_number} {card.name}</h3>
|
||||||
{card.name_codename ? (
|
{card.name_codename ? (
|
||||||
@ -51,16 +56,13 @@ export function ProductItem({card_index}) {
|
|||||||
|
|
||||||
<div className="price">{`${currency} ${formatMoney(card.price)}`}</div>
|
<div className="price">{`${currency} ${formatMoney(card.price)}`}</div>
|
||||||
|
|
||||||
{render_specs}
|
<CardSpecs specs={card.specs}/>
|
||||||
|
|
||||||
{render_datasheet_link}
|
<DatasheetLink datasheet_file={card.datasheet_file} datasheet_name={card.datasheet_name}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="content">
|
<div className="content">
|
||||||
|
<AddButton onAdd={() => addCardFromCatalog(null, card_index, null)} />
|
||||||
<button onClick={() => onAddCard(null, card_index, null)}>
|
|
||||||
<img src="/images/shop/icon-add.svg" alt="add"/>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<Draggable draggableId={card.id + card_index} index={card_index}>
|
<Draggable draggableId={card.id + card_index} index={card_index}>
|
||||||
{(provided, snapshot) => (
|
{(provided, snapshot) => (
|
||||||
@ -83,10 +85,7 @@ export function ProductItem({card_index}) {
|
|||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
)}
|
)}
|
||||||
</Draggable>
|
</Draggable>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
@ -33,7 +33,8 @@ function ClockRenderer({occupied, max}) {
|
|||||||
const resource_progress_renderers = {
|
const resource_progress_renderers = {
|
||||||
"eem": EEMRenderer,
|
"eem": EEMRenderer,
|
||||||
"clk": ClockRenderer,
|
"clk": ClockRenderer,
|
||||||
"idc": EEMRenderer
|
"idc": EEMRenderer,
|
||||||
|
"tec": EEMRenderer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -45,6 +46,10 @@ function IDCTipRender({occupied, max}) {
|
|||||||
return (<p key={uuidv4()}>{`${occupied}/${max} IDC connectors used`}</p>);
|
return (<p key={uuidv4()}>{`${occupied}/${max} IDC connectors used`}</p>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function TECTipRender({occupied, max}) {
|
||||||
|
return (<p key={uuidv4()}>{`${occupied}/${max} TEC connectors used`}</p>);
|
||||||
|
}
|
||||||
|
|
||||||
function ClockTipRender({occupied, max}) {
|
function ClockTipRender({occupied, max}) {
|
||||||
return (<p key={uuidv4()}>{`${occupied}/${max} clock connectors used`}</p>);
|
return (<p key={uuidv4()}>{`${occupied}/${max} clock connectors used`}</p>);
|
||||||
}
|
}
|
||||||
@ -52,7 +57,8 @@ function ClockTipRender({occupied, max}) {
|
|||||||
const resource_tip = {
|
const resource_tip = {
|
||||||
"eem": EEMTipRender,
|
"eem": EEMTipRender,
|
||||||
"clk": ClockTipRender,
|
"clk": ClockTipRender,
|
||||||
"idc": IDCTipRender
|
"idc": IDCTipRender,
|
||||||
|
"tec": TECTipRender
|
||||||
}
|
}
|
||||||
|
|
||||||
function RenderResources({resources, library}) {
|
function RenderResources({resources, library}) {
|
||||||
|
@ -9,6 +9,7 @@ import {Layout} from "./Layout";
|
|||||||
import {Catalog} from "./Catalog";
|
import {Catalog} from "./Catalog";
|
||||||
import {OrderPanel} from "./OrderPanel";
|
import {OrderPanel} from "./OrderPanel";
|
||||||
import {useShopStore} from "./shop_store";
|
import {useShopStore} from "./shop_store";
|
||||||
|
import {DomainedEmail} from "./Domained";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component that renders the entire shop
|
* Component that renders the entire shop
|
||||||
@ -61,7 +62,7 @@ export function Shop() {
|
|||||||
the combination would look like. Configure the card settings by tapping on the top of
|
the combination would look like. Configure the card settings by tapping on the top of
|
||||||
the card; many of the options can be adjusted even after the card has been shipped.
|
the card; many of the options can be adjusted even after the card has been shipped.
|
||||||
If you have any issues with this ordering system, or if you need other configurations,
|
If you have any issues with this ordering system, or if you need other configurations,
|
||||||
email us directly anytime at <a href="mailto:sales@m-labs.hk">sales@m-labs.hk</a>.
|
email us directly anytime at <DomainedEmail address="sales"/>.
|
||||||
The price excludes shipping, is estimated, and must be confirmed by a quote.
|
The price excludes shipping, is estimated, and must be confirmed by a quote.
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
@ -26,10 +26,15 @@ const count_item_occupied_hp = (item) => {
|
|||||||
return (item.consumes && item.consumes.hp) || 0;
|
return (item.consumes && item.consumes.hp) || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const count_item_occupied_tec = (item) => {
|
||||||
|
return (item.options_data && item.options_data.tec === false) ? 0 : ((item.consumes && item.consumes.tec) || 0);
|
||||||
|
}
|
||||||
|
|
||||||
export const item_occupied_counters = {
|
export const item_occupied_counters = {
|
||||||
"eem": count_item_occupied_eem,
|
"eem": count_item_occupied_eem,
|
||||||
"clk": count_item_occupied_clock,
|
"clk": count_item_occupied_clock,
|
||||||
"idc": count_item_occupied_idc,
|
"idc": count_item_occupied_idc,
|
||||||
|
"tec": count_item_occupied_tec,
|
||||||
"hp": count_item_occupied_hp,
|
"hp": count_item_occupied_hp,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,6 +54,7 @@ export const resource_counters = {
|
|||||||
"clk": CounterFactory("clk"),
|
"clk": CounterFactory("clk"),
|
||||||
"idc": CounterFactory("idc"),
|
"idc": CounterFactory("idc"),
|
||||||
"hp": CounterFactory("hp"),
|
"hp": CounterFactory("hp"),
|
||||||
|
"tec": CounterFactory("tec"),
|
||||||
}
|
}
|
||||||
|
|
||||||
export function CountResources(data, index) {
|
export function CountResources(data, index) {
|
||||||
|
@ -12,7 +12,7 @@ export function DialogPopup({options, data, target, id, big, first, last, option
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
let div_classes = `overlayVariant border rounded ${big ? "overlay-bigcard" : "overlay-smallcard"} ${(!big && first) ? "overlay-first" : ""} ${(!big && last) ? "overlay-last" : ""} ${options_class || ""}`;
|
let div_classes = `overlayVariant border rounded ${big ? "overlay-bigcard" : "overlay-smallcard"} ${(!big && first) ? "overlay-first" : ""} ${(!big && last && !first) ? "overlay-last" : ""} ${options_class || ""}`;
|
||||||
const handleClick = (_event) => {
|
const handleClick = (_event) => {
|
||||||
setShow(!show);
|
setShow(!show);
|
||||||
};
|
};
|
||||||
|
@ -39,9 +39,10 @@ class Line extends Component {
|
|||||||
<div className="shop-line" key={this.props.id}>
|
<div className="shop-line" key={this.props.id}>
|
||||||
<label htmlFor={key} className="form-label">
|
<label htmlFor={key} className="form-label">
|
||||||
{this.props.icon && <img src={`/images${this.props.icon}`} className="options-icon"/>}
|
{this.props.icon && <img src={`/images${this.props.icon}`} className="options-icon"/>}
|
||||||
{this.props.title}:
|
{this.props.title}
|
||||||
|
{this.props.tip && <Tip id={this.props.id + "tooltip"} tip={this.props.tip}/>}
|
||||||
|
:
|
||||||
</label>
|
</label>
|
||||||
{this.props.tip && <Tip id={this.props.id + "tooltip"} tip={this.props.tip}/>}
|
|
||||||
<input type="text" className={`form-control form-control-sm ${this.state.valid ? "" : "options-invalid"}`} id={key} onChange={this.handleChange}
|
<input type="text" className={`form-control form-control-sm ${this.state.valid ? "" : "options-invalid"}`} id={key} onChange={this.handleChange}
|
||||||
value={this.state.text}/>
|
value={this.state.text}/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -49,8 +49,8 @@ class Switch extends Component {
|
|||||||
<label className="form-check-label" htmlFor={key} style={{"display": "inline"}}>
|
<label className="form-check-label" htmlFor={key} style={{"display": "inline"}}>
|
||||||
{this.props.icon && <img src={`/images${this.props.icon}`} className="options-icon"/>}
|
{this.props.icon && <img src={`/images${this.props.icon}`} className="options-icon"/>}
|
||||||
{this.props.title}
|
{this.props.title}
|
||||||
|
{this.props.tip && <Tip id={this.props.id + "tooltip"} tip={this.props.tip}/>}
|
||||||
</label>
|
</label>
|
||||||
{this.props.tip && <Tip id={this.props.id + "tooltip"} tip={this.props.tip}/>}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -65,8 +65,8 @@ class SwitchLine extends Component {
|
|||||||
<label className="form-check-label" htmlFor={key + "switch"}>
|
<label className="form-check-label" htmlFor={key + "switch"}>
|
||||||
{this.props.icon && <img src={`/images${this.props.icon}`} className="options-icon"/>}
|
{this.props.icon && <img src={`/images${this.props.icon}`} className="options-icon"/>}
|
||||||
{this.props.title}
|
{this.props.title}
|
||||||
|
{this.props.tip && <Tip id={this.props.id + "tooltip"} tip={this.props.tip}/>}
|
||||||
</label>
|
</label>
|
||||||
{this.props.tip && <Tip id={this.props.id + "tooltip"} tip={this.props.tip}/>}
|
|
||||||
</div>
|
</div>
|
||||||
<input type="text" className={`form-control form-control-sm ${this.state.valid ? "" : "options-invalid"}`} id={key + "line"} onChange={this.handleText}
|
<input type="text" className={`form-control form-control-sm ${this.state.valid ? "" : "options-invalid"}`} id={key + "line"} onChange={this.handleText}
|
||||||
value={this.state.text} disabled={!this.state.checked}/>
|
value={this.state.text} disabled={!this.state.checked}/>
|
||||||
|
@ -6,9 +6,11 @@ export const true_type_of = (obj) => Object.prototype.toString.call(obj).slice(8
|
|||||||
|
|
||||||
export function FillExtCardData(data, index) {
|
export function FillExtCardData(data, index) {
|
||||||
return {
|
return {
|
||||||
|
// we cannot use value id, because they are substituted with uuid
|
||||||
has_other_dio: data.filter((value, item_index) => index !== item_index && value.name &&value.name.endsWith("-TTL")).length > 0,
|
has_other_dio: data.filter((value, item_index) => index !== item_index && value.name &&value.name.endsWith("-TTL")).length > 0,
|
||||||
has_dds: data.filter(((value, _) => value.name === "DDS" && value.name_number === "4410" && (!value.options_data || !value.options_data.mono_eem))).length > 0,
|
has_dds: data.filter(((value, _) => value.name === "DDS" && value.name_number === "4410" && (!value.options_data || !value.options_data.mono_eem))).length > 0,
|
||||||
has_sampler: data.filter(((value, _) => value.name === "Sampler" && (!value.options_data || !value.options_data.mono_eem))).length > 0,
|
has_sampler: data.filter(((value, _) => value.name === "Sampler" && (!value.options_data || !value.options_data.mono_eem))).length > 0,
|
||||||
|
has_thermostat: data.filter((value, item_index) => index !== item_index && value.name_number && value.name_number === '8451').length > 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import {createWithEqualityFn} from "zustand/traditional";
|
import {createWithEqualityFn} from "zustand/traditional";
|
||||||
import {data as shared_data, itemsUnfoldedList} from "./utils";
|
import {DATA as shared_data, itemsUnfoldedList, API_RFQ} from "./utils";
|
||||||
import {FillExtCrateData, FillExtOrderData, true_type_of} from "./options/utils";
|
import {FillExtCrateData, FillExtOrderData, true_type_of} from "./options/utils";
|
||||||
import {v4 as uuidv4} from "uuid";
|
import {v4 as uuidv4} from "uuid";
|
||||||
import {FillResources} from "./count_resources";
|
import {FillResources} from "./count_resources";
|
||||||
@ -10,6 +10,7 @@ import {TriggerCrateWarnings, TriggerWarnings} from "./warnings";
|
|||||||
import {Validation, validateEmail, validateNote, validateJSONInput} from "./validate";
|
import {Validation, validateEmail, validateNote, validateJSONInput} from "./validate";
|
||||||
import {CratesToJSON, JSONToCrates} from "./json_porter";
|
import {CratesToJSON, JSONToCrates} from "./json_porter";
|
||||||
import {ProcessOptionsToData} from "./options/Options";
|
import {ProcessOptionsToData} from "./options/Options";
|
||||||
|
import {DomainedRFQMessages} from "./Domained";
|
||||||
|
|
||||||
|
|
||||||
const cards_to_pn_map = (cards) => {
|
const cards_to_pn_map = (cards) => {
|
||||||
@ -228,7 +229,7 @@ const useSubmitForm = ((set, get) => ({
|
|||||||
status: Validation.OK,
|
status: Validation.OK,
|
||||||
message: ""
|
message: ""
|
||||||
},
|
},
|
||||||
API_RFQ: shared_data.API_RFQ,
|
API_RFQ: API_RFQ,
|
||||||
email: {
|
email: {
|
||||||
value: "",
|
value: "",
|
||||||
error: null
|
error: null
|
||||||
@ -306,18 +307,18 @@ const useSubmitForm = ((set, get) => ({
|
|||||||
if (response.status !== 200) {
|
if (response.status !== 200) {
|
||||||
throw Error("Response status is not OK: " + response.status + ".\n" + response);
|
throw Error("Response status is not OK: " + response.status + ".\n" + response);
|
||||||
}
|
}
|
||||||
get().finishSubmitForm({status: Validation.OK, message: "We've received your request and will be in contact soon."})
|
get().finishSubmitForm({status: Validation.OK, message: DomainedRFQMessages.OK})
|
||||||
}, reason => {
|
}, reason => {
|
||||||
console.error("Request rejected, reason:", reason)
|
console.error("Request rejected, reason:", reason)
|
||||||
get().finishSubmitForm({
|
get().finishSubmitForm({
|
||||||
status: Validation.Invalid,
|
status: Validation.Invalid,
|
||||||
message: "We cannot receive your request. Try using the export by coping the configuration and send it to us at sales@m-labs.hk"
|
message: DomainedRFQMessages.ERROR
|
||||||
})
|
})
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
console.error("Request failed, reason:", err)
|
console.error("Request failed, reason:", err)
|
||||||
get().finishSubmitForm({
|
get().finishSubmitForm({
|
||||||
status: Validation.Invalid,
|
status: Validation.Invalid,
|
||||||
message: "We cannot receive your request. Try using the export by coping the configuration and send it to us at sales@m-labs.hk"
|
message: DomainedRFQMessages.ERROR
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@ -552,6 +553,7 @@ const useCart = ((set, get) => ({
|
|||||||
delCrate: (id) => {
|
delCrate: (id) => {
|
||||||
get()._delCrate(id);
|
get()._delCrate(id);
|
||||||
get().fillOrderExtData();
|
get().fillOrderExtData();
|
||||||
|
get()._updateTotalOrderPrice();
|
||||||
},
|
},
|
||||||
|
|
||||||
addCardFromCatalog: (crate_to, index_from, index_to, just_mounted) => {
|
addCardFromCatalog: (crate_to, index_from, index_to, just_mounted) => {
|
||||||
@ -593,6 +595,7 @@ const useCart = ((set, get) => ({
|
|||||||
clearCrate: (id) => {
|
clearCrate: (id) => {
|
||||||
get()._clearCrate(id);
|
get()._clearCrate(id);
|
||||||
get().fillWarnings(id);
|
get().fillWarnings(id);
|
||||||
|
get()._updateTotalOrderPrice();
|
||||||
},
|
},
|
||||||
|
|
||||||
updateOptions: (crate_id, index, new_options) => {
|
updateOptions: (crate_id, index, new_options) => {
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
export const data = window.shop_data;
|
export const DATA = window.shop_data;
|
||||||
export const itemsUnfoldedList = Array.from(data.columns.catalog.categories.map(groupId => groupId.itemIds).flat());
|
export const DOMAIN = window.DOMAIN;
|
||||||
|
export const API_RFQ = window.API_RFQ;
|
||||||
|
export const itemsUnfoldedList = Array.from(DATA.columns.catalog.categories.map(groupId => groupId.itemIds).flat());
|
||||||
|
|
||||||
export const productStyle = (style, snapshot, removeAnim, hovered, selected, cart=false) => {
|
export const productStyle = (style, snapshot, removeAnim, hovered, selected, cart=false) => {
|
||||||
const custom = {
|
const custom = {
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
const shop_data = {
|
const shop_data = {
|
||||||
|
|
||||||
API_RFQ: 'https://hooks.m-labs.hk/rfq',
|
|
||||||
currency: 'USD',
|
currency: 'USD',
|
||||||
|
|
||||||
crateModes: {
|
crateModes: {
|
||||||
@ -53,8 +51,8 @@ const shop_data = {
|
|||||||
title: "Optional pre-installed NUC mini-computer",
|
title: "Optional pre-installed NUC mini-computer",
|
||||||
outvar: "nuc",
|
outvar: "nuc",
|
||||||
tip: "Pre-installed NixOS desktop with ARTIQ and other scientific software. " +
|
tip: "Pre-installed NixOS desktop with ARTIQ and other scientific software. " +
|
||||||
"Hardware: Intel® NUC 13 Pro Kit NUC13ANKi7, i7-1360P CPU, " +
|
"Hardware: ASUS® NUC 14 Pro Kit, Intel® i7-155H CPU, " +
|
||||||
"32GB RAM, 1TB NVMe. Other options contact us.",
|
"32GB RAM, 1TB NVMe. For other options contact us.",
|
||||||
fallback: true,
|
fallback: true,
|
||||||
}},
|
}},
|
||||||
{
|
{
|
||||||
@ -131,6 +129,12 @@ const shop_data = {
|
|||||||
{type: "Line", args: {title: "Please provide delivery address",
|
{type: "Line", args: {title: "Please provide delivery address",
|
||||||
outvar: "shipping_instructions", fallback: "",}}],
|
outvar: "shipping_instructions", fallback: "",}}],
|
||||||
]},
|
]},
|
||||||
|
{type: "Switch", args: {
|
||||||
|
title: "I would like this order made outside Hong Kong (see FAQ)",
|
||||||
|
outvar: "outside_hk",
|
||||||
|
tip: "For the convenience of our customers who may be discouraged from doing business with companies registered in Hong Kong, M-Labs can manufacture Sinara hardware orders upon request in Manila, Philippines. Additional fees and terms may apply.",
|
||||||
|
fallback: false,
|
||||||
|
}},
|
||||||
]}
|
]}
|
||||||
],
|
],
|
||||||
|
|
||||||
@ -180,8 +184,9 @@ const shop_data = {
|
|||||||
'4 MMCX clock outputs.',
|
'4 MMCX clock outputs.',
|
||||||
'Price includes bitstream generation, flashing, testing, and firmware updates for 1 year (USD 1,400.00).',
|
'Price includes bitstream generation, flashing, testing, and firmware updates for 1 year (USD 1,400.00).',
|
||||||
],
|
],
|
||||||
|
datasheet_file: '/docs/sinara-datasheets/1124.pdf',
|
||||||
|
datasheet_name: '1124 Carrier Kasli 2.0 datasheet',
|
||||||
size: 'big',
|
size: 'big',
|
||||||
type: 'kasli',
|
|
||||||
options: [
|
options: [
|
||||||
{type: "Radio", args: {title: "DRTIO role", outvar: "drtio_role", variants: ["standalone", "master", "satellite"], tip: "Distributed Real Time Input/Output allows ARTIQ RTIO channels to be distributed among several satellite devices synchronized and controlled by a central core(master) device. Standalone option disables this feature."}},
|
{type: "Radio", args: {title: "DRTIO role", outvar: "drtio_role", variants: ["standalone", "master", "satellite"], tip: "Distributed Real Time Input/Output allows ARTIQ RTIO channels to be distributed among several satellite devices synchronized and controlled by a central core(master) device. Standalone option disables this feature."}},
|
||||||
{
|
{
|
||||||
@ -245,8 +250,9 @@ const shop_data = {
|
|||||||
'12 EEM connectors.',
|
'12 EEM connectors.',
|
||||||
'4 MMCX clock outputs.',
|
'4 MMCX clock outputs.',
|
||||||
],
|
],
|
||||||
|
datasheet_file: '/docs/sinara-datasheets/1125.pdf',
|
||||||
|
datasheet_name: '1124 Carrier Kasli SoC datasheet',
|
||||||
size: 'big',
|
size: 'big',
|
||||||
type: 'kasli',
|
|
||||||
hp: 8,
|
hp: 8,
|
||||||
nbrSlotMin: 0,
|
nbrSlotMin: 0,
|
||||||
nbrSlotMax: 12,
|
nbrSlotMax: 12,
|
||||||
@ -318,7 +324,6 @@ const shop_data = {
|
|||||||
'A pair of VHDCI carriers is a simple, low-latency and low-cost alternative to DRTIO for some applications.',
|
'A pair of VHDCI carriers is a simple, low-latency and low-cost alternative to DRTIO for some applications.',
|
||||||
],
|
],
|
||||||
size: 'big',
|
size: 'big',
|
||||||
type: 'vhdcicarrier',
|
|
||||||
resources: [
|
resources: [
|
||||||
{name: "eem", max: 8},
|
{name: "eem", max: 8},
|
||||||
],
|
],
|
||||||
@ -349,7 +354,6 @@ const shop_data = {
|
|||||||
datasheet_file: '/docs/sinara-datasheets/2118-2128.pdf',
|
datasheet_file: '/docs/sinara-datasheets/2118-2128.pdf',
|
||||||
datasheet_name: '2118/2128 BNC/SMA-TTL datasheet',
|
datasheet_name: '2118/2128 BNC/SMA-TTL datasheet',
|
||||||
size: 'big',
|
size: 'big',
|
||||||
type: null,
|
|
||||||
options: [
|
options: [
|
||||||
{
|
{
|
||||||
"if": [
|
"if": [
|
||||||
@ -459,7 +463,6 @@ const shop_data = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: null,
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source"
|
"no_eem_source"
|
||||||
],
|
],
|
||||||
@ -473,7 +476,7 @@ const shop_data = {
|
|||||||
name: 'MCX-TTL',
|
name: 'MCX-TTL',
|
||||||
name_number: '2238',
|
name_number: '2238',
|
||||||
name_codename: '',
|
name_codename: '',
|
||||||
price: 600,
|
price: 700,
|
||||||
image: '/images/shop/graphic-03_MCX-TTL.svg',
|
image: '/images/shop/graphic-03_MCX-TTL.svg',
|
||||||
specs: [
|
specs: [
|
||||||
'16 single-ended digital signals on MCX connectors.',
|
'16 single-ended digital signals on MCX connectors.',
|
||||||
@ -551,7 +554,6 @@ const shop_data = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: null,
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source"
|
"no_eem_source"
|
||||||
],
|
],
|
||||||
@ -638,7 +640,6 @@ const shop_data = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: null,
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source"
|
"no_eem_source"
|
||||||
],
|
],
|
||||||
@ -662,7 +663,8 @@ const shop_data = {
|
|||||||
'Digital step attenuator 0 to -31.5dB.',
|
'Digital step attenuator 0 to -31.5dB.',
|
||||||
'RF switch (1ns temporal resolution), 70dB isolation.',
|
'RF switch (1ns temporal resolution), 70dB isolation.',
|
||||||
'AD9910 and AD9912 cards can be used at the same time in the same crate.',
|
'AD9910 and AD9912 cards can be used at the same time in the same crate.',
|
||||||
'External 5W power amplifier is available separately, leave us a note if interested.'
|
'Power amplifier (e.g. AOM driver) options available, contact us for details.',
|
||||||
|
'Can be integrated and shipped with single- or double-pass fiber-coupled AOM at most wavelengths 400nm-1650nm, AOM driver, low-noise monitor PD and SU-Servo to reduce laser, AOM and fiber noise. Contact us for details.'
|
||||||
],
|
],
|
||||||
datasheet_file: '/docs/sinara-datasheets/4410-4412.pdf',
|
datasheet_file: '/docs/sinara-datasheets/4410-4412.pdf',
|
||||||
datasheet_name: '4410/4412 Urukul datasheet',
|
datasheet_name: '4410/4412 Urukul datasheet',
|
||||||
@ -701,7 +703,6 @@ const shop_data = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'urukul',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"no_clk_source"
|
"no_clk_source"
|
||||||
@ -728,7 +729,8 @@ const shop_data = {
|
|||||||
'RF switch (1ns temporal resolution), 70dB isolation.',
|
'RF switch (1ns temporal resolution), 70dB isolation.',
|
||||||
'AD9912 chip.',
|
'AD9912 chip.',
|
||||||
'AD9910 and AD9912 cards can be used at the same time in the same crate.',
|
'AD9910 and AD9912 cards can be used at the same time in the same crate.',
|
||||||
'External 5W power amplifier is available separately, leave us a note if interested.'
|
'Power amplifier (e.g. AOM driver) options available, contact us for details.',
|
||||||
|
'Can be integrated and shipped with single- or double-pass fiber-coupled AOM at most wavelengths 400nm-1650nm, and AOM driver. Contact us for details.'
|
||||||
],
|
],
|
||||||
datasheet_file: '/docs/sinara-datasheets/4410-4412.pdf',
|
datasheet_file: '/docs/sinara-datasheets/4410-4412.pdf',
|
||||||
datasheet_name: '4410/4412 Urukul datasheet',
|
datasheet_name: '4410/4412 Urukul datasheet',
|
||||||
@ -739,7 +741,6 @@ const shop_data = {
|
|||||||
fallback: {text: "125 MHz", checked: false}}}
|
fallback: {text: "125 MHz", checked: false}}}
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'urukul',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"no_clk_source"
|
"no_clk_source"
|
||||||
@ -760,6 +761,7 @@ const shop_data = {
|
|||||||
specs: [
|
specs: [
|
||||||
'2x 1.25 GS/s IQ upconverters.',
|
'2x 1.25 GS/s IQ upconverters.',
|
||||||
'dual IQ mixer + 0.3 GHz to 4.8 GHz VCO + PLL.',
|
'dual IQ mixer + 0.3 GHz to 4.8 GHz VCO + PLL.',
|
||||||
|
'up to 16 dynamic tones using MIQRO gateware (available separately from QUARTIQ).',
|
||||||
'31.5 dB range digital step attenuator (similar to Urukul).',
|
'31.5 dB range digital step attenuator (similar to Urukul).',
|
||||||
'2 channels of 5 MS/s ADC (similar to Sampler).',
|
'2 channels of 5 MS/s ADC (similar to Sampler).',
|
||||||
'Artix-7 FPGA.',
|
'Artix-7 FPGA.',
|
||||||
@ -773,7 +775,6 @@ const shop_data = {
|
|||||||
{type: "Radio", args: {title: "Variant", outvar: "variant", variants: ["Baseband", "Upconverter"], fallback: 1}},
|
{type: "Radio", args: {title: "Variant", outvar: "variant", variants: ["Baseband", "Upconverter"], fallback: 1}},
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'urukul',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"no_clk_source"
|
"no_clk_source"
|
||||||
@ -801,19 +802,29 @@ const shop_data = {
|
|||||||
'DAC temperature can be stabilized using the Sinara 8451 Thermostat (sold separately).'
|
'DAC temperature can be stabilized using the Sinara 8451 Thermostat (sold separately).'
|
||||||
],
|
],
|
||||||
options: [
|
options: [
|
||||||
{type: "Switch", args: {title: "TEC", outvar: "tec", tip: "Used for stabilizing temperature with Sinara 8451 Thermostat"}},
|
{
|
||||||
|
"if": [
|
||||||
|
{"var": "ext_data.has_thermostat"},
|
||||||
|
[
|
||||||
|
{type: "Switch", args: {title: "TEC", outvar: "tec", fallback: true, tip: "Used for stabilizing temperature with Sinara 8451 Thermostat"}}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{type: "Switch", args: {title: "TEC", outvar: "tec", tip: "Used for stabilizing temperature with Sinara 8451 Thermostat"}}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
],
|
],
|
||||||
datasheet_file: '/docs/sinara-datasheets/5432.pdf',
|
datasheet_file: '/docs/sinara-datasheets/5432.pdf',
|
||||||
datasheet_name: '5432 Zotino datasheet',
|
datasheet_name: '5432 Zotino datasheet',
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'zotino',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"idc_resource"
|
"idc_resource"
|
||||||
],
|
],
|
||||||
consumes: {
|
consumes: {
|
||||||
hp: 4,
|
hp: 4,
|
||||||
eem: 1
|
eem: 1,
|
||||||
|
tec: 1
|
||||||
},
|
},
|
||||||
resources: [
|
resources: [
|
||||||
{name: "idc", max: 4}
|
{name: "idc", max: 4}
|
||||||
@ -835,7 +846,6 @@ const shop_data = {
|
|||||||
'Channels can also be broken out to BNC or SMA using IDC-BNC, IDC-SMA or IDC-MCX cards.'
|
'Channels can also be broken out to BNC or SMA using IDC-BNC, IDC-SMA or IDC-MCX cards.'
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'zotino',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"idc_resource",
|
"idc_resource",
|
||||||
@ -860,8 +870,9 @@ const shop_data = {
|
|||||||
'Each card provides 8 channels.',
|
'Each card provides 8 channels.',
|
||||||
'Breaking out all 32 channels from a Zotino requires 4 IDC-BNC cards.'
|
'Breaking out all 32 channels from a Zotino requires 4 IDC-BNC cards.'
|
||||||
],
|
],
|
||||||
|
datasheet_file: '/docs/sinara-datasheets/5518-5528.pdf',
|
||||||
|
datasheet_name: '5518 BNC-IDC / 5528 SMA-IDC datasheet',
|
||||||
size: 'big',
|
size: 'big',
|
||||||
type: 'idc-bnc',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_idc_source"
|
"no_idc_source"
|
||||||
],
|
],
|
||||||
@ -870,6 +881,34 @@ const shop_data = {
|
|||||||
idc: 1
|
idc: 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
'hvamp32': {
|
||||||
|
id: 'hvamp32',
|
||||||
|
name: 'HV Amplifier',
|
||||||
|
name_number: '5633',
|
||||||
|
name_codename: '',
|
||||||
|
price: 1950,
|
||||||
|
image: '/images/shop/graphic-03_HVAMP32.svg',
|
||||||
|
specs: [
|
||||||
|
'Amplifier: LTC6090, 32 channels.',
|
||||||
|
'Output voltage: ±50V.',
|
||||||
|
'Over-temperature protection.',
|
||||||
|
'External 12V power supply.',
|
||||||
|
'Slew rate 21V/us typical.',
|
||||||
|
'Bandwidth: 12MHz/gain, 2.4MHz typical.',
|
||||||
|
'The same connector as in Zotino and Fastino.'
|
||||||
|
],
|
||||||
|
size: 'small',
|
||||||
|
warnings: [
|
||||||
|
"no_idc_source"
|
||||||
|
],
|
||||||
|
resources: [
|
||||||
|
{name: "idc", max: 4}
|
||||||
|
],
|
||||||
|
consumes: {
|
||||||
|
hp: 4,
|
||||||
|
idc: 4
|
||||||
|
}
|
||||||
|
},
|
||||||
'idc-sma-adapter': {
|
'idc-sma-adapter': {
|
||||||
id: 'idc-sma-adapter',
|
id: 'idc-sma-adapter',
|
||||||
name: 'SMA-IDC',
|
name: 'SMA-IDC',
|
||||||
@ -882,8 +921,9 @@ const shop_data = {
|
|||||||
'Each card provides 8 channels.',
|
'Each card provides 8 channels.',
|
||||||
'Breaking out all 32 channels from a Zotino requires 4 SMA-IDC cards.'
|
'Breaking out all 32 channels from a Zotino requires 4 SMA-IDC cards.'
|
||||||
],
|
],
|
||||||
|
datasheet_file: '/docs/sinara-datasheets/5518-5528.pdf',
|
||||||
|
datasheet_name: '5518 BNC-IDC / 5528 SMA-IDC datasheet',
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'idc-bnc',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_idc_source"
|
"no_idc_source"
|
||||||
],
|
],
|
||||||
@ -892,6 +932,27 @@ const shop_data = {
|
|||||||
idc: 1
|
idc: 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
'idc-mcx-adapter': {
|
||||||
|
id: 'idc-mcx-adapter',
|
||||||
|
name: 'MCX-IDC',
|
||||||
|
name_number: '5538',
|
||||||
|
name_codename: '',
|
||||||
|
price: 900,
|
||||||
|
image: '/images/shop/graphic-03_MCX-IDC32.svg',
|
||||||
|
specs: [
|
||||||
|
'Breaks out analog signals from Zotino or HD68-IDC to MCX connectors.',
|
||||||
|
'Each card provides 32 channels.',
|
||||||
|
],
|
||||||
|
size: 'big',
|
||||||
|
type: 'idc-bnc',
|
||||||
|
warnings: [
|
||||||
|
"no_idc_source"
|
||||||
|
],
|
||||||
|
consumes: {
|
||||||
|
hp: 8,
|
||||||
|
idc: 4
|
||||||
|
}
|
||||||
|
},
|
||||||
'hd68-idc-adapter': {
|
'hd68-idc-adapter': {
|
||||||
id:'hd68-idc-adapter',
|
id:'hd68-idc-adapter',
|
||||||
name: 'HD68-IDC',
|
name: 'HD68-IDC',
|
||||||
@ -902,8 +963,9 @@ const shop_data = {
|
|||||||
specs: [
|
specs: [
|
||||||
'Connects an external HD68 cable to IDC-BNC, IDC-SMA or IDC-MCX cards.',
|
'Connects an external HD68 cable to IDC-BNC, IDC-SMA or IDC-MCX cards.',
|
||||||
],
|
],
|
||||||
|
datasheet_file: '/docs/sinara-datasheets/5568.pdf',
|
||||||
|
datasheet_name: '5568 HD68-IDC datasheet',
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'hd68',
|
|
||||||
options: [
|
options: [
|
||||||
{type: "Radio", args: {title: "Cable length", outvar: "hd68_cable_len", variants: ["1 M", "2 M", "3 M"], tip: "The desired length of the HD68 cable", fallback: 1}},
|
{type: "Radio", args: {title: "Cable length", outvar: "hd68_cable_len", variants: ["1 M", "2 M", "3 M"], tip: "The desired length of the HD68 cable", fallback: 1}},
|
||||||
],
|
],
|
||||||
@ -934,6 +996,8 @@ const shop_data = {
|
|||||||
'Full-scale input ranges between +-10mV and +-10V.',
|
'Full-scale input ranges between +-10mV and +-10V.',
|
||||||
'Supports SU-Servo laser intensity stabilization servo in conjunction with Urukul.'
|
'Supports SU-Servo laser intensity stabilization servo in conjunction with Urukul.'
|
||||||
],
|
],
|
||||||
|
datasheet_file: '/docs/sinara-datasheets/5108.pdf',
|
||||||
|
datasheet_name: '5108 ADC Sampler datasheet',
|
||||||
options: [
|
options: [
|
||||||
{type: "Switch", args: {title: "1 EEM mode", outvar: "mono_eem"}},
|
{type: "Switch", args: {title: "1 EEM mode", outvar: "mono_eem"}},
|
||||||
{
|
{
|
||||||
@ -960,7 +1024,6 @@ const shop_data = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
size: 'big',
|
size: 'big',
|
||||||
type: 'novo',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source"
|
"no_eem_source"
|
||||||
],
|
],
|
||||||
@ -987,7 +1050,6 @@ const shop_data = {
|
|||||||
{type: "Radio", args: {title: "Connectors", outvar: "n_eem", variants: ["1 EEM", "2 EEM", "3 EEM"], tip: "Number of EEM ports to use.", fallback: 1}},
|
{type: "Radio", args: {title: "Connectors", outvar: "n_eem", variants: ["1 EEM", "2 EEM", "3 EEM"], tip: "Number of EEM ports to use.", fallback: 1}},
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'koster',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source"
|
"no_eem_source"
|
||||||
],
|
],
|
||||||
@ -1010,13 +1072,14 @@ const shop_data = {
|
|||||||
'Frequency up to 1GHz.',
|
'Frequency up to 1GHz.',
|
||||||
'Low jitter <100fs RMS.'
|
'Low jitter <100fs RMS.'
|
||||||
],
|
],
|
||||||
|
datasheet_file: '/docs/sinara-datasheets/7210.pdf',
|
||||||
|
datasheet_name: '7210 Clocker datasheet',
|
||||||
options: [
|
options: [
|
||||||
{type: "Switch", args: {title: "Ext CLK", outvar: "ext_clk"}},
|
{type: "Switch", args: {title: "Ext CLK", outvar: "ext_clk"}},
|
||||||
{type: "Switch", args: {title: "Ext power", outvar: "ext_pwr", "tip": "Use external power supply in order to reduce number of used EEM connectors"}}
|
{type: "Switch", args: {title: "Ext power", outvar: "ext_pwr", "tip": "Use external power supply in order to reduce number of used EEM connectors"}}
|
||||||
],
|
],
|
||||||
options_class: "clocker",
|
options_class: "clocker",
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'clocker',
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"no_clk_source",
|
"no_clk_source",
|
||||||
@ -1057,7 +1120,40 @@ const shop_data = {
|
|||||||
],
|
],
|
||||||
options_class: "stabilizer",
|
options_class: "stabilizer",
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: null,
|
warnings: [
|
||||||
|
"no_eem_source"
|
||||||
|
],
|
||||||
|
consumes: {
|
||||||
|
hp: 4,
|
||||||
|
eem: 1
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'fast_servo': {
|
||||||
|
id: 'fast_servo',
|
||||||
|
name: 'Fast DSP',
|
||||||
|
name_number: '8462',
|
||||||
|
name_codename: 'Fast Servo',
|
||||||
|
price: 2900,
|
||||||
|
image: '/images/shop/graphic-03_Fast-Servo.svg',
|
||||||
|
specs: [
|
||||||
|
'High-speed, low-latency servo (Stabilizer-compatible) module.',
|
||||||
|
'Trenz TE0715-04 SoC module (XC7Z015).',
|
||||||
|
'2 channel 125MHz 16bit ADC (LTC2195).',
|
||||||
|
'2 channel 125MHz 14bit DAC (AD9117).',
|
||||||
|
'100Base-T Ethernet.',
|
||||||
|
'Can work stand-alone with PoE or DC supply.'
|
||||||
|
],
|
||||||
|
options: [
|
||||||
|
{type: "SwitchLine", args: {title: "IP", outvar: "ip",
|
||||||
|
validator: {name: "ipv4or6"},
|
||||||
|
fallback: {text: "DHCP", checked: false},
|
||||||
|
tip: "Set up IP address used by the device"}},
|
||||||
|
{type: "Switch", args: {title: "Ext power", outvar: "ext_pwr", "tip": "Use external power supply in order to reduce number of used EEM connectors"}},
|
||||||
|
{type: "Switch", args: {title: "Term #0", outvar: "term_0", tip: "Enable termination on ADC channel #0"}},
|
||||||
|
{type: "Switch", args: {title: "Term #1", outvar: "term_1", tip: "Enable termination on ADC channel #1"}}
|
||||||
|
],
|
||||||
|
options_class: "stabilizer",
|
||||||
|
size: 'small',
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source"
|
"no_eem_source"
|
||||||
],
|
],
|
||||||
@ -1081,13 +1177,14 @@ const shop_data = {
|
|||||||
'Lower jitter and phase noise.',
|
'Lower jitter and phase noise.',
|
||||||
'Large frequency changes take several milliseconds.',
|
'Large frequency changes take several milliseconds.',
|
||||||
],
|
],
|
||||||
|
datasheet_file: '/docs/sinara-datasheets/4456.pdf',
|
||||||
|
datasheet_name: '4456 Synthesizer Mirny datasheet',
|
||||||
options: [
|
options: [
|
||||||
{type: "SwitchLine", args: {title: "Ext CLK", outvar: "ext_clk",
|
{type: "SwitchLine", args: {title: "Ext CLK", outvar: "ext_clk",
|
||||||
validator: {name: "frequency", params: {min: 10e6, max: 600e6}},
|
validator: {name: "frequency", params: {min: 10e6, max: 600e6}},
|
||||||
fallback: {text: "125 MHz", checked: false}}}
|
fallback: {text: "125 MHz", checked: false}}}
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: null,
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"no_clk_source"
|
"no_clk_source"
|
||||||
@ -1116,7 +1213,6 @@ const shop_data = {
|
|||||||
fallback: {text: "125 MHz", checked: false}}}
|
fallback: {text: "125 MHz", checked: false}}}
|
||||||
],
|
],
|
||||||
size: 'big',
|
size: 'big',
|
||||||
type: null,
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"no_clk_source"
|
"no_clk_source"
|
||||||
@ -1146,7 +1242,6 @@ const shop_data = {
|
|||||||
{type: "Switch", args: {title: "Ext power", outvar: "ext_pwr", "tip": "Use external power supply in order to reduce number of used EEM connectors"}}
|
{type: "Switch", args: {title: "Ext power", outvar: "ext_pwr", "tip": "Use external power supply in order to reduce number of used EEM connectors"}}
|
||||||
],
|
],
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: null,
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source"
|
"no_eem_source"
|
||||||
],
|
],
|
||||||
@ -1155,6 +1250,28 @@ const shop_data = {
|
|||||||
eem: 1,
|
eem: 1,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
'thermostat2ch': {
|
||||||
|
id: 'thermostat2ch',
|
||||||
|
name: 'Thermostat',
|
||||||
|
name_number: '8451',
|
||||||
|
name_codename: '',
|
||||||
|
price: 900,
|
||||||
|
image: '/images/shop/graphic-03_Thermostat2ch.svg',
|
||||||
|
specs: [
|
||||||
|
'2 TEC channels.',
|
||||||
|
'Parallel output 10 pin IDC 2.54mm and 5 pin 3.81mm connectors per channel.',
|
||||||
|
'Up to 8W (+/-2A with 4V compliance) heater/TEC drive from MAX1968 drivers.',
|
||||||
|
'100Base-T Ethernet with PoE.',
|
||||||
|
'Can stabilize temperature of Sinara 5432 DAC or external devices containing TEC and thermistor.'
|
||||||
|
],
|
||||||
|
size: 'small',
|
||||||
|
consumes: {
|
||||||
|
hp: 4
|
||||||
|
},
|
||||||
|
resources: [
|
||||||
|
{name: "tec", max: 2}
|
||||||
|
]
|
||||||
|
},
|
||||||
'shuttler': {
|
'shuttler': {
|
||||||
id: 'shuttler',
|
id: 'shuttler',
|
||||||
name: 'DAC',
|
name: 'DAC',
|
||||||
@ -1171,7 +1288,6 @@ const shop_data = {
|
|||||||
'Included remote analog front-end (AFE) board converts differential signals to ±10V single-ended at the point of use, with additional gain and filtering.',
|
'Included remote analog front-end (AFE) board converts differential signals to ±10V single-ended at the point of use, with additional gain and filtering.',
|
||||||
],
|
],
|
||||||
size: 'big',
|
size: 'big',
|
||||||
type: null,
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"no_clk_source"
|
"no_clk_source"
|
||||||
@ -1206,13 +1322,12 @@ const shop_data = {
|
|||||||
{type: "Switch", args: {title: "Termination #1", outvar: "term_1", tip: "Enable termination on ADC channel #1"}}
|
{type: "Switch", args: {title: "Termination #1", outvar: "term_1", tip: "Enable termination on ADC channel #1"}}
|
||||||
],
|
],
|
||||||
size: 'big',
|
size: 'big',
|
||||||
type: null,
|
|
||||||
warnings: [
|
warnings: [
|
||||||
"no_eem_source",
|
"no_eem_source",
|
||||||
"no_clk_source"
|
"no_clk_source"
|
||||||
],
|
],
|
||||||
consumes: {
|
consumes: {
|
||||||
hp: 4,
|
hp: 8,
|
||||||
eem: 1,
|
eem: 1,
|
||||||
clk: 1
|
clk: 1
|
||||||
}
|
}
|
||||||
@ -1236,10 +1351,40 @@ const shop_data = {
|
|||||||
"Optional - external power brick will be shipped free of charge if removed."
|
"Optional - external power brick will be shipped free of charge if removed."
|
||||||
],
|
],
|
||||||
size: 'big',
|
size: 'big',
|
||||||
|
warnings: [],
|
||||||
|
consumes: {
|
||||||
|
hp: 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'kirdy': {
|
||||||
|
id: 'kirdy',
|
||||||
|
name: 'Laser diode driver',
|
||||||
|
name_number: '1550',
|
||||||
|
name_codename: 'Kirdy',
|
||||||
|
price: 1700,
|
||||||
|
image: '/images/shop/graphic-03_Kirdy.svg',
|
||||||
|
specs: [
|
||||||
|
"Precision LD driver: 300mA max output current, 20-bit resolution, 4V compliance voltage.",
|
||||||
|
"RMS noise 10Hz-1MHz: <200nA, density <300pA/√Hz.",
|
||||||
|
"Low-frequency modulation input, DC-18MHz 3dB bandwidth, suitable for laser locks and linewidth reduction.",
|
||||||
|
"High-frequency Bias-T modulation input, suitable for PDH sideband generation.",
|
||||||
|
"Monitor photodiode and LD protection.",
|
||||||
|
"Temperature controller: ±1A max current, sub-mK stability.",
|
||||||
|
"Full digital control and power over Ethernet.",
|
||||||
|
"Can ship with single-frequency narrow-linewidth laser pre-installed (1270-1610nm from USD +200.00, 633-1064nm from USD +4,000.00), fiber output on front panel.",
|
||||||
|
"Also suitable for commercial or homebuilt ECDL heads (with additional piezo driver), and injection-locked Fabry-Perot diodes."
|
||||||
|
],
|
||||||
|
options: [
|
||||||
|
{type: "Line", args: {title: "IP", outvar: "ip",
|
||||||
|
validator: {name: "ipv4"},
|
||||||
|
fallback: "192.168.1.128/24",
|
||||||
|
tip: "Set up IP address used by the device."}},
|
||||||
|
],
|
||||||
|
size: 'big',
|
||||||
type: null,
|
type: null,
|
||||||
warnings: [],
|
warnings: [],
|
||||||
consumes: {
|
consumes: {
|
||||||
hp: 4,
|
hp: 8,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -1277,21 +1422,28 @@ const shop_data = {
|
|||||||
itemIds: [
|
itemIds: [
|
||||||
'zotino',
|
'zotino',
|
||||||
'fastino',
|
'fastino',
|
||||||
|
'hvamp32',
|
||||||
'novo',
|
'novo',
|
||||||
'shuttler']},
|
'shuttler']},
|
||||||
{ name: 'Adapters',
|
{ name: 'Adapters',
|
||||||
itemIds: [
|
itemIds: [
|
||||||
'idc-bnc-adapter',
|
'idc-bnc-adapter',
|
||||||
'idc-sma-adapter',
|
'idc-sma-adapter',
|
||||||
|
'idc-mcx-adapter',
|
||||||
'hd68-idc-adapter',
|
'hd68-idc-adapter',
|
||||||
'vhdcicarrier']},
|
'vhdcicarrier']},
|
||||||
|
{ name: 'Servos',
|
||||||
|
itemIds: [
|
||||||
|
'stabilizer',
|
||||||
|
'fast_servo',
|
||||||
|
'pounder',
|
||||||
|
'thermostat2ch',
|
||||||
|
'thermostat-eem']},
|
||||||
{ name: 'Misc',
|
{ name: 'Misc',
|
||||||
itemIds: [
|
itemIds: [
|
||||||
'koster',
|
'koster',
|
||||||
'stabilizer',
|
|
||||||
'pounder',
|
|
||||||
'thermostat-eem',
|
|
||||||
'eem_pwr_mod',
|
'eem_pwr_mod',
|
||||||
|
'kirdy',
|
||||||
]}
|
]}
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
40
static/sw.js
40
static/sw.js
@ -1,40 +0,0 @@
|
|||||||
var CACHE_NAME = 'ml-03';
|
|
||||||
var urlsToCache = [
|
|
||||||
'/css/bootstrap-5.3.0.min.css',
|
|
||||||
'/css/styles.css',
|
|
||||||
'/js/jquery-3.7.0.slim.min.js',
|
|
||||||
'/js/jquery-3.7.0.min.js',
|
|
||||||
'/js/bootstrap-5.3.0.min.js',
|
|
||||||
'/js/react.production.min.js',
|
|
||||||
'/js/react-dom.production.min.js',
|
|
||||||
'/js/prop-types.min.js',
|
|
||||||
'/js/react-beautiful-dnd.min.js',
|
|
||||||
'/js/uuid_v4@latest.js',
|
|
||||||
];
|
|
||||||
|
|
||||||
self.addEventListener('install', function(event) {
|
|
||||||
console.log('[SW] Install');
|
|
||||||
event.waitUntil(
|
|
||||||
caches.open(CACHE_NAME)
|
|
||||||
.then(function(cache) {
|
|
||||||
console.log('[SW] add to cache');
|
|
||||||
return cache.addAll(urlsToCache);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
self.addEventListener('fetch', function (event) {
|
|
||||||
console.log('[SW] Fetch');
|
|
||||||
event.respondWith(
|
|
||||||
caches.match(event.request).then(function (response) {
|
|
||||||
return response || fetch(event.request);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
self.addEventListener('message', function (event) {
|
|
||||||
if (event.data.action === 'skipWaiting') {
|
|
||||||
self.skipWaiting();
|
|
||||||
caches.delete(CACHE_NAME);
|
|
||||||
}
|
|
||||||
});
|
|
@ -43,7 +43,7 @@
|
|||||||
<link href="{{ get_url(path='favicon.ico', cachebust=true) }}" rel="shortcut icon" type="image/x-icon">
|
<link href="{{ get_url(path='favicon.ico', cachebust=true) }}" rel="shortcut icon" type="image/x-icon">
|
||||||
<link href="{{ get_url(path='favicon.ico', cachebust=true) }}" rel="icon" type="image/x-icon">
|
<link href="{{ get_url(path='favicon.ico', cachebust=true) }}" rel="icon" type="image/x-icon">
|
||||||
|
|
||||||
<link rel="stylesheet" href="{{ get_url(path='css/bootstrap-5.3.0.min.css', cachebust=true) }}">
|
<link rel="stylesheet" href="{{ get_url(path='css/bootstrap-5.3.0.opt.css', cachebust=true) }}">
|
||||||
<link rel="stylesheet" href="{{ get_url(path='css/styles.css', cachebust=true) }}">
|
<link rel="stylesheet" href="{{ get_url(path='css/styles.css', cachebust=true) }}">
|
||||||
{% block styles %}{% endblock %}
|
{% block styles %}{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
@ -85,7 +85,7 @@
|
|||||||
</a>
|
</a>
|
||||||
<div class="dropdown-menu shadow-none shadow-lg text-end text-lg-start" aria-labelledby="navbarDropdown">
|
<div class="dropdown-menu shadow-none shadow-lg text-end text-lg-start" aria-labelledby="navbarDropdown">
|
||||||
{% for page in subsection.pages %}
|
{% for page in subsection.pages %}
|
||||||
<a class="dropdown-item pt-2 pb-2 pt-sm-3 pb-sm-3" href="{{ page.permalink }}">{{ page.title }}</a>
|
<a class="dropdown-item pt-2 pb-2 pt-sm-3 pb-sm-3" href="{{ page.permalink | safe }}">{{ page.title }}</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@ -93,7 +93,7 @@
|
|||||||
{% elif subsection.title != 'Other' %}
|
{% elif subsection.title != 'Other' %}
|
||||||
|
|
||||||
<li class="nav-item ms-0 ms-md-4">
|
<li class="nav-item ms-0 ms-md-4">
|
||||||
<a class="nav-link" href="{{ subsection.permalink }}">{{ subsection.title }}</a>
|
<a class="nav-link" href="{{ subsection.permalink | safe }}">{{ subsection.title }}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -155,7 +155,6 @@
|
|||||||
|
|
||||||
<!-- ./FOOTER -->
|
<!-- ./FOOTER -->
|
||||||
|
|
||||||
<script src="{{ get_url(path='js/jquery-3.7.0.slim.min.js', cachebust=true) }}"></script>
|
|
||||||
<script src="{{ get_url(path='js/bootstrap-5.3.0.bundle.min.js', cachebust=true) }}"></script>
|
<script src="{{ get_url(path='js/bootstrap-5.3.0.bundle.min.js', cachebust=true) }}"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
<meta property="og:description" content="{% block og_description%}{{ config.description }}{% endblock %}">
|
<meta property="og:description" content="{% block og_description%}{{ config.description }}{% endblock %}">
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
<meta property="og:site_name" content="{{ config.extra.author }}">
|
<meta property="og:site_name" content="{{ config.extra.author }}">
|
||||||
<meta property="og:url" content="{{ config.base_url }}">
|
<meta property="og:url" content="{{ config.base_url | safe }}">
|
||||||
<meta property="og:image" content={{ get_url(path='images/logo@2x.png', cachebust=true) }}>
|
<meta property="og:image" content="{{ get_url(path='images/logo@2x.png', cachebust=true) }}">
|
||||||
{% block meta %}{% endblock meta %}
|
{% block meta %}{% endblock meta %}
|
||||||
|
|
||||||
<meta name="theme-color" content="#715ec7">
|
<meta name="theme-color" content="#715ec7">
|
||||||
@ -42,10 +42,21 @@
|
|||||||
<link href="{{ get_url(path='favicon.ico', cachebust=true) }}" rel="shortcut icon" type="image/x-icon">
|
<link href="{{ get_url(path='favicon.ico', cachebust=true) }}" rel="shortcut icon" type="image/x-icon">
|
||||||
<link href="{{ get_url(path='favicon.ico', cachebust=true) }}" rel="icon" type="image/x-icon">
|
<link href="{{ get_url(path='favicon.ico', cachebust=true) }}" rel="icon" type="image/x-icon">
|
||||||
|
|
||||||
{% block styles %}{% endblock %}
|
<link href="https://m-labs.hk{{ current_path | safe }}" rel="canonical" >
|
||||||
|
<link href="https://m-labs.hk{{ current_path | safe }}" rel="alternate" hreflang="x-default" >
|
||||||
|
<link href="https://m-labs.ph{{ current_path | safe }}" rel="alternate" hreflang="en-ph" >
|
||||||
|
<link href="https://m-labs-intl.com{{ current_path | safe }}" rel="alternate" hreflang="en-us" >
|
||||||
|
|
||||||
|
{% block links %}{% endblock %}
|
||||||
|
|
||||||
|
{% block styles %}
|
||||||
|
<link rel="stylesheet" href="{{ get_url(path='css/bootstrap-5.3.0.opt.css', cachebust=true) }}">
|
||||||
|
<link rel="stylesheet" href="{{ get_url(path='css/styles.css', cachebust=true) }}">
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body itemscope itemtype="https://schema.org/WebPage">
|
||||||
|
|
||||||
<!-- HEADER -->
|
<!-- HEADER -->
|
||||||
|
|
||||||
@ -53,7 +64,7 @@
|
|||||||
|
|
||||||
<header class="container">
|
<header class="container">
|
||||||
|
|
||||||
<nav class="navbar navbar-expand-lg navbar-light bg-th-1 justify-content-center justify-content-between pt-md-3 pb-md-3" role="navigation">
|
<nav class="navbar navbar-expand-lg navbar-light bg-th-1 justify-content-center justify-content-between pt-md-3 pb-md-3" role="navigation" itemscope itemtype="http://schema.org/SiteNavigationElement">
|
||||||
|
|
||||||
<a class="navbar-brand logo me-0" href="/">
|
<a class="navbar-brand logo me-0" href="/">
|
||||||
<img src="{{ get_url(path='images/logo@2x.png') }}" height="40" alt="logo">
|
<img src="{{ get_url(path='images/logo@2x.png') }}" height="40" alt="logo">
|
||||||
@ -83,11 +94,11 @@
|
|||||||
<div class="dropdown-menu shadow-none shadow-lg text-start text-lg-start" aria-labelledby="navbarDropdown">
|
<div class="dropdown-menu shadow-none shadow-lg text-start text-lg-start" aria-labelledby="navbarDropdown">
|
||||||
{% for tmp_page in subsection.pages %}
|
{% for tmp_page in subsection.pages %}
|
||||||
{% if tmp_page.extra.menu_item and tmp_page.extra.menu_item == "th1" %}
|
{% if tmp_page.extra.menu_item and tmp_page.extra.menu_item == "th1" %}
|
||||||
<a class="dropdown-item pt-2 pb-2 mx-4 mt-2 mb-2 mt-sm-3 mb-sm-3 w-auto btn btn-primary btn-inversed {% if current_path == tmp_page.path %}active{% endif %} rounded-1" href="{{ tmp_page.permalink }}">
|
<a class="dropdown-item pt-2 pb-2 mx-4 mt-2 mb-2 mt-sm-3 mb-sm-3 w-auto btn btn-primary btn-inversed {% if current_path == tmp_page.path %}active{% endif %} rounded-1" href="{{ tmp_page.permalink | safe }}" itemprop="url">
|
||||||
<center>{{ tmp_page.title }}</center>
|
<center>{{ tmp_page.title }}</center>
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a class="dropdown-item pt-2 pb-2 {% if current_path == tmp_page.path %}active{% endif %}" href="{{ tmp_page.permalink }}">{{ tmp_page.title }}</a>
|
<a class="dropdown-item pt-2 pb-2 {% if current_path == tmp_page.path %}active{% endif %}" href="{{ tmp_page.permalink | safe }}" itemprop="url">{{ tmp_page.title }}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
@ -96,7 +107,7 @@
|
|||||||
{% elif subsection.title != 'Other' %}
|
{% elif subsection.title != 'Other' %}
|
||||||
|
|
||||||
<li class="nav-item ms-0 ms-md-4 {% if current_path == subsection.path %}active{% endif %}">
|
<li class="nav-item ms-0 ms-md-4 {% if current_path == subsection.path %}active{% endif %}">
|
||||||
<a class="nav-link" href="{{ subsection.permalink }}">{{ subsection.title }}</a>
|
<a class="nav-link" href="{{ subsection.permalink | safe }}">{{ subsection.title }}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -125,25 +136,6 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
<!-- ./MAIN CONTENT -->
|
<!-- ./MAIN CONTENT -->
|
||||||
|
|
||||||
<noscript id="deferred-main-styles">
|
|
||||||
<link rel="stylesheet" href="{{ get_url(path='css/bootstrap-5.3.0.min.css', cachebust=true) }}">
|
|
||||||
<link rel="stylesheet" href="{{ get_url(path='css/styles.css', cachebust=true) }}">
|
|
||||||
{% block deferred_styles %}{% endblock %}
|
|
||||||
</noscript>
|
|
||||||
<script>
|
|
||||||
var loadDeferredMainStyles = function() {
|
|
||||||
var addStylesNode = document.getElementById("deferred-main-styles");
|
|
||||||
var replacement = document.createElement("div");
|
|
||||||
replacement.innerHTML = addStylesNode.textContent;
|
|
||||||
document.body.appendChild(replacement)
|
|
||||||
addStylesNode.parentElement.removeChild(addStylesNode);
|
|
||||||
};
|
|
||||||
var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
|
|
||||||
window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
|
|
||||||
if (raf) raf(function() { window.setTimeout(loadDeferredMainStyles, 0); });
|
|
||||||
else window.addEventListener('load', loadDeferredMainStyles);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- FOOTER -->
|
<!-- FOOTER -->
|
||||||
|
|
||||||
{% block footer %}
|
{% block footer %}
|
||||||
@ -155,8 +147,8 @@
|
|||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
<p class="pt-4 pb-2 text-center">
|
<p class="pt-4 pb-2 text-center" itemprop="copyrightNotice">
|
||||||
<small>Copyright © <span id="copyright_year"></span>, M-Labs. All rights reserved. ARTIQ, the ARTIQ logo, Migen and nMigen are registered or unregistered trademarks.</small>
|
<small>Copyright © <span id="copyright_year" itemprop="copyrightYear">{{ now() | date(format="%Y") }}</span>, <span itemprop="copyrightHolder">M-Labs</span>. All rights reserved. ARTIQ, the ARTIQ logo, Migen and nMigen are registered or unregistered trademarks.</small>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{% block fcopyright %}
|
{% block fcopyright %}
|
||||||
@ -181,11 +173,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script src="{{ get_url(path='js/bootstrap-5.3.0.bundle.min.js', cachebust=true) }}" defer></script>
|
||||||
<!-- <script src="{{ get_url(path='js/as.js', cachebust=true) }}"></script> -->
|
|
||||||
|
|
||||||
<script src="{{ get_url(path='js/jquery-3.7.0.min.js', cachebust=true) }}"></script>
|
|
||||||
<script src="{{ get_url(path='js/bootstrap-5.3.0.bundle.min.js', cachebust=true) }}"></script>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
@ -199,16 +187,20 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(function () {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
$('#modalEnlarged').on('hidden.bs.modal', function (e) {
|
const modal = document.getElementById('modalEnlarged');
|
||||||
$('#enlarged').attr('src', '');
|
const enlargedImg = document.getElementById('enlarged');
|
||||||
});
|
|
||||||
|
|
||||||
$('[data-popup]').click(function (evt) {
|
modal.addEventListener('hidden.bs.modal', function() {
|
||||||
var _self = $(this);
|
enlargedImg.src = '';
|
||||||
var _img_enlarged = _self.data('nsrc');
|
});
|
||||||
$('#enlarged').attr('src', _img_enlarged);
|
document.querySelectorAll('[data-popup]').forEach(function(element) {
|
||||||
$('#modalEnlarged').modal('show');
|
element.addEventListener('click', function() {
|
||||||
|
const imgSrc = this.dataset.nsrc;
|
||||||
|
enlargedImg.src = imgSrc;
|
||||||
|
const bsModal = new bootstrap.Modal(modal);
|
||||||
|
bsModal.show();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,28 +1,32 @@
|
|||||||
<div class="row pt-5 pb-5">
|
<div class="row pt-5 pb-5">
|
||||||
|
|
||||||
<div class="col-12 col-md-6 pb-5 pb-md-0">
|
<div class="col-12 col-md-6 pb-5 pb-md-0" itemscope itemtype="https://schema.org/ContactPoint">
|
||||||
|
|
||||||
<h5 class="pb-3">Sales inquiries</h5>
|
<h5 class="pb-3" itemprop="contactType">Sales inquiries</h5>
|
||||||
|
|
||||||
<p>
|
<p itemprop="description">
|
||||||
To purchase ARTIQ Sinara hardware, software and gateware development services, or to enter a technical support agreement, write to <a href="mailto:sales@m-labs.hk">sales@m-labs.hk</a>.
|
To purchase ARTIQ Sinara hardware, software and gateware development services, or to enter a technical support agreement, write to <a href="mailto:sales@{{get_env(name="DOMAINNAME", default="m-labs.hk")}}" itemprop="email">sales@{{get_env(name="DOMAINNAME", default="m-labs.hk")}}</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12 col-md-6 pb-5 pb-md-0">
|
<div class="col-12 col-md-6 pb-5 pb-md-0">
|
||||||
|
|
||||||
<h5 class="pb-3">Commercial technical support</h5>
|
<div class="pb-3" itemscope itemtype="https://schema.org/ContactPoint">
|
||||||
|
<h5 class="pb-3" itemprop="contactType">Commercial technical support</h5>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If you need help setting up ARTIQ hardware purchased from us, or if you have a commercial technical support agreement with us, email us anytime at <a href="mailto:helpdesk@m-labs.hk">helpdesk@m-labs.hk</a>.
|
If you need help setting up ARTIQ hardware purchased from us, or if you have a commercial technical support agreement with us, email us anytime at <a href="mailto:helpdesk@{{get_env(name="DOMAINNAME", default="m-labs.hk")}}" itemprop="email">helpdesk@{{get_env(name="DOMAINNAME", default="m-labs.hk")}}</a>.
|
||||||
</p>
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h5 class="pb-3">Community support</h5>
|
<div class="mt-3" itemscope itemtype="https://schema.org/ContactPoint">
|
||||||
|
<h5 class="pb-3" itemprop="contactType">Community support</h5>
|
||||||
|
|
||||||
<p>
|
<p itemprop="description">
|
||||||
Our open source projects such as ARTIQ have an active user community. Get and offer help on the <a href="https://chat.m-labs.hk/" target="_blank" rel="noopener noreferrer">Mattermost chat</a>, on IRC #m-labs on OFTC, or on <a href="https://forum.m-labs.hk/" rel="noopener noreferrer" target="_blank">the forum</a>.
|
Our open source projects such as ARTIQ have an active user community. Get and offer help on the <a href="https://chat.m-labs.hk/" target="_blank" rel="noopener noreferrer" itemprop="url">Mattermost chat</a>, on IRC #m-labs on OFTC, or on <a href="https://forum.m-labs.hk/" rel="noopener noreferrer" target="_blank" itemprop="url">the forum</a>.
|
||||||
</p>
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
{% extends '_base.html' %}
|
{% extends '_base.html' %}
|
||||||
|
|
||||||
|
{% block links %}
|
||||||
|
<link rel="preload" href="images/hero@2x.png" as="image" >
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block hero %}
|
{% block hero %}
|
||||||
|
|
||||||
@ -11,7 +14,7 @@
|
|||||||
|
|
||||||
<div class="col-12 text-center">
|
<div class="col-12 text-center">
|
||||||
|
|
||||||
<h1>Open tools for open physics.</h1>
|
<h1 itemprop="headline">Open tools for open physics.</h1>
|
||||||
|
|
||||||
<img src="{{ get_url(path='images/ion@2x.png', cachebust=true) }}" height="12" alt="ion">
|
<img src="{{ get_url(path='images/ion@2x.png', cachebust=true) }}" height="12" alt="ion">
|
||||||
|
|
||||||
@ -34,14 +37,15 @@
|
|||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
|
|
||||||
<div class="card shadow mt-3 mb-3">
|
<div class="card shadow mt-3 mb-3" itemscope itemtype="https://schema.org/Poster">
|
||||||
|
|
||||||
<div class="card-body p-3 p-md-5 card-artiq">
|
<div class="card-body p-3 p-md-5 card-artiq">
|
||||||
|
|
||||||
<div class="col-12 col-md-6 ps-0 pe-0">
|
<div class="col-12 col-md-6 ps-0 pe-0">
|
||||||
|
|
||||||
<h5 class="card-title">ARTIQ</h5>
|
<h5 class="card-title" itemprop="headline">ARTIQ</h5>
|
||||||
|
|
||||||
|
<div class="desc-wrapper" itemprop="description">
|
||||||
<p class="card-text pt-3">
|
<p class="card-text pt-3">
|
||||||
ARTIQ (Advanced Real-Time Infrastructure for Quantum physics) is a leading-edge control system for quantum information experiments, developed in partnership with a growing number of research institutions worldwide.
|
ARTIQ (Advanced Real-Time Infrastructure for Quantum physics) is a leading-edge control system for quantum information experiments, developed in partnership with a growing number of research institutions worldwide.
|
||||||
</p>
|
</p>
|
||||||
@ -49,16 +53,44 @@
|
|||||||
<p class="card-text pt-3 pb-3">
|
<p class="card-text pt-3 pb-3">
|
||||||
The system features a high-level programming language that helps describe complex experiments, which is compiled and executed on dedicated hardware with nanosecond timing resolution and sub-microsecond latency.
|
The system features a high-level programming language that helps describe complex experiments, which is compiled and executed on dedicated hardware with nanosecond timing resolution and sub-microsecond latency.
|
||||||
</p>
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<a href="{{ get_url(path='@/experiment-control/place-order.md') }}" class="btn btn-primary btn-inversed btn-lg">Order hardware</a>
|
<a href="{{ get_url(path='@/experiment-control/place-order.md') }}" class="btn btn-primary btn-inversed btn-lg" itemprop="url">Order hardware</a>
|
||||||
<a href="https://m-labs.hk/artiq/manual/" class="btn btn-primary btn-lg">Manual</a>
|
<a href="https://m-labs.hk/artiq/manual/" class="btn btn-primary btn-lg" itemprop="url">Manual</a>
|
||||||
<a href="https://forum.m-labs.hk" class="btn btn-primary btn-lg">Forum</a>
|
<a href="https://forum.m-labs.hk" class="btn btn-primary btn-lg" itemprop="url">Forum</a>
|
||||||
<a href="https://nixbld.m-labs.hk/job/artiq/extra/msys2-offline-installer/latest/download/1" class="btn btn-primary btn-lg d-inline-flex">
|
<a href="{{ get_url(path='@/experiment-control/artiq.md') }}" class="btn btn-primary btn-lg" itemprop="url">More...</a>
|
||||||
<img src="/images/icons/icon-download.svg" class="d-inline-block align-self-center mx-1" style="height: 1rem" alt="download">
|
<div class="btn-group download-selector" >
|
||||||
Windows installer
|
<a class="btn btn-primary btn-lg d-inline-flex" href="https://nixbld.m-labs.hk/job/artiq/extra/msys2-offline-installer/latest/download/1">
|
||||||
</a>
|
<img src="/images/icons/icon-windows.svg" class="d-inline-block align-self-center mx-1" style="height: 1rem" alt="windows">
|
||||||
<a href="{{ get_url(path='@/experiment-control/artiq.md') }}" class="btn btn-primary btn-lg">More...</a>
|
<span class="d-inline-block">Download <sup>.exe</sup></span>
|
||||||
|
</a>
|
||||||
|
<div class="divider"></div>
|
||||||
|
<button type="button" class="btn btn-primary btn-lg dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
<span>stable</span>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu shadow dropdown-menu-end">
|
||||||
|
<li itemscope itemtype="https://schema.org/SoftwareApplication">
|
||||||
|
<a class="dropdown-item" href="https://nixbld.m-labs.hk/job/artiq/extra/msys2-offline-installer/latest/download/1" itemprop="downloadUrl">
|
||||||
|
<span itemprop="softwareVersion"><span itemprop="name">ARTIQ</span>-8 (stable) for <span itemprop="operatingSystem">Windows</span></span>
|
||||||
|
</a>
|
||||||
|
<div hidden itemprop="offers" itemtype="https://schema.org/Offer" itemscope>
|
||||||
|
<div itemprop="price">
|
||||||
|
0
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li itemscope itemtype="https://schema.org/SoftwareApplication">
|
||||||
|
<a class="dropdown-item" href="https://nixbld.m-labs.hk/job/artiq/extra-beta/msys2-offline-installer/latest/download/1" itemprop="downloadUrl">
|
||||||
|
<span itemprop="softwareVersion"><span itemprop="name">ARTIQ</span>-9 (beta) for <span itemprop="operatingSystem">Windows</span></span>
|
||||||
|
</a>
|
||||||
|
<div hidden itemprop="offers" itemtype="https://schema.org/Offer" itemscope>
|
||||||
|
<div itemprop="price">
|
||||||
|
0
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -73,22 +105,24 @@
|
|||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
|
|
||||||
<div class="card shadow mt-3 mb-3">
|
<div class="card shadow mt-3 mb-3" itemscope itemtype="https://schema.org/Poster">
|
||||||
|
|
||||||
<div class="card-body p-3 p-md-5 card-jobs">
|
<div class="card-body p-3 p-md-5 card-jobs">
|
||||||
|
|
||||||
<div class="col-12 col-md-6 ps-0 pe-0">
|
<div class="col-12 col-md-6 ps-0 pe-0">
|
||||||
|
|
||||||
<h5 class="card-title">Jobs</h5>
|
<h5 class="card-title" itemprop="headline">Jobs</h5>
|
||||||
|
|
||||||
|
<div class="desc-wrapper" itemprop="description">
|
||||||
<p class="card-text pt-3">
|
<p class="card-text pt-3">
|
||||||
We are always looking for talented people to join our team and help us deliver the systems that enable the experimental quantum research of tomorrow.
|
We are always looking for talented people to join our team and help us deliver the systems that enable the experimental quantum research of tomorrow.
|
||||||
</p>
|
</p>
|
||||||
<p class="card-text pt-3">
|
<p class="card-text pt-3">
|
||||||
If you are good at software, electronics or photonics, and physics makes you tick, then you should get in touch. Locations in Hong Kong and Manila available.
|
If you are good at software, electronics or photonics, and physics makes you tick, then you should get in touch. Locations in Hong Kong and Manila available.
|
||||||
</p>
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<a href="{{ get_url(path='@/about-us/jobs.md') }}" class="btn btn-primary btn-lg">Find out more...</a>
|
<a href="{{ get_url(path='@/about-us/jobs.md') }}" class="btn btn-primary btn-lg" itemprop="url">Find out more...</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -104,14 +138,15 @@
|
|||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
|
|
||||||
<div class="card shadow mt-3 mb-3">
|
<div class="card shadow mt-3 mb-3" itemscope itemtype="https://schema.org/Poster">
|
||||||
|
|
||||||
<div class="card-body p-3 p-md-5 card-gateware">
|
<div class="card-body p-3 p-md-5 card-gateware">
|
||||||
|
|
||||||
<div class="col-12 col-md-6 ps-0 pe-0">
|
<div class="col-12 col-md-6 ps-0 pe-0">
|
||||||
|
|
||||||
<h5 class="card-title">Gateware and system-on-chip design</h5>
|
<h5 class="card-title" itemprop="headline">Gateware and system-on-chip design</h5>
|
||||||
|
|
||||||
|
<div class="desc-wrapper" itemprop="description">
|
||||||
<p class="card-text pt-3">
|
<p class="card-text pt-3">
|
||||||
Traditional gateware design with Verilog and VHDL is well known to be tedious and inefficient. M-Labs have developed Migen, a Python-based HDL and toolbox that addresses many of their issues and makes gateware design more productive.
|
Traditional gateware design with Verilog and VHDL is well known to be tedious and inefficient. M-Labs have developed Migen, a Python-based HDL and toolbox that addresses many of their issues and makes gateware design more productive.
|
||||||
</p>
|
</p>
|
||||||
@ -119,8 +154,9 @@
|
|||||||
<p class="card-text pt-3 pb-3">
|
<p class="card-text pt-3 pb-3">
|
||||||
Built on Migen, MiSoC provides a high performance, flexible and lightweight solution to build system-on-chips for various applications.
|
Built on Migen, MiSoC provides a high performance, flexible and lightweight solution to build system-on-chips for various applications.
|
||||||
</p>
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<a href="{{ get_url(path='@/gateware/migen.md') }}" class="btn btn-primary btn-lg">Read more...</a>
|
<a href="{{ get_url(path='@/gateware/migen.md') }}" class="btn btn-primary btn-lg" itemprop="url">Read more...</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
{% extends 'section.html' %}
|
{% extends 'section.html' %}
|
||||||
|
|
||||||
|
|
||||||
{% block deferred_styles %}
|
{% block styles %}
|
||||||
{{ super() }}
|
<link rel="stylesheet" href="{{ get_url(path='css/bootstrap-5.3.0.min.css', cachebust=true) }}">
|
||||||
|
<link rel="stylesheet" href="{{ get_url(path='css/styles.css', cachebust=true) }}">
|
||||||
<link rel="stylesheet" href="{{ get_url(path='css/order-hardware.css', cachebust=true) }}">
|
<link rel="stylesheet" href="{{ get_url(path='css/order-hardware.css', cachebust=true) }}">
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
@ -46,6 +47,11 @@
|
|||||||
<!-- Load Data -->
|
<!-- Load Data -->
|
||||||
<script src="{{ get_url(path='js/shop_data.js', cachebust=true) }}"></script>
|
<script src="{{ get_url(path='js/shop_data.js', cachebust=true) }}"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
window.DOMAIN = "{{get_env(name="DOMAINNAME", default="m-labs.hk")}}";
|
||||||
|
window.API_RFQ = `https://hooks.${window.DOMAIN}/rfq`;
|
||||||
|
</script>
|
||||||
|
|
||||||
<!-- Load our React component. -->
|
<!-- Load our React component. -->
|
||||||
<!-- <script type="text/babel" src="{{ get_url(path='js/shop.jsx', cachebust=true) }}"></script> -->
|
<!-- <script type="text/babel" src="{{ get_url(path='js/shop.jsx', cachebust=true) }}"></script> -->
|
||||||
<script src="{{ get_url(path='js/shop.bundle.js', cachebust=true) }}"></script>
|
<script src="{{ get_url(path='js/shop.bundle.js', cachebust=true) }}"></script>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
{% extends 'section.html' %}
|
{% extends 'section.html' %}
|
||||||
|
|
||||||
{% block styles %}
|
{% block styles %}
|
||||||
|
{{ super() }}
|
||||||
<style>
|
<style>
|
||||||
h5 {
|
h5 {
|
||||||
margin-bottom: 2rem!important;
|
margin-bottom: 2rem!important;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{% block main %}
|
{% block main %}
|
||||||
|
|
||||||
<main class="container {% block maincss %}{% endblock %}">
|
<main class="container {% block maincss %}{% endblock %}" xmlns="http://www.w3.org/1999/html">
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{% block main_content %}
|
{% block main_content %}
|
||||||
@ -14,26 +14,28 @@
|
|||||||
{% set publications = load_data(path=page.extra.data, format="yaml") -%}
|
{% set publications = load_data(path=page.extra.data, format="yaml") -%}
|
||||||
{% for publication in publications %}
|
{% for publication in publications %}
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="card shadow h-100" >
|
<div class="card shadow h-100" itemscope itemtype="https://schema.org/ScholarlyArticle">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<strong class="card-title">{{ publication.title | safe }}</strong>
|
<strong class="card-title" itemprop="headline">{{ publication.title | safe }}</strong>
|
||||||
{% if publication.authors.short or publication.authors.full %}
|
{% if publication.authors.short or publication.authors.full %}
|
||||||
<p class="card-text">
|
<p class="card-text">
|
||||||
|
<span itemprop="author">
|
||||||
{{ publication.authors.short | safe }}
|
{{ publication.authors.short | safe }}
|
||||||
<span class="collapse" id="viewdetails{{ publication.title | slugify | truncate(length=20, end="")}}">
|
<span class="collapse" id="viewdetails{{ publication.title | slugify | truncate(length=20, end="")}}">
|
||||||
{{ publication.authors.full }}
|
{{ publication.authors.full }}
|
||||||
</span>
|
</span>
|
||||||
|
</span>
|
||||||
<a data-bs-toggle="collapse" class="hide-expanded" data-bs-target="#viewdetails{{ publication.title | slugify | truncate(length=20, end="") }}"> ...more</a>
|
<a data-bs-toggle="collapse" class="hide-expanded" data-bs-target="#viewdetails{{ publication.title | slugify | truncate(length=20, end="") }}"> ...more</a>
|
||||||
<a data-bs-toggle="collapse" class="show-expanded" data-bs-target="#viewdetails{{ publication.title | slugify | truncate(length=20, end="") }}"><br>less</a>
|
<a data-bs-toggle="collapse" class="show-expanded" data-bs-target="#viewdetails{{ publication.title | slugify | truncate(length=20, end="") }}"><br>less</a>
|
||||||
</p>
|
</p>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p class="card-text">{{ publication.authors }}</p>
|
<p class="card-text" itemprop="author">{{ publication.authors }}</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="card-footer border-light-subtle">
|
<div class="card-footer border-light-subtle">
|
||||||
{% for link in publication.links %}
|
{% for link in publication.links %}
|
||||||
{% if link.path %}
|
{% if link.path %}
|
||||||
<a href="{{link.path}}" class="card-link">{{link.name}}</a>
|
<a href="{{link.path | safe}}" class="card-link" itemprop="archivedAt">{{link.name}}</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class="card-link d-inline">{{link.name}}</div>
|
<div class="card-link d-inline">{{link.name}}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
1
templates/shortcodes/email.html
Normal file
1
templates/shortcodes/email.html
Normal file
@ -0,0 +1 @@
|
|||||||
|
<a href="mailto:{{address}}@{{get_env(name="DOMAINNAME", default="m-labs.hk")}}">{{address}}@{{get_env(name="DOMAINNAME", default="m-labs.hk")}}</a>
|
@ -1,23 +1,23 @@
|
|||||||
<div class="{% if css %}{{ css }}{% else %}col-12 col-md-4{% endif %} mb-4">
|
<div class="{% if css %}{{ css }}{% else %}col-12 col-md-4{% endif %} mb-4">
|
||||||
|
|
||||||
<div class="{% if not rmcard %}card shadow{% endif %} h-100">
|
<div class="{% if not rmcard %}card shadow{% endif %} h-100" itemscope itemtype="https://schema.org/Thing">
|
||||||
|
|
||||||
{% if not imgbottom %}
|
{% if not imgbottom %}
|
||||||
|
|
||||||
{% if src %}
|
{% if src %}
|
||||||
<div class="px-auto pt-4">
|
<div class="px-auto pt-4">
|
||||||
<img src="{{ get_url(path=src, cachebust=true) }}" width="40px">
|
<img src="{{ get_url(path=src, cachebust=true) }}" width="40px" itemprop="image">
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% if title %}
|
{% if title %}
|
||||||
<div class="card-title">
|
<div class="card-title" itemprop="name">
|
||||||
<h5 class="mb-0">{{ title }}</h5>
|
<h5 class="mb-0">{{ title }}</h5>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div {% if sameheight %}style="min-height: {{ sameheight }}px"{% endif%}>
|
<div {% if sameheight %}style="min-height: {{ sameheight }}px"{% endif%} itemprop="description">
|
||||||
{{ body | markdown | safe }}
|
{{ body | markdown | safe }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -27,18 +27,18 @@
|
|||||||
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% if title %}
|
{% if title %}
|
||||||
<div class="card-title">
|
<div class="card-title" itemprop="name">
|
||||||
<h5 class="mb-0">{{ title }}</h5>
|
<h5 class="mb-0">{{ title }}</h5>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{{ body | markdown | safe }}
|
<span itemprop="description">{{ body | markdown | safe }}</span>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if src %}
|
{% if src %}
|
||||||
<div class="">
|
<div class="">
|
||||||
<img src="{{ get_url(path=src, cachebust=true) }}" class="card-img img-fluid">
|
<img src="{{ get_url(path=src, cachebust=true) }}" class="card-img img-fluid" itemprop="image">
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
@ -1,24 +1,24 @@
|
|||||||
{% if position == "left" %}
|
{% if position == "left" %}
|
||||||
|
|
||||||
<div class="card mb-3 shadow" style="max-width: 80%;margin-right: 20%;">
|
<div class="card mb-3 shadow" style="max-width: 80%;margin-right: 20%;" itemscope itemtype="https://schema.org/Grant">
|
||||||
<div class="row g-0">
|
<div class="row g-0">
|
||||||
<div class="col-md-4 funding-logo-start d-flex p-1 justify-content-center">
|
<div class="col-md-4 funding-logo-start d-flex p-1 justify-content-center">
|
||||||
{% if logo %}
|
{% if logo %}
|
||||||
{% if logo_link %}<a href="{{ logo_link }}" class="align-self-center">{% endif %}
|
{% if logo_link %}<a href="{{ logo_link | safe }}" class="align-self-center" itemprop="url">{% endif %}
|
||||||
<img src="{{ logo }}" class="img-fluid rounded" alt="{{ logo_alt }}"/>
|
<img src="{{ logo | safe }}" class="img-fluid rounded" alt="{{ logo_alt }}" itemprop="image"/>
|
||||||
{% if logo_link %}</a>{% endif %}
|
{% if logo_link %}</a>{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% if title %}<h5 class="card-title">{{ title | markdown | safe }}</h5>{% endif %}
|
{% if title %}<h5 class="card-title" itemprop="sponsor">{{ title | markdown | safe }}</h5>{% endif %}
|
||||||
{% if icon %}
|
{% if icon %}
|
||||||
<span class="badge bg-transparent position-absolute top-0 start-100 translate-middle-x">
|
<span class="badge bg-transparent position-absolute top-0 start-100 translate-middle-x">
|
||||||
<img src="{{ icon }}" alt="{{ icon }}" class="rounded"
|
<img src="{{ icon | safe }}" alt="{{ icon }}" class="rounded"
|
||||||
style="height: 2rem;"/>
|
style="height: 2rem;"/>
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<p class="card-text">{{ body | markdown | safe }}</p>
|
<div class="card-text" itemprop="description">{{ body | markdown | safe }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -26,24 +26,24 @@
|
|||||||
|
|
||||||
{% elif position == "right" %}
|
{% elif position == "right" %}
|
||||||
|
|
||||||
<div class="card mb-3 shadow" style="max-width: 80%;margin-left: 20%;">
|
<div class="card mb-3 shadow" style="max-width: 80%;margin-left: 20%;" itemscope itemtype="https://schema.org/Grant">
|
||||||
<div class="row g-0">
|
<div class="row g-0">
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% if title %}<h5 class="card-title text-end">{{ title | markdown | safe }}</h5>{% endif %}
|
{% if title %}<h5 class="card-title text-end" itemprop="sponsor">{{ title | markdown | safe }}</h5>{% endif %}
|
||||||
{% if icon %}
|
{% if icon %}
|
||||||
<span class="badge bg-transparent position-absolute top-0 start-0 translate-middle-x">
|
<span class="badge bg-transparent position-absolute top-0 start-0 translate-middle-x">
|
||||||
<img src="{{ icon }}" alt="{{ icon }}" class="rounded"
|
<img src="{{ icon | safe }}" alt="{{ icon }}" class="rounded"
|
||||||
style="height: 2rem;"/>
|
style="height: 2rem;"/>
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<p class="card-text">{{ body | markdown | safe }}</p>
|
<div class="card-text" itemprop="description">{{ body | markdown | safe }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4 funding-logo-end d-flex p-1 justify-content-center">
|
<div class="col-md-4 funding-logo-end d-flex p-1 justify-content-center">
|
||||||
{% if logo %}
|
{% if logo %}
|
||||||
{% if logo_link %}<a href="{{ logo_link }}" class="align-self-center">{% endif %}
|
{% if logo_link %}<a href="{{ logo_link | safe }}" class="align-self-center" itemprop="url">{% endif %}
|
||||||
<img src="{{ logo }}" class="img-fluid rounded" alt="{{ logo_alt }}"/>
|
<img src="{{ logo | safe }}" class="img-fluid rounded" alt="{{ logo_alt }}" itemprop="image" />
|
||||||
{% if logo_link %}</a>{% endif %}
|
{% if logo_link %}</a>{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
@ -52,12 +52,12 @@
|
|||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
||||||
<div class="card mb-3 shadow-sm" style="max-width: 100%;">
|
<div class="card mb-3 shadow-sm" style="max-width: 100%;" itemscope itemtype="https://schema.org/Poster">
|
||||||
<div class="row g-0">
|
<div class="row g-0">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% if title %}<h4 class="card-title text-center">{{ title | markdown | safe }}</h4>{% endif %}
|
{% if title %}<h4 class="card-title text-center" itemprop="headline">{{ title | markdown | safe }}</h4>{% endif %}
|
||||||
<p class="card-text">{{ body | markdown | safe }}</p>
|
<div class="card-text" itemprop="description">{{ body | markdown | safe }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
<div class="{% if css %}{{ css }}{% else %}row d-flex align-items-center mt-5 mb-5{% endif %}">
|
|
||||||
|
|
||||||
{{ body | safe }}
|
|
||||||
|
|
||||||
</div>
|
|
Loading…
Reference in New Issue
Block a user