Compare commits

...

47 Commits

Author SHA1 Message Date
769ce960d4 improve phone news header 2025-02-16 21:28:39 +08:00
342742789d fix phone news header 2025-02-16 21:19:21 +08:00
effcd917a0 add news 2025-02-16 21:13:33 +08:00
d43ced5969 add overpayment FAQ entry 2025-02-16 21:11:09 +08:00
9896752e16 add new Oxford paper 2025-02-10 16:35:46 +08:00
e79d33e2e5 update community resources 2025-02-07 22:50:19 +08:00
53863b048c HVAmp doesn't actually have break-out ports
Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-02-07 13:25:52 +08:00
8fc3f3086d Embed microdata to some pages
Only to some, where it is not invasive and can be useful. If the microdata will be successful in SE rankings, it can be expanded more.

Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-01-23 16:04:31 +08:00
c92e4c5488 Fix links and nested p tags
Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-01-23 16:04:31 +08:00
feda1c2942 Add alternate links to target different regions and make .hk site canonical
Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-01-23 16:04:31 +08:00
c9190565a0 Remove dead SW code
Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-01-23 16:04:31 +08:00
3ccbd41ef2 Fix and optimize shop styles and remove jquery
Reduce bootstrap bundle, replace jquery dependant code and remove jquery. Optimize style loading.
Overall the lighthouse metrics are far better now.

Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-01-23 16:04:31 +08:00
037cadbe6d Replace deferred styles with standard linking
This alone improves CLS from 0.9 down to 0.005, and overall score in lighthouse to green values

Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-01-23 16:04:31 +08:00
68828c65d3 Fix robots.txt
Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-01-23 16:04:31 +08:00
a083a4f3ab update MCX prices 2025-01-21 14:58:03 +08:00
4af4e4c055 faq: raise APC threshold 2025-01-20 10:03:41 +08:00
573fd4a848 Add switch for requesting manufacturing outside HK
Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-01-10 13:03:31 +08:00
3daa02c5bb Fix adapter datasheet links 2025-01-08 19:02:43 +01:00
7841bd804a Remove layout_html shortcode
It is used only once and can easily be replaced with inline div, resulting in shorter code. Also fixes broken email within its usage

Signed-off-by: Egor Savkin <es@m-labs.hk>
2025-01-07 17:37:50 +08:00
47e8999927 link new datasheets 2025-01-04 16:34:57 +08:00
ee29235b74 add new datasheets 2025-01-04 16:23:10 +08:00
1efcdc11d3 update datasheets 2025-01-04 16:21:29 +08:00
5fdf5f1ea0 Fix tec counter
Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-12-23 12:51:39 +08:00
4ee4e5fb23 hvamp: increase price 2024-12-20 11:16:42 +08:00
2df8078988 hvamp: clarify 2024-12-20 11:16:33 +08:00
7220ee0e68 Update HVAMP32 according to the factual specs
Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-12-20 11:16:02 +08:00
5856369684 remove invalid entry from config.toml 2024-12-04 23:01:19 +08:00
a5a8589b28 add link to OffsetStabilizer 2024-11-16 11:55:30 +08:00
bb42788fd3 remove dead link/project 2024-10-30 22:03:16 +08:00
f29807a913 Optimize the download button
Replace download button with windows icon (just four squares).
Make the download button last so on certain screens it wouldn't cause additional empty-ish lines.
Redo the wording so the button is shorter, but the dropdown menu is filled.

Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-10-21 17:46:40 +08:00
9d9a4c9f5a Split dropdown
On main click it downloads stable, in dropdown there are two choices - stable and beta. Similar to the downloads on jetbrains website

Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-10-21 15:32:19 +08:00
92f7428ac8 Replace download button with dropdown
Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-10-18 12:29:19 +08:00
a163a269b9 Update NUC
Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-10-17 11:10:40 +08:00
f087a00cee Fix price not getting updated on crate clear and deletion
Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-10-04 11:25:49 +08:00
f69102fa0e update FAQ 2024-10-02 13:56:35 +08:00
0d978c1e22 Add mcx-idc 32 channel to the shop
The icon had to be altered in order to lower the risk of triggering trypophobia

Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-09-27 13:47:04 +08:00
76bc87ce5c faq: add entries 2024-09-10 18:45:12 +08:00
3987343e16 advertise Phaser MIQRO gateware 2024-08-27 22:48:42 +08:00
8a12d35c06 faq: add US mirror 2024-08-14 12:51:09 +08:00
d2ae816cb0 add links to cheap boards 2024-08-12 17:11:38 +08:00
bcdf005896 Fix pounder and eem pwr mode hp consumption
Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-08-09 12:03:43 +08:00
b53e191528 Update and clean up NPM dependencies
npm audit also reported 0 vulnerabilities

Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-08-05 11:26:28 +08:00
52c05c2e2a Move out subcomponents of ProductItem
This improves maintenance as it reduces complexity of the ProductItem component and allows seeing components in react dev tools

Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-08-05 11:25:32 +08:00
c7b0d5568c Fix options pop up being both first and last
Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-08-05 11:25:32 +08:00
68677dce6e Make tooltip icons inline
Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-08-05 10:29:26 +08:00
b0ef9d07fc Remove unused type field from shop_data
Signed-off-by: Egor Savkin <es@m-labs.hk>
2024-08-05 10:29:01 +08:00
cedf853301 edit Kirdy description 2024-08-04 12:01:07 +08:00
51 changed files with 2199 additions and 1554 deletions

View File

@ -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]

View File

@ -33,6 +33,7 @@ Typical countries where this situation happens and suitable distributor contacts
* China (mainland): kitty-zheng@kehua-trade.com * China (mainland): kitty-zheng@kehua-trade.com
* Japan: hishida@symphotony.com or h_yamamoto@autex-inc.co.jp * Japan: hishida@symphotony.com or h_yamamoto@autex-inc.co.jp
* India: sale.sannidhi@gmail.com * 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. 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.
@ -43,7 +44,7 @@ M-Labs ships with UPS by default, and we also offer FedEx or DHL shipping for an
##### Can I have a discount? ##### Can I have a discount?
M-Labs offers discounts in the following cases: 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 500.00 or less. * 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): * 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. - 2% discount with an order volume exceeding USD 100,000.00.
- 4% discount with an order volume exceeding USD 250,000.00. - 4% discount with an order volume exceeding USD 250,000.00.
@ -52,7 +53,25 @@ M-Labs offers discounts in the following cases:
* 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, ...). * 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. 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? ##### 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 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.
@ -69,10 +88,28 @@ We accept all major currencies including USD, EUR, RMB, GBP, BTC and XMR.
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. 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.
##### I have overpaid or double-paid an invoice. What should I do?
Contact sb@m-labs.hk and we will return the excess funds within a few business days. You shall pay all banking and credit card charges incurred.
##### We are a distributor. Can we have exclusive rights to your products? ##### 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. 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? ##### We are a recruitment firm. Can we help you find talent?
No. No.

View File

@ -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>
@ -66,7 +66,7 @@ The <a href="https://github.com/quartiq/stabilizer" target="_blank" rel="noopene
</p> </p>
</div> </div>
{% end %} </div>

View File

@ -1,3 +1,11 @@
- title: "Distributed quantum computing across an optical network link"
authors: "D. Main, P. Drmota, D. P. Nadlinger, E. M. Ainley, A. Agrawal, B. C. Nichol, R. Srinivas, G. Araneda & D. M. Lucas"
links:
- name: "Nature (2025)"
path: "https://www.nature.com/articles/s41586-024-08404-x"
- name: "Announcement"
path: "https://www.ox.ac.uk/news/2025-02-06-first-distributed-quantum-algorithm-brings-quantum-supercomputers-closer"
- title: "Fast quantum logic gates with trapped-ion qubits" - title: "Fast quantum logic gates with trapped-ion qubits"
authors: "V.M. Schäfer, C.J. Ballance, K. Thirumalai, L.J. Stephenson, T.G. Ballance, A.M. Steane & D.M. Lucas" authors: "V.M. Schäfer, C.J. Ballance, K. Thirumalai, L.J. Stephenson, T.G. Ballance, A.M. Steane & D.M. Lucas"
links: links:

View File

@ -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>&nbsp;</small> <small>&nbsp;</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>&nbsp;</small> <small>&nbsp;</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>&nbsp;</small> <small>&nbsp;</small>
{% end %} {% end %}
@ -129,109 +129,112 @@ 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 %}
{% layout_card(title="Oxford routines", sameheight=120) %}
<small>Oxford Ion-Trap Group routines</small>
<a href="https://github.com/OxfordIonTrapGroup/oitg" target="_blank" rel="noopener noreferrer">Repository</a>
{% end %}
{% layout_card(title="UCLA routines", sameheight=120) %}
<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>
{% end %}
{% layout_card(title="nvOS", sameheight=120) %}
<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>
{% end %}
{% layout_card(title="Haeffner Lab routines", sameheight=120) %}
<small>Haeffner Lab (Berkeley) routines</small>
<a href="https://github.com/HaeffnerLab/artiq-work-lattice" target="_blank" rel="noopener noreferrer">Repository</a>
{% end %}
{% layout_card(title="Birmingham examples", sameheight=120) %}
<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>
{% 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 %}
{% layout_card(title="Argent", sameheight=120) %}
<small>High-level sequence control interface for ARTIQ.</small>
<a href="https://github.com/robertfasano/argent" target="_blank" rel="noopener noreferrer">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 %}
{% layout_card(title="Oxford routines", sameheight=120) %}
<small>Oxford Ion-Trap Group routines</small>
<a href="https://github.com/OxfordIonTrapGroup/oitg" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %}
{% layout_card(title="ATOMIQ", sameheight=120) %}
<small>An abstraction layer to move hardware specific information into a configuration layer and enables working with generic software objects representing the actual hardware in the lab.</small>
<a href="https://thequantumlaend.de/2024/03/07/atomiq-our-convenience-layer-for-artiq-now-available/" target="_blank" rel="noopener noreferrer" itemprop="url">Announcement</a> | <a href="https://gitlab.com/atomiq-project/atomiq" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %}
{% layout_card(title="UCLA routines", sameheight=120) %}
<small>ARTIQ experiments in use at UCLA AMO</small>
<a href="https://github.com/EGGS-Experiment/LAX_exp" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %}
{% layout_card(title="nvOS", sameheight=120) %}
<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" itemprop="url">Repository</a>
{% end %}
{% layout_card(title="Haeffner Lab routines", sameheight=120) %}
<small>Haeffner Lab (Berkeley) routines</small>
<a href="https://github.com/HaeffnerLab/artiq-work-lattice" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %}
{% layout_card(title="Birmingham examples", sameheight=120) %}
<small>A repository of simple examples of ARTIQ code</small>
<a href="https://github.com/cnourshargh/Bham-ARTIQ-examples" target="_blank" rel="noopener noreferrer" itemprop="url">Repository</a>
{% end %}
{% layout_card(title="Argent", sameheight=120) %}
<small>High-level sequence control interface for ARTIQ.</small>
<a href="https://github.com/robertfasano/argent" 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>

View File

@ -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.

2763
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -8,45 +8,50 @@
"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", "start-dev": "npx webpack --watch --mode=development --devtool=inline-source-map",
"build-dev": "npx webpack --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"
]
}
} }
}] ]
] ]
} }
} }

View File

@ -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;

View File

@ -56,6 +56,13 @@
background-size: cover; background-size: cover;
} }
.card-featured {
background: #fff url("../images/fireworks-phone@2x.png") no-repeat top center;
background-size: contain;
}
.card-featured > div {
padding-top: 66.64%;
}
.card-artiq { .card-artiq {
background: #fff url("../images/artiq-phone@2x.png") no-repeat top center; background: #fff url("../images/artiq-phone@2x.png") no-repeat top center;
@ -107,10 +114,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;
} }
@ -118,6 +129,10 @@ img.kf25 {
// Small devices (landscape phones, 576px and up) // Small devices (landscape phones, 576px and up)
@media (min-width: 576px) { @media (min-width: 576px) {
.card-featured > div {
padding-top: 0;
}
.card-artiq > div { .card-artiq > div {
padding-top: 0; padding-top: 0;
} }
@ -209,6 +224,11 @@ img.kf25 {
box-shadow: 0 .5rem 1rem rgba(0,0,0,.15)!important; box-shadow: 0 .5rem 1rem rgba(0,0,0,.15)!important;
} }
.card-featured {
background: #fff url("../images/fireworks@2x.png") no-repeat top right;
}
.card-artiq { .card-artiq {
background: #fff url("../images/artiq@2x.png") no-repeat top right; background: #fff url("../images/artiq@2x.png") no-repeat top right;
} }

5
static/css/bootstrap-5.3.0.opt.css vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

View 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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 117 KiB

View File

@ -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);
});
});
}
})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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>
); );
} }

View File

@ -27,7 +27,7 @@ const count_item_occupied_hp = (item) => {
} }
const count_item_occupied_tec = (item) => { const count_item_occupied_tec = (item) => {
return (item.options_data && item.options_data.tec === false) ? 0 : (item.consumes && item.consumes.tec); 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 = {

View File

@ -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);
}; };

View File

@ -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>

View File

@ -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>
); );

View File

@ -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}/>

View File

@ -553,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) => {
@ -594,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) => {

View File

@ -51,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,
}}, }},
{ {
@ -129,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,
}},
]} ]}
], ],
@ -178,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."}},
{ {
@ -243,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,
@ -316,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},
], ],
@ -347,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": [
@ -457,7 +463,6 @@ const shop_data = {
} }
], ],
size: 'small', size: 'small',
type: null,
warnings: [ warnings: [
"no_eem_source" "no_eem_source"
], ],
@ -471,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.',
@ -549,7 +554,6 @@ const shop_data = {
} }
], ],
size: 'small', size: 'small',
type: null,
warnings: [ warnings: [
"no_eem_source" "no_eem_source"
], ],
@ -636,7 +640,6 @@ const shop_data = {
} }
], ],
size: 'small', size: 'small',
type: null,
warnings: [ warnings: [
"no_eem_source" "no_eem_source"
], ],
@ -700,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"
@ -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"
@ -816,7 +817,6 @@ const shop_data = {
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"
@ -846,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",
@ -871,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"
], ],
@ -886,33 +886,21 @@ const shop_data = {
name: 'HV Amplifier', name: 'HV Amplifier',
name_number: '5633', name_number: '5633',
name_codename: '', name_codename: '',
price: 1500, price: 1950,
image: '/images/shop/graphic-03_HVAMP32.svg', image: '/images/shop/graphic-03_HVAMP32.svg',
specs: [ specs: [
'Amplifier: LTC6090 or OPA462, 32 channels.', 'Amplifier: LTC6090, 32 channels.',
'Amplification range up to ±25V and ±55V available.', 'Output voltage: ±50V.',
'Over-temperature protection.', 'Over-temperature protection.',
'External 12V power supply.', 'External 12V power supply.',
'Slew rate 21V/us typical.', 'Slew rate 21V/us typical.',
'Bandwidth: 12MHz/gain, for ±25V range BW is 4.8MHz typical.', 'Bandwidth: 12MHz/gain, 2.4MHz typical.',
'The same connector as in Zotino and Fastino.' 'The same connector as in Zotino and Fastino.'
], ],
options: [
{type: "Radio",
args: {
title: "Amplification range",
outvar: "hvamp",
variants: ["±25V", "±55V"],
fallback: 0
}},
],
size: 'small', size: 'small',
warnings: [ warnings: [
"no_idc_source" "no_idc_source"
], ],
resources: [
{name: "idc", max: 4}
],
consumes: { consumes: {
hp: 4, hp: 4,
idc: 4 idc: 4
@ -930,8 +918,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"
], ],
@ -940,6 +929,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',
@ -950,8 +960,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}},
], ],
@ -982,6 +993,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"}},
{ {
@ -1008,7 +1021,6 @@ const shop_data = {
} }
], ],
size: 'big', size: 'big',
type: 'novo',
warnings: [ warnings: [
"no_eem_source" "no_eem_source"
], ],
@ -1035,7 +1047,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"
], ],
@ -1058,13 +1069,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",
@ -1105,7 +1117,6 @@ const shop_data = {
], ],
options_class: "stabilizer", options_class: "stabilizer",
size: 'small', size: 'small',
type: null,
warnings: [ warnings: [
"no_eem_source" "no_eem_source"
], ],
@ -1140,7 +1151,6 @@ const shop_data = {
], ],
options_class: "stabilizer", options_class: "stabilizer",
size: 'small', size: 'small',
type: null,
warnings: [ warnings: [
"no_eem_source" "no_eem_source"
], ],
@ -1164,13 +1174,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"
@ -1199,7 +1210,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"
@ -1229,7 +1239,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"
], ],
@ -1253,7 +1262,6 @@ const shop_data = {
'Can stabilize temperature of Sinara 5432 DAC or external devices containing TEC and thermistor.' 'Can stabilize temperature of Sinara 5432 DAC or external devices containing TEC and thermistor.'
], ],
size: 'small', size: 'small',
type: null,
consumes: { consumes: {
hp: 4 hp: 4
}, },
@ -1277,7 +1285,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"
@ -1312,13 +1319,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
} }
@ -1342,10 +1348,9 @@ 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',
type: null,
warnings: [], warnings: [],
consumes: { consumes: {
hp: 4, hp: 8,
}, },
}, },
'kirdy': { 'kirdy': {
@ -1356,14 +1361,15 @@ const shop_data = {
price: 1700, price: 1700,
image: '/images/shop/graphic-03_Kirdy.svg', image: '/images/shop/graphic-03_Kirdy.svg',
specs: [ specs: [
"Low noise precision laser diode driver: 300mA max output current with 20 bit resolution, 4V compliance voltage.", "Precision LD driver: 300mA max output current, 20-bit resolution, 4V compliance voltage.",
"High Frequency Bias-T modulation input.", "RMS noise 10Hz-1MHz: <200nA, density <300pA/√Hz.",
"Low Frequency modulation input (±1V max) with DC to 18MHz 3dB bandwidth and selectable modulation coefficient 0.25, 2.5 or 25mA/V.", "Low-frequency modulation input, DC-18MHz 3dB bandwidth, suitable for laser locks and linewidth reduction.",
"RMS noise (10Hz-1MHz): <200nA , current noise density: <300pA/√Hz at 1kHz.", "High-frequency Bias-T modulation input, suitable for PDH sideband generation.",
"0 - 2.5mA photodiode current monitoring.", "Monitor photodiode and LD protection.",
"TEC Controller: ±1A max output, 4V compliance, ±1mK stability.", "Temperature controller: ±1A max current, sub-mK stability.",
"100Base-T Ethernet with PoE.", "Full digital control and power over Ethernet.",
"1270-1610nm DFB laser sold separately (from USD 200.00)." "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: [ options: [
{type: "Line", args: {title: "IP", outvar: "ip", {type: "Line", args: {title: "IP", outvar: "ip",
@ -1420,6 +1426,7 @@ const shop_data = {
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', { name: 'Servos',

View File

@ -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);
}
});

View File

@ -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>

View File

@ -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,11 +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 -->
@ -54,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">
@ -84,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>
@ -97,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 %}
@ -126,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 %}
@ -156,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 &copy; <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 &copy; <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 %}
@ -182,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>
@ -200,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>

View File

@ -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@{{get_env(name="DOMAINNAME", default="m-labs.hk")}}">sales@{{get_env(name="DOMAINNAME", default="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@{{get_env(name="DOMAINNAME", default="m-labs.hk")}}">helpdesk@{{get_env(name="DOMAINNAME", default="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>

View File

@ -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,51 @@
<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-featured">
<div class="col-12 col-md-6 ps-0 pe-0">
<h5 class="card-title" itemprop="headline">News</h5>
<div class="desc-wrapper" itemprop="description">
<p class="card-text pt-3">
The Sinara 1550 Kirdy is a laser diode driver which combines a low-noise current source and a precision temperature controller. In combination with Fast-Servo, it can lock lasers to spectral lines and reference cavities. See <a href="docs/kirdybrochure.pdf">the brochure</a>.
</p>
<p class="card-text pt-3">
The world's <a href="https://www.ox.ac.uk/news/2025-02-06-first-distributed-quantum-algorithm-brings-quantum-supercomputers-closer">first distributed quantum algorithm experiment</a> was performed at Oxford University using ARTIQ. See <a href="https://www.nature.com/articles/s41586-024-08404-x">the paper</a>.
</p>
<p class="card-text pt-3">
The Sinara 5716 Shuttler is a 16-channel 125MSPS 14-bit DAC optimized for trapped ion shuttling. More information in the <a href="https://forum.m-labs.hk/d/745-artiq-8-released">ARTIQ-8 release announcement</a>.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row pb-5">
<div class="col-12">
<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 +89,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 +141,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 +174,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 +190,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>

View File

@ -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 %}

View File

@ -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;

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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>

View File

@ -1,5 +0,0 @@
<div class="{% if css %}{{ css }}{% else %}row d-flex align-items-center mt-5 mb-5{% endif %}">
{{ body | safe }}
</div>