### old
- [x] verify/fix the JP marquee spacing
- [x] update EN marquee spacing
- [x] update the scan confirmation email to de-emphasize IPD value (in Postmark)
- [x] create the email sections metaobject definition - fields:
  - [x] `condition` list of variants
  - [x] `header` single line text
  - [x] `text` multiline text
- [x] figure out if changing the section order under the metaobject is sufficient, or do we need to define order elsewhere (another metaobject?)
- [x] migrate all the existing email text to **email sections** instances
- [x] backup the existing email text locally
- [x] Prep & print rigid 10k part
- [x] iPhone 11 store - cart too short
- [x] iPhone 11 store - trashcan icon invisible (white?)
- [x] all platforms store - Spacing of cart subtotal, delivery etc. in short windows
- [x] ensure the "order now" btn cannot be clicked more than once in succession
    - [x] not really an issue
- [x] Fix "Added" button state not returning after changing model to and from
- [x] ~~add a BigData var `product.inCart`~~ it exists
    - [x] ended up needing to fix a bug where **loadEgCartDrawer()** was meant to update this, but failed for addon parents and addons
- [x] add `product.qty_count_products` rule for "order now" btn showing "Added"
    - [x] accepts product list
    - [x] populate into builder
    - [x] integrate with qtyInCart rescope code
- [x] update cart features to incorporate the above
    - [x] include the qty_count_products IDs among counted variant IDs
    - [x] store product IDs as data in the cart-item elements
    - [x] update BigData.product.inCart via **loadEgCartDrawer()**
    - [x] update **initCartDrawerRemoveButtons()**
- [x] update cart qty selectors (EgCart liquid) to incorporate the above
- [x] make addons render as normal line items IF their parent vid isn't a valid line item
- [x] add support for `no-buy` product tag. redirects product page to store home
- [x] Finish implementing the `non-shopify` model in Builder
    - [x] Figure out why all the builder stuff loads twice
    - [x] Transfer all live pages to the model
        - [x] /nspages/home
        - [x] /nspages/about
        - [x] /nspages/displays
        - [x] /nspages/experiences
        - [x] /nspages/myaudiostrap
        - [x] /nspages/mybeyond
        - [x] /nspages/hardwareterms
        - [x] /nspages/warranty
        - [x] /nspages/software
        - [x] /nspages/create
        - [x] /nspages/eyetracking
        - [x] /nspages/giveaway
        - [x] Use .builder.json download and upload
        - [x] Make sure the new path becomes a `/nspages/` version of its former `/pages/` self
    - [x] Fully test all live pages on `dev-website` to ensure it all functions as expected
    - [x] PR, merge, and build the `dev` changes to `main` to make it all live
- [x] iOS: Nav menu sometimes appears stuck open
- [x] iPhone 11 homepage - crashing sometimes (load scroll images differently? only load for desktop breakpoint?)
    - [x] arrange lazy loading for all page videos (maybe mobile only)
- [x] ~~"Fix" iOS variant model not being selected by default~~ Update: seemingly not an issue anymore
- [x] New product page features
    - [x] `selector_class` (could then target the class for CSS styling)
    - [x] `selector_svg` for the little vrc icon (maybe not—see what we can do with just class)
- [x] Ensure addons in a group with `.spotlight_images == true` also trigger spotlighting for the default (or first selected) addon, when switching product variant 
  - Note: This wasn't relevant as variant model selection already had an existing spotlighting feature.

### hardwear
- [x] Test utility handling of interrupted ET FW update
- [x] Ensure DVT-2 ET unit is built for, shipped to Jack
- [x] Create smol patch for Tupper to update his unit's SN
- [x] Look into the issues Jonny mentioned

### web on hold
- [ ] order confirmation email stuff...
    - [ ] dynamic shipping date near the bottom of the order conf email
    - [ ] set up the liquid for the dynamic order email system
- [x] add back the compatibility and press sections (as symbols?)

### web
- [x] Add a `variant.metafield.ghost_handle` boolean. If true, the variant is fully ommitted from population unto the product page. *Would give me time to populate and adjust variant details before making it visible on the storefront.*
    - Note: Postponed until really needed.
- [ ] VRChat code distribution system
    - [ ] Use same Klaviyo API as ET token flow
    - [ ] Identify eligible accounts using shopify segment?
- [ ] Combo product image system
    - [ ] `product variant`
        - [ ] **store.combo_image_group** - Takes an `image_groups` metaobject
        - [ ] **store.combo_image_key** - String that should exist in any image which shows for this specific variant. Leave blank for this variant to feature no combo images.
    - [ ] `addon variant`
        - [ ] **addon.combo_image_key** - String that should exist in any image which shows for a product with this addon selected. Leave blank, and this addon will not influence the combo image.
    - [x] `addon group`


### web bugs to fix
- [ ] iOS Safari - Page starts with no model selected
    - [ ] And/or: purchase btn should be disabled until model is selected
- [ ] iPhone 11 homepage - small logo (can't repro?)
- [ ] Exclamation mark earmark not showing for backordered merch (products without `ignore-available` tag)
- [ ] Fix vertical centeredness of logo (currently is 28px top, 38px bottom --> shift down 5px)
- [ ] Work on getting shipping milestones to work with JP text
    - [ ] Is the metaobject already/can we make it translatable?

### eyetracking
- [ ] **login method plan**
    - [x] Figure out where to store ET API environment variables.
        - hardcode 'em
    - [ ] Figure out TS code needed to make the ET API call
    - [ ] Merge & build the API with ET changes & test using ipynb
    - [ ] Finish, merge, & build website ET changes & test the special login process
    - [ ] Revise web ET code to redirect to the custom URI
    - [ ] Test the full implementation
- [x] Check out Klaviyo and identify stuff
    - [x] Can there be a repeatable flow that doesn't sent to any single customer more than once
    - [x] Can flows leverage arbitrary API calls
- [x] If Klaviyo is effective, create and experiment with test flow to confirm functional
- [x] Create a new ET segment based on the current one, but which doesn't exclude based on campaigns sent or tokens assigned
    - This new segment i.e. `Fulfilled ET Orders (No Wave 1 Token)` will be used by **the Code function** to assign tokens
    - The og `Tokenless ET Orders (Has Wave 1 Populated)` segment will be used by **the campaign** to ensure it is not sent more than once
- [x] Complete the "assign eyetracking token" function. **Requirements:**
    - [x] Set up only reacting to the event on a specific list (i.e. Brandon Test)
    - [x] Set up getting new token from the ET API
    - [x] Assign custom profile property `et_token` the new token value
    - [x] Assign custom profile property `token_wave` the value **1**
        - [x] Add ^^^ as a filter on the segment (exclude where `profile.token_wave == 1`)
    - [x] Test it in Code
- [x] Draft the campaign, being sure to populate key string from `person.et_token`
    - [x] Test campaign, using the above test segment
- [ ] Create a **x** qty sample of the `Tokenless ET Orders (Has Wave 1 Populated)` segment
- [ ] Refine the campaign to a final draft
    - [ ] Revise the campaign target to aforementioned segment
    - [ ] ***Blast off?!?!?!?***
- [ ] Get ET client to where it accepts the custom URI, replaces running client
    - [ ] Ensure it populates and stores username & token
    - [ ] Test to ensure custom URI working as expected

### calibot
- [x] Add cal version to the config JSON write
- [x] Research, validate, & add clearing of old USB devices
- [x] Test updated cal parameters on orange shell, then purple shell units